13808369317 发表于 2023-8-8 11:19:12

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,显然与手册中所说不同,不知这是什么原因引起的?

13808369317 发表于 2023-8-8 11:31:29

另外:我将程序改为如下:
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,请问楼主这是什么原因?

熊仔 发表于 2023-8-8 13:16:30

ISP烧录的时候要选择EEPROM大小。
如果是huge模式,需要在工程设置里面把那个ROM区开始位置和大小改一下

13808369317 发表于 2023-8-8 17:06:33

熊仔 发表于 2023-8-8 13:16
ISP烧录的时候要选择EEPROM大小。
如果是huge模式,需要在工程设置里面把那个ROM区开始位置和大小改一下 ...

如何改呢?谢谢

熊仔 发表于 2023-8-8 17:44:40

新手最好参考实验箱的例子。

13808369317 发表于 2023-8-9 22:32:56

熊仔 发表于 2023-8-8 17:44
新手最好参考实验箱的例子。

我上面写的内容就是从试验箱中读写的

乘风飞扬 发表于 2023-8-10 09:31:24

13808369317 发表于 2023-8-9 22:32
我上面写的内容就是从试验箱中读写的

看你写的代码与实验箱例程包里面的例子有所不同,所以建议最好先用实验箱里的例子测试。
测试正常后再进行移植、修改,避免移植过程中出错导致功能不正常。

13808369317 发表于 2023-8-10 18:08:47

搞定了

hgb 发表于 2023-11-23 15:55:38

13808369317 发表于 2023-8-10 18:08
搞定了

楼主,我现在也遇到这个问题,存123进去,读出来全是3,你是咋解决的呀。
页: [1]
查看完整版本: STC32G12K128 Eprom读写操作失败 !已解决