|
1、系统中有定时中断1、USART0接收中断、USART0发送中断
2、当USART0接收到上位机的“预置单个寄存器”指令后,立即发送应答数据,然后开始写EEPROM
(写预置数据和CRC16校验码)。
3、写EEPROM时,每次写4个字节。
4、按照马潮老师应用指南上的例子改写的程序,经常出现写EEPROM错误。
5、我稍稍改进之后,基本上没有出现过错误,但是偶而也出现
6、然后我采用如下方法:写完当前字节之后,立即读出,如果不相同重写(最多重写5次)
7、可是偶而还是错误呢?为什么呢?我写EEPROM时,已经关闭了全局中断了呀!
//////////////////////////////////////////////////////////////////////
//EEPROM写子程序(按照马潮老师应用指南上的例子改写)
//////////////////////////////////////////////////////////////////////
void EEPROM_WRITE_BYTE(unsigned int addr,unsigned char bVal)
{
while (EECR & (1<<EEWE));
EEAR = addr;
EEDR = bVal;
CLI();
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
SEI();
}
//////////////////////////////////////////////////////////////////////
//EEPROM写子程序(我稍稍改进后的程序)
//////////////////////////////////////////////////////////////////////
void EEPROM_WRITE_BYTE(unsigned int addr,unsigned char bVal)
{
EEAR = addr;
EEDR = bVal;
CLI();
EECR |= (1<<EEMWE);
EECR |= (1<<EEWE);
while (EECR & (1<<EEWE));
NOP();
NOP();
SEI();
}
//////////////////////////////////////////////////////////////////////
//EEPROM读子程序
//////////////////////////////////////////////////////////////////////
unsigned char EEPROM_READ_BYTE(unsigned int addr)
{
while (EECR & (1 << EEWE)); EEAR = addr; EECR |= (1 << EERE); return (EEDR);
}
////////////////////////////////////////////////////////////////////////////////////////////采用重写的方式将 堆栈中数据写到EEPROM
//////////////////////////////////////////////////////////////////////////////////////////void STACK_PutChar(void)
{
unsigned char i;
unsigned int addr;
int bVal;
unsigned char ch;
while (!STACK_EMPTY())
{
STACK_POP(&addr,&bVal);
ch = (bVal >>8);
for (i = 0 ; i < 5 ; i++)
{
EEPROM_WRITE_BYTE(addr,ch);
if (EEPROM_READ_BYTE(addr) == ch)
break;
}
addr++;
ch = (bval&0xFF);
for (i = 0 ; i < 5 ; i++)
{
EEPROM_WRITE_BYTE(addr,ch);
if (EEPROM_READ_BYTE(addr) == ch)
break;
}
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|