STC32G12K128 Eprom读写操作失败 !已解决
我按照手册的例子,#define MAIN_Fosc 12000000L //主时钟
void DisableEEPROM(void)
{
IAP_CONTR = 0; //关闭 IAP 功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非 IAP 区域
IAP_ADDRL = 0;
}
void IapProgram(uint addr, uchar dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数30MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
EA=0;
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
EA=1;
DisableEEPROM(); //关闭IAP功能
}
uchar IapRead(uint addr)
{
uchar dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数30MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
EA=0;
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
EA=1;
dat = IAP_DATA; //读IAP数据
DisableEEPROM(); //关闭IAP功能
return dat;
}
void IapErase(uint addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数30MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
EA=0;
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
EA=1;
DisableEEPROM(); //关闭IAP功能
}
void main()
{
uchar i,j;
initPort();
Delay1ms(500);
IapErase(EE_ADDRESS);
Delay1ms(500);
j=IapRead(EE_ADDRESS);
if(j==0xFF)//如果正确,ok灯亮
okLight=0;
else
falseLight=0;
while(1);
}
以上为测试程序,但运行结果都是falseLight灯亮,检查发现,j的值为0x00,显然与手册中所说不同,不知这是什么原因引起的?
另外:我将程序改为如下:
uchar i,j;
initPort();
i=0x01;
i=0x02;
i=0x03;
EEPROM_SectorErase(EE_ADDRESS);
EEPROM_write_n(EE_ADDRESS,i,3);
EEPROM_read_n(EE_ADDRESS,j,3);
if(j==0x03)
warnLight=0;
else
temptureLight=0;
while(1);
写入3个不同的数据:0x01,0x02,0x03,再读出,结果是三个数据都是最后一个数据:0x03,请问楼主这是什么原因? ISP烧录的时候要选择EEPROM大小。
如果是huge模式,需要在工程设置里面把那个ROM区开始位置和大小改一下 熊仔 发表于 2023-8-8 13:16
ISP烧录的时候要选择EEPROM大小。
如果是huge模式,需要在工程设置里面把那个ROM区开始位置和大小改一下 ...
如何改呢?谢谢 新手最好参考实验箱的例子。 熊仔 发表于 2023-8-8 17:44
新手最好参考实验箱的例子。
我上面写的内容就是从试验箱中读写的 13808369317 发表于 2023-8-9 22:32
我上面写的内容就是从试验箱中读写的
看你写的代码与实验箱例程包里面的例子有所不同,所以建议最好先用实验箱里的例子测试。
测试正常后再进行移植、修改,避免移植过程中出错导致功能不正常。 搞定了 13808369317 发表于 2023-8-10 18:08
搞定了
楼主,我现在也遇到这个问题,存123进去,读出来全是3,你是咋解决的呀。
页:
[1]