Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATxMEGA и EERPOM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Navovvol
Пытаюсь написать подпрограммы записи и чтения внутренней EEPROM на асме
Нифига не получается, не могу понять почему.
Вот что сказано в даташите:

30.11.5.1. Загрузка страничного буфера EEPROM

Данная команда предназначена для записи одного байта в страничный буфер EEPROM.

Запишите в регистр NVM CMD команду загрузки страничного буфера EEPROM
Запишите в регистр NVM ADDR0 адрес, по которому выполняется запись.
Запишите в регистр NVM DATA0 данные, подлежащие записи. Это приведет к запуску исполнения команды.

30.11.5.4. Запись страницы EEPROM

Данная команда предназначена для записи загруженного страничного буфера EEPROM в одну страницу EEPROM. Запись выполняется только тех ячеек, которые предварительно были загружены в страничный буфер EEPROM.

Запишите в регистр NVM CMD команду записи страницы EEPROM.
Запишите в регистр NVM ADDR адрес подлежащей записи страницы EEPROM.
Установите бит CMDEX в регистре NVM CTRLA с использованием привязанной ко времени последовательности CCP.

Флаг BUSY регистра NVM STATUS равен единице вплоть до завершения операции.


И вот что я нагородил :

Код
.macro stsi     ; Запись в порт IO
       ldi r16,@1
       sts @0,r16
.endm

stsi NVM_CMD,0x33
stsi NVM_ADDR0,0
stsi NVM_DATA0,0b10101010

stsi NVM_ADDR0,0
stsi NVM_CMD,0x34
stsi CPU_CCP,0xD8
stsi NVM_CTRLA,1


после этого устанавливается флаг NVMBUSY, когда он снимается жму ALT+6 смотрю на EEPROM и DATA MAPPED_EEPROM, там везде FF. Че не так делаю ?
Юрий_СВ
Делаю так :
(предварительно включаю отображение EEPROM на пространство памяти)
Код
void x_EEPROM_Write_Byte(unsigned char * adr, unsigned char data)
{
asm volatile("cli\n\t"::);
while ((NVM.STATUS & NVM_NVMBUSY_bm) == NVM_NVMBUSY_bm);
*(unsigned char*)((unsigned int)adr+EEPROM_START_ADR)=data;
NVM.CMD=0x35;   //
NVM.ADDR0=adr;
NVM.ADDR1=((unsigned int)adr)>>8;
NVM.ADDR2=0;
CPU_CCP=0xd8;   //
NVM.CTRLA=0x01; // CMDEX
while ((NVM.STATUS & NVM_NVMBUSY_bm) == NVM_NVMBUSY_bm);
NVM.CMD=0x00;
asm volatile("sei\n\t"::);
}

Navovvol
Цитата(Юрий_СВ @ Oct 13 2011, 17:05) *
Делаю так :
(предварительно включаю отображение EEPROM на пространство памяти)

Это как ? где ? в АВР студио 5 ?
посмотрел ваш код (не пробовал). Вы используете команду 0х35 -стирание и запись страницы, а что он записывает ? регистры DATA ? или буфер, который хз где.
Юрий_СВ
Цитата(Navovvol @ Oct 13 2011, 16:22) *
Это как ? где ? в АВР студио 5 ?

NVM.CTRLB=0x0b;
(влияет только на способ чтения/записи данных - через регистр DATA или через запись по адресу памяти)
Цитата(Navovvol @ Oct 13 2011, 16:22) *
Вы используете команду 0х35 -стирание и запись страницы, а что он записывает ? регистры DATA ? или буфер, который хз где.

Он записывает только ту часть буфера, которая была изменена.
Цитата
EEPROM page buffer locations that are loaded will get tagged by the NVM Controller. During a
page write or page erase, only target locations will be written or erased. Locations that are not
target, will not be written or erased, and the corresponding EEPROM location will remain
unchanged. This means that also before an EEPROM page erase, data must be loaded to the
selected page buffer location to tag them. If the data in the page buffer is not going to be written
afterword, the actual values in the buffer does matter.
_Артём_
Цитата(Юрий_СВ @ Oct 13 2011, 16:44) *
NVM.CTRLB=0x0b;
(влияет только на способ чтения/записи данных - через регистр DATA или через запись по адресу памяти)

Он записывает только ту часть буфера, которая была изменена.


Проблема может ещё быть в ревизии кристала:
у первых версий были проблемы с записью в EEPROM и FLASH - запись организовывалась с использованием прерываний и sleep-а.
Юрий_СВ
Цитата(_Артём_ @ Oct 13 2011, 16:56) *
Проблема может ещё быть в ревизии кристала:
у первых версий были проблемы с записью в EEPROM и FLASH - запись организовывалась с использованием прерываний и sleep-а.

Не знаю, в Errata ничего подобного нет.
Моя функция на хМега32А работает.
Единственное умоминание про EEPROM в Errata :
(у моей функции не должно с этим возникнуть трудностей)
Цитата
15. EEPROM page buffer always written when NVM DATA0 is written
If the EEPROM is memory mapped, writing to NVM DATA0 will corrupt data in the EEPROM
page buffer.
Problem fix/Workaround
Before writing to NVM DATA0, for example when doing software CRC or flash page buffer
write, check if EEPROM page buffer active loading flag (EELOAD) is set. Do not write NVM
DATA0 when EELOAD is set.
_Артём_
Цитата(Юрий_СВ @ Oct 13 2011, 17:13) *
Не знаю, в Errata ничего подобного нет.
Моя функция на хМега32А работает.
Единственное умоминание про EEPROM в Errata :
(у моей функции не должно с этим возникнуть трудностей)


Из datasheet rev. B XMega128/192/...A3:
Цитата
19. Writing EEPROM or Flash while reading any of them will not work
The EEPROM and Flash cannot be written while reading EEPROM or Flash, or while exe-
cuting code in Active mode.
Problem fix/Workaround
Enter IDLE sleep mode within 2.5 µs (Five 2 MHz clock cycles and 80 32 MHz clock cycles)
after starting an EEPROM or flash write operation. Wake-up source must either be
EEPROM ready or NVM ready interrupt. Alternatively set up a Timer/Counter to give an
overflow interrupt 7 ms after the erase or write operation has started, or 13 ms after atomic
erase-and-write operation has started, and then enter IDLE sleep mode.


Юрий_СВ
Цитата(_Артём_ @ Oct 13 2011, 18:11) *
Из datasheet rev. B XMega128/192/...A3:

Ага, спасибо. В историю не заглядывал...
Navovvol
Я запускал только в симуляторе. Всё это дело пишется для AtXMEGA128A1. Буфер EEPROM - это "DATA MAPPED_EEPROM" ?
Юрий_СВ
Цитата(Navovvol @ Oct 13 2011, 19:53) *
Я запускал только в симуляторе. Всё это дело пишется для AtXMEGA128A1. Буфер EEPROM - это "DATA MAPPED_EEPROM" ?

По идее, "DATA MAPPED_EEPROM" - это EEPROM режиме отображения на пространство памяти.
Navovvol
Цитата(_Артём_ @ Oct 13 2011, 17:56) *
Проблема может ещё быть в ревизии кристала:
у первых версий были проблемы с записью в EEPROM и FLASH - запись организовывалась с использованием прерываний и sleep-а.

В даташите, errata на две ревизии rev.H и rev.G
На контроллере, который я использую rev.A, а где для него errata? всё облазил, нигде не нашел.
Navovvol
А в симуляторе AVR Studio 5 для AtXmega вообще возможно посмотреть содержимое EEPROM ? или там всегда FF ? И нет в проекте файла .eep ,так должно быть ?
На данный момент в симуляторе не удается ни прочитать, ни записать. Не пойму, что не так.
_Артём_
Цитата(Navovvol @ Oct 14 2011, 08:44) *
В даташите, errata на две ревизии rev.H и rev.G
На контроллере, который я использую rev.A, а где для него errata? всё облазил, нигде не нашел.


Посмотрел datasheet. Действительно для A1 только равизии H и G.
Вы уверенны, что правильно ревизию определили?

Цитата
А в симуляторе AVR Studio 5 для AtXmega вообще возможно посмотреть содержимое EEPROM ? или там всегда FF ? И нет в проекте файла .eep ,так должно быть ?
На данный момент в симуляторе не удается ни прочитать, ни записать. Не пойму, что не так.


В симуляторе EEPROM показывает. FF не всегда(значит незапрограммирована)

Цитата
На данный момент в симуляторе не удается ни прочитать, ни записать. Не пойму, что не так.


В симуляторе всё работало. Проверял по соотв. AppN.

Navovvol
Цитата(_Артём_ @ Oct 14 2011, 15:55) *
Посмотрел datasheet. Действительно для A1 только равизии H и G.
Вы уверенны, что правильно ревизию определили?

Olimex'овская плата, на ней так и написано rev.A
Цитата
В симуляторе всё работало. Проверял по соотв. AppN.

AVR1315 ?
_Артём_
Цитата(Navovvol @ Oct 14 2011, 15:17) *
Olimex'овская плата, на ней так и написано rev.A


Это типа как на заборе...
Ревизия платы или Меги?

Цитата(Navovvol @ Oct 14 2011, 15:17) *
AVR1315 ?


Да, оно самое.
Navovvol
Цитата(_Артём_ @ Oct 14 2011, 16:40) *
Это типа как на заборе...
Ревизия платы или Меги?

Что-то я не подумал, что это могла быть ревизия платы )))
А где обычно указывается ревизия ?
Да и дело не в ревизии. Просто в симуляторе MAPPED_EEPROM и EEPROM не хотят изменяться программно (только если самому редактировать) да и считываться тоже. И вообще в проекте не создается файл .eep (галочка Generate Files напротив .eep стоит)
У меня складывается впечатление, что в AVR Studio 5 EEPROM вообще не симулируется
_Артём_
Цитата(Navovvol @ Oct 16 2011, 18:58) *
Что-то я не подумал, что это могла быть ревизия платы )))
А где обычно указывается ревизия ?
Да и дело не в ревизии. Просто в симуляторе MAPPED_EEPROM и EEPROM не хотят изменяться программно (только если самому редактировать) да и считываться тоже. И вообще в проекте не создается файл .eep (галочка Generate Files напротив .eep стоит)
У меня складывается впечатление, что в AVR Studio 5 EEPROM вообще не симулируется

Вроде JTAG-ом считать можно.

Цитата(Navovvol @ Oct 16 2011, 18:58) *
У меня складывается впечатление, что в AVR Studio 5 EEPROM вообще не симулируется


Может быть 5 и не симулирует.
4-я вроде симулировала.


Navovvol
Цитата(_Артём_ @ Oct 16 2011, 23:01) *
Вроде JTAG-ом считать можно.
Может быть 5 и не симулирует.
4-я вроде симулировала.

4-ая версия не поддерживает AtXmega.
вот что нарыл в хелпе студии

XMEGA devices

Writing/erasing FLASH (using SPM) and EEPROM from application not yet implemented in ATxmega devices (#7611)

Simulation is slow compared to other devices.


_Артём_
Цитата(Navovvol @ Oct 17 2011, 13:13) *
4-ая версия не поддерживает AtXmega.
вот что нарыл в хелпе студии

XMEGA devices

Writing/erasing FLASH (using SPM) and EEPROM from application not yet implemented in ATxmega devices (#7611)

Simulation is slow compared to other devices.




Да точно, поддерживается только для JTAGICE и тп.
Но важнее версия кристалла.
Смотрите в ApN: их правда не одна версия -
более ранняя -- правильная (в соотв. с описанием), но раннии xmeg-и так писать не умели,
болеее поздняя - с прерываниями sleep-ами и прочей вредной хигнёй, но так писать умеет даже xmeg-и ревизии 0 (но наверно не всеми разрекламированными способами - все не проверял).

Так что нужно проверять в железе и с учётом версии xMega.
Юрий_СВ
По идее, считать ревизию контроллера можно чем угодно, а не только JTAG.

Можно попытаться вывести на порт.
Находится она в MCU.REVID (младшие 4 бита).
0-ревизия A, 1 - B, ... и т.д.
_Артём_
Цитата(Юрий_СВ @ Oct 17 2011, 21:13) *
По идее, считать ревизию контроллера можно чем угодно, а не только JTAG.

Можно попытаться вывести на порт.
Находится она в MCU.REVID (младшие 4 бита).
0-ревизия A, 1 - B, ... и т.д.


Да, Вы совершенно правы... проще чем два байта переслать - всего один байт:
Код
#include "usart_driver.h"

// USARTE0, 9600, 2 MHz
PORTE.DIRSET=(1<<3);
USART_Format_Set(&USARTE0, USART_CHSIZE_8BIT_gc, USART_PMODE_DISABLED_gc, 0);
USART_Tx_Enable(&USARTE0);
USART_SetMode(&USARTE0, 0);
unsigned short uart_divider;
uart_divider=2000000/16/9600/4-1;
USART_Baudrate_Set(&USARTE0, uart_divider, 0);
unsigned char i=MCU.REVID&15;
USART_PutChar(&USARTE0, i+'A');


Что-то типа такого...
Navovvol
Считал REV.H через JTAG. ))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.