|
XMega, EEPROM, NVM, разъясните плиз |
|
|
|
Sep 2 2012, 18:07
|
Гуру
     
Группа: Свой
Сообщений: 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 там тоже упоминалась.
|
|
|
|
|
Sep 2 2012, 18:59
|
Гуру
     
Группа: Свой
Сообщений: 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 писать... Надо в жеезе испытать - инересно что и куда запишется.
|
|
|
|
|
Sep 2 2012, 19:48
|

Гуру
     
Группа: Свой
Сообщений: 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 будет ли в обоих случаях записана нулевая страница?
|
|
|
|
|
Sep 2 2012, 20:11
|
Гуру
     
Группа: Свой
Сообщений: 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?
|
|
|
|
|
Sep 2 2012, 20:36
|

Гуру
     
Группа: Свой
Сообщений: 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? Речь о еепром. Понятно что они что то изображают и даже понятно что изображают, но зачем они это изображают? видать какой то тайный смысл в этом есть.
|
|
|
|
|
Sep 2 2012, 20:44
|
Гуру
     
Группа: Свой
Сообщений: 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)  но зачем они это изображают? видать какой то тайный смысл в этом есть. Не вижу особого смысла в этом "изображении". Так они сделали.
|
|
|
|
|
Sep 2 2012, 22:18
|

Гуру
     
Группа: Свой
Сообщений: 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 ? А на асме случайно нет примеров???
|
|
|
|
|
Sep 2 2012, 22:38
|
Гуру
     
Группа: Свой
Сообщений: 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)  А на асме случайно нет примеров??? Есть...почти: запускается проект на отладку и открывается окно дисасемблера. Ну, тоже вариант.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|