AVR單片機(jī)內(nèi)部EEPROM應(yīng)用方法
AVR單片機(jī)內(nèi)部集成了EEPROM,但是在GCC寫編寫EEPROM應(yīng)用程序的時候,經(jīng)常會出現(xiàn)讀寫EEPROM時程序出錯,或重啟等不正?,F(xiàn)象。在軟件仿真時也許結(jié)果是正確的,但是在片上運行的時候就不正常。困擾很久,終于發(fā)現(xiàn)原因在于編譯器,已經(jīng)我們對EEPROM操作說明的理解不正確或不仔細(xì)。
操作EEPROM對時序的要求較高。更加Datasheet里的寫操作范例程序:
while(EECR & (1<
EEAR = address; //設(shè)置地址和數(shù)據(jù)寄存器
EEDR = data;
EECR |= (1
EECR |= (1<
以上代碼在GCC中的編譯結(jié)果,發(fā)現(xiàn) EECR |= (1<
while(EECR & (1<
EEAR = address; //設(shè)置地址和數(shù)據(jù)寄存器
EEDR = data;
asm volatile("SBI 0x1C,2 \n\t");
asm volatile("SBI 0x1C,1 \n\t");
對于讀操作,發(fā)現(xiàn)采用Datasheet范例程序:
while(EECR & (1<
EEAR = address; //設(shè)置地址寄存器
EECR |= (1<
return EEDR; //自數(shù)據(jù)寄存器返回數(shù)據(jù)
進(jìn)行單次操作似乎正常,但是連續(xù)操作可能導(dǎo)致程序個別運行不正常,現(xiàn)象象重啟,但通過邏輯分析儀跟蹤設(shè)置啟動時序情況看來,又不太象,不知什么原因。采用一下程序段則可以正常運行:
while(EECR & (1<
EEAR = address; //設(shè)置地址寄存器
asm volatile("SBI 0x1C,0 \n\t"); //設(shè)置EERE 以啟動讀操作
data = EEDR; //自數(shù)據(jù)寄存器返回數(shù)據(jù)
asm volatile("nop \n\t");
asm volatile("nop \n\t");
asm volatile("nop \n\t");
asm volatile("nop \n\t");
注意,讀操作后要空4個系統(tǒng)周期后才可執(zhí)行下個語句(Datasheet有說明)。