工作逻辑:stc8h8k64u的串口DMA_485和触摸屏通讯,单片机每200ms读取一次触摸屏的参数寄存器(共19个16位寄存器),如果发现用户对触摸屏的参数寄存器做了改动,和上一次值不一样,就擦除EEPROM,把19个参数写一遍,正常情况下,如果用户不操作触摸屏,每次读取的寄存器参数和前一次一样,就不会触发操作擦写EEPROM;所以每次上电开机,把存在EEPROM中上次断电前存入的参数,读取使用。
目前出现的问题:单片机串口DMA工作正常,触摸屏发送的数据(44个字节),22个字节存入EEPROM中然后再读出通过串口输出,可以看到读出来的数据都是是正确的,这是否表明已经正确写入了eeprom中了?但是当我断电上电再读eeprom,会出现前5个字节的数据是正常的,后面的数据有2字节是对的,其余全部是错的。工作中大部分时间是不擦写eeprom的。
程序在烧录的时候,频率选择33.1776MHz;分配给eeprom的空间是6KB;我擦除的是两个扇区0x1000,0x1200;分别存储在0x1010,0x01020.......0x101f; 0x1210,0x12020.......0x1260;
断电上电数据正确的是0x1010......0x1070;
我单独写了一个测试eeprom的程序,下面的程序是正常的,折腾两天了,一直解决不了。附上eeprom擦写读程序,那位大佬帮忙指点一下。
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
uchar EEPROM_Read(uint Addr)
{
uchar Data;
EA = 0;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 33; //设置等待参数33.1776MHz
IAP_CMD = 0x01; //设置IAP读命令
IAP_ADDRL = Addr; //设置IAP低地址
IAP_ADDRH = Addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
nop(); nop(); nop();
Data = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
EA = 1;
return Data;
}
void EEPROM_Write(uint Addr, uchar Data)
{
EA = 0;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 33; //设置等待参数33.1776MHz
IAP_CMD = 0x02; //设置IAP写命令
IAP_ADDRL = Addr; //设置IAP低地址
IAP_ADDRH = Addr >> 8; //设置IAP高地址
IAP_DATA = Data; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
nop(); nop(); nop();
IapIdle(); //关闭IAP功能
EA = 1;
}
void EEPROM_Erase(uint Addr)
{
EA = 0;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 33; //设置等待参数33.1776MHz
IAP_CMD = 0x03; //设置IAP擦除命令
IAP_ADDRL = Addr; //设置IAP低地址
IAP_ADDRH = Addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
nop(); nop(); nop(); IapIdle(); //关闭IAP功能
EA = 1;
}