реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> XMega, EEPROM, NVM, разъясните плиз
zombi
сообщение Sep 2 2012, 13:34
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Снова разбираюсь с еепром хмеги(128A).
Возникло несколько вопросов:

1. Для чего придумали NVM контроллер (чем не устроил подход как в обычных мегах)?
только лишь для паралельной записи страницы? или еще какие цели преследовались?

2. Если включён режим отображения еепром в области данных (0x1000:0x17FF) то, поскольку страница = 32 байта,
запись по адресам 0х1000 и 0х1020 приведёт к абсолютно одинаковому результату : записи по нулевому адресу страничного буфера еепром?
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 2 2012, 14:03
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



2. Если за 1 раз будете писать не более 32 байт, то запись в эти адреса приведет к разным результатам. Кроме того, учтите, что в полной мере работа EEPROM в режиме отображения на память поддерживается только при чтении. При записи это всего лишь заполнение буфера страницы, после которого надо давать в NVM команду записи.

1. Одна из причин введения специализированного NVM - как раз введение режима отображения на память. Но там их (причин) наверняка больше. Возможно, вторая - некоторая унификация процедур работы с EEPROM и с памятью программ.

Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 2 2012, 16:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(V_G @ Sep 2 2012, 17:03) *
2. Если за 1 раз будете писать не более 32 байт, то запись в эти адреса приведет к разным результатам. Кроме того, учтите, что в полной мере работа EEPROM в режиме отображения на память поддерживается только при чтении. При записи это всего лишь заполнение буфера страницы, после которого надо давать в NVM команду записи.

Похоже я не совсем понимаю что из себя представляет страничный буфер еепром.
Это просто один массив из 32-х байт с адресами оных 0x00-0x1F или это N массивов по 32 байта для каждой страницы или нечто другое???
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 18:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Sep 2 2012, 19:51) *
Это просто один массив из 32-х байт с адресами оных 0x00-0x1F или это N массивов по 32 байта для каждой страницы или нечто другое???

Один буфер на всю eeprom. Очень похоже на страничный буфер flash-памяти в мегаАВР.
Подробности можно посмотреть в AVR1315 (doc8066.pdf).

Цитата
1. Для чего придумали NVM контроллер (чем не устроил подход как в обычных мегах)?
только лишь для паралельной записи страницы? или еще какие цели преследовались?

Ещё фича - чтение eeprom с помощью DMA.


PS. Не забуьте про ерату и ревизию - eeprom там тоже упоминалась.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 2 2012, 18:15
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ Sep 2 2012, 21:07) *
Один буфер на всю eeprom.

А почему тогда запись по адресам 0х1000 и 0х1020, как утвеждает V_G, дадут разный результат?

Цитата(_Артём_ @ Sep 2 2012, 21:07) *
PS. Не забуьте про ерату и ревизию - eeprom там тоже упоминалась.

До ерраты пока далеко, надо пока вообще с принципом разобраться.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 18:59
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата
запись по адресам 0х1000 и 0х1020 приведёт к абсолютно одинаковому результату

Логика в этом предположении есть, но зачем использовать такой режим? Он как бы не рекомендован и соответственно неизвестно, как будет работать.

Цитата( @ Sep 2 2012, 21:15) *
А почему тогда запись по адресам 0х1000 и 0х1020, как утвеждает V_G, дадут разный результат?

Может V_G проверял?
Мне сейчас проверить не начем, а симулятор чето не хочет eeprom писать...
Надо в жеезе испытать - инересно что и куда запишется.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 2 2012, 19:48
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ Sep 2 2012, 21:59) *
Логика в этом предположении есть, но зачем использовать такой режим? Он как бы не рекомендован и соответственно неизвестно, как будет работать.

Не рекомендован??? где конкретно в DS это не рекомендуют? ну или хотябы где рекомендуют писать только по адресам 0x1000-0x101F.

Цитата(_Артём_ @ Sep 2 2012, 21:59) *
Может V_G проверял?
Мне сейчас проверить не начем, а симулятор чето не хочет eeprom писать...
Надо в жеезе испытать - инересно что и куда запишется.

Проверять буду позже. Пока хочу досконально понять хотябы то что в DS написано.

И попутно вопросы:
В "AVR1315" сказано что повторная запись по одному и томуже адресу страничного буфера еепром выглядит как логическое И содержимого и записываемого.
Интересно зачем так сделано если буфер это вроде как обычное озу?
С еепром понятно, там ноль жжётся, а с буфером то зачем?

Если выполнить команду записи страницы еепром с NVM_ADDR2..0 = 0х000000 или 0х00001F будет ли в обоих случаях записана нулевая страница?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 20:11
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Sep 2 2012, 22:48) *
Не рекомендован??? где конкретно в DS это не рекомендуют? ну или хотябы где рекомендуют писать только по адресам 0x1000-0x101F.

Про 0x1000-0x101F ничего не скажу...
Вот из AVR1315
Цитата
The necessary steps to perform an atomic write using memory-mapped access is as
follows:
1. Wait for any pervious NVM operations to finish.
2. Load page buffer by writing directly to data space, while staying inside one
EEPROM page
.

D примере, идущем с апнотой, несколько раз повторяется, что данные должны быть в пределах одной страницы.

Цитата(zombi @ Sep 2 2012, 22:48) *
В DS сказано что повторная запись по одному и томуже адресу страничного буфера еепром выглядит как логическое И содержимого и записываемого.
Интересно зачем так сделано если буфер это вроде как обычное озу?

Наверно подобие flash изображают...буфер оно конечно озу, но flash-то не озу.


Цитата(zombi @ Sep 2 2012, 22:48) *
Если выполнить команду записи страницы еепром с NVM_ADDR2..0 = 0х000000 или 0х00001F будет ли в обоих случаях записана нулевая страница?

Почему должна быть нулевая страница? Сколько у вас станиц всего? 32 или 64?
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 2 2012, 20:36
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ Sep 2 2012, 23:11) *
Почему должна быть нулевая страница? Сколько у вас станиц всего? 32 или 64?

Всего 64 страницы по 32 байта.
Что нужно записать в NVM_ADDR2..0 для записи буфера в 0-ю, 1-ю и т.д. страницу?


Цитата(_Артём_ @ Sep 2 2012, 23:11) *
Наверно подобие flash изображают...буфер оно конечно озу, но flash-то не озу.

И причём здесь flash? Речь о еепром.
Понятно что они что то изображают и даже понятно что изображают, но зачем они это изображают? видать какой то тайный смысл в этом есть.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 20:44
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Sep 2 2012, 23:21) *
Что нужно записать в NVM_ADDR2..0 для записи буфера в 0-ю, 1-ю и т.д. страницу?

Любой адрес в пределах страницы(если я правильно понял):

Цитата
/*! This function writes the contents of an already loaded EEPROM page
* buffer into EEPROM memory. As the lower part of the address is used
* to address the buffer, while the upper part addresses a page in
* EEPROM, the address parameter can refer to any EEPROM address within
* the page you want to program.
*
* As this is an atomic write, the page in EEPROM will be erased
* automatically before writing. Note that only the page buffer locations
* that have been loaded will be used when writing to EEPROM. Page buffer
* locations that have not been loaded will be left untouched in EEPROM.
*
* \param address Address to any byte within desired EEPROM page.
*/
void EEPROM_AtomicWritePage( uint16_t address )


Цитата(zombi @ Sep 2 2012, 23:36) *
И причём здесь flash? Речь о еепром.

Опечатался...конечно eeprom.

Цитата(zombi @ Sep 2 2012, 23:36) *
но зачем они это изображают? видать какой то тайный смысл в этом есть.

Не вижу особого смысла в этом "изображении".
Так они сделали.
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 2 2012, 20:48
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ Sep 2 2012, 23:37) *
Любой адрес в пределах страницы(если я правильно понял):

Cовсем я запутался wacko.gif
Можно конкретней, что должно быть в NVM_ADDR2..0 для записи НУЛЕВОЙ страницы еепром (в случае отображения еепром в область данных с адреса 0x1000)?
любой из 0x000000-0x00001F или любой из 0x001000-0x00101F ?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 21:07
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Sep 2 2012, 23:48) *
Можно конкретней, что должно быть в NVM_ADDR2..0 для записи НУЛЕВОЙ страницы еепром (в случае отображения еепром в область данных с адреса 0x1000)?
любой из 0x000000-0x00001F или любой из 0x001000-0x00101F ?

Судя по их примерам - 0x000000-0x00001F
Код
#define TEST_ADDR_1 1
// ***
// Now write and read two bytes using memory mapped access.
// ***
EEPROM_EnableMapping();
    
// Write bytes.
EEPROM_WaitForNVM(); // No need to flush, but we need to wait.
EEPROM(TEST_ADDR_1) = TEST_BYTE_1;
EEPROM_AtomicWritePage( TEST_ADDR_1 );
EEPROM_WaitForNVM();
Go to the top of the page
 
+Quote Post
zombi
сообщение Sep 2 2012, 22:18
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата(_Артём_ @ Sep 3 2012, 00:07) *
Судя по их примерам - 0x000000-0x00001F
Код
#define TEST_ADDR_1 1
// ***
// Now write and read two bytes using memory mapped access.
// ***
EEPROM_EnableMapping();
    
// Write bytes.
EEPROM_WaitForNVM(); // No need to flush, but we need to wait.
EEPROM(TEST_ADDR_1) = TEST_BYTE_1;
EEPROM_AtomicWritePage( TEST_ADDR_1 );
EEPROM_WaitForNVM();


Я,к сожалению, в СИ не силён. Но вот это из EEPROM_DRIVER.H
Код
#define MAPPED_EEPROM_START 0x1000
#define EEPROM_PAGESIZE 32
#define EEPROM(_pageAddr, _byteAddr) \
    ((uint8_t *) MAPPED_EEPROM_START)[_pageAddr*EEPROM_PAGESIZE + _byteAddr]

не означает ли что всётаки любой из 0x001000-0x00101F ?

А на асме случайно нет примеров???
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Sep 2 2012, 22:38
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(zombi @ Sep 3 2012, 01:18) *
Я,к сожалению, в СИ не силён.

к сожалению...но сильным быть-то и не надо, самую малость понимать уже хватило бы.

Цитата(zombi @ Sep 3 2012, 01:18) *
Код
#define MAPPED_EEPROM_START 0x1000
#define EEPROM_PAGESIZE 32
#define EEPROM(_pageAddr, _byteAddr) \
    ((uint8_t *) MAPPED_EEPROM_START)[_pageAddr*EEPROM_PAGESIZE + _byteAddr]

не означает ли что всётаки любой из 0x001000-0x00101F ?


Тут какой-то другой случай - параметров у макроса 2 (номер страницы и намер байта на старнице).

А для доступа как к ОЗУ используется EEPROM(addr):
Код
// из EEPROM_DRIVER.H
#define MAPPED_EEPROM_START 0x1000
#define EEPROM(_address) ((uint8_t *) EEPROM_START)[_address]


EEPROM(TEST_ADDR_1) = TEST_BYTE_1;

EEPROM(TEST_ADDR_1) = TEST_BYTE_1; - это обращение(запись) к EEPROM как к ОЗУ по адресу (0x1000+TEST_ADDR_1)
А запись вот:
Код
EEPROM_AtomicWritePage( TEST_ADDR_1 );

- используется адрес не (0x1000+TEST_ADDR_1), а TEST_ADDR_1 - равный в примере 1

Цитата(zombi @ Sep 3 2012, 01:18) *
А на асме случайно нет примеров???

Есть...почти: запускается проект на отладку и открывается окно дисасемблера. Ну, тоже вариант.
Go to the top of the page
 
+Quote Post
V_G
сообщение Sep 3 2012, 02:32
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(_Артём_ @ Sep 3 2012, 04:59) *
Может V_G проверял?

Конечно, у меня и запись и чтение идут в этом режиме. Особенность в том, что старший байт адреса (и старшие 3 бита младшего байта) сохраняются как адрес страницы, а младшие 5 бит определяют адрес в страничном буфере.
После команды записи содержимое страничного буфера программируется в разные места EEPROM в зависимости от содержимого старших разрядов адреса.

Как это делается на Си, не разбирался, т.к. под АВР пишу на ассемблере
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 12:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01501 секунд с 7
ELECTRONIX ©2004-2016