wanli 发表于 2024-7-4 04:23:58

EEPROM 读取不出来擦除写入正常

void IapProgram_addr(unsigned int addr,unsigned int dat) //16位数据擦除写入
{
   IapEraseSector(addr); //擦除
               IapProgramByte(addr,dat/256);
               IapProgramByte(addr+1,dat%256);                       
}

void IapReadByte_addr(unsigned int addr,unsigned int dat) //16位数据读取
{
                dat=(IapReadByte(addr)*256)+(IapReadByte(addr+1));
}
请问一下为什么读取的时候读取不出来呢

乘风飞扬 发表于 2024-7-4 09:51:44

使用附件例子测试正常后再进行修改或者移植。

hsrzq 发表于 2024-7-4 20:30:49

void IapReadByte_addr(unsigned int addr,unsigned int *dat) //16位数据读取
{
    *dat=(IapReadByte(addr)*256)+(IapReadByte(addr+1));
}

int xxx=0;
int yyy=0;
IapReadByte_addr(xxx, &yyy);1. 注意我在你的dat前加的两个星号;
2. 以及在调用的时候yyy前面的&号。
{:4_164:}

wanli 发表于 2024-7-5 23:29:20

乘风飞扬 发表于 2024-7-4 09:51
使用附件例子测试正常后再进行修改或者移植。

{:4_250:}

wanli 发表于 2024-7-5 23:56:39

hsrzq 发表于 2024-7-4 20:30
1. 注意我在你的dat前加的两个星号;
2. 以及在调用的时候yyy前面的&号。

{:4_250:}

zuichen 发表于 2024-7-6 10:52:05

{:5_332:}

机灵小老鼠 发表于 2024-7-17 22:57:22

请教一下, STC8051U-34K64 芯片,64K FLASH ,那EEPROM如果在程序下载的时候设置为0.5K,就是只有一个扇区;
那读、写这个扇区的首字节~尾字节的时候,地址 0uL~0x1ff; 那操作这个芯片EEPROM的时候,还可以串口仿真吗?
我仿真了一下,程序单步操作,似乎没有写成功,系统频率是22.1184MHz。

DebugLab 发表于 2024-7-18 00:38:24

absacc.h是个好东西

没注释掉的Iap_Read_Byte效率比注释掉的Iap_Read_Byte效率高些

#include <absacc.h>

#define                IAP_OFFSET        0x2000        //EEPROM首地址(STC8G1K08A)


void Iap_Idle(void)
{
        IAP_CONTR&=~IAPEN;
        IAP_CMD=IAP_IDL;
        IAP_TRIG=0x00;
        IAP_ADDRH=0x80;
        IAP_ADDRL=0x00;
}

unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
{
        return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
}

//unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
//{
//        unsigned char dat;
//        unsigned int add;
//        add=sector*0x0200+addr;
//        IAP_CONTR|=IAPEN;
//        IAP_TPS=IAP_TPS_;
//        IAP_CMD=IAP_READ;
//        IAP_ADDRL=add;
//        IAP_ADDRH=add>>8;
//        IAP_TRIG=0x5A;
//        IAP_TRIG=0xA5;
//        _nop_();
//        dat=IAP_DATA;
//        Iap_Idle();
//        return dat;
//}

void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
{
        unsigned int add;
        add=sector*0x0200+addr;
        IAP_CONTR|=IAPEN;
        IAP_TPS=IAP_TPS_;
        IAP_CMD=IAP_WRITE;
        IAP_ADDRL=add;
        IAP_ADDRH=add>>8;
        IAP_DATA=dat;
        IAP_TRIG=0x5A;
        IAP_TRIG=0xA5;
        _nop_();
        Iap_Idle();
}

void Iap_Erase_Sector(unsigned char sector)
{
        unsigned int add;
        add=sector*0x0200;
        IAP_CONTR|=IAPEN;
        IAP_TPS=IAP_TPS_;
        IAP_CMD=IAP_ERASE;
        IAP_ADDRL=add;
        IAP_ADDRH=add>>8;
        IAP_TRIG=0x5A;
        IAP_TRIG=0xA5;
        _nop_();
        Iap_Idle();
}

DebugLab 发表于 2024-7-18 00:42:25

机灵小老鼠 发表于 2024-7-17 22:57
请教一下, STC8051U-34K64 芯片,64K FLASH ,那EEPROM如果在程序下载的时候设置为0.5K,就是只有一个扇区 ...

执行IAP操作时,CPU暂停



DebugLab 发表于 2024-7-18 00:48:59

DebugLab 发表于 2024-7-18 00:38
absacc.h是个好东西

没注释掉的Iap_Read_Byte效率比注释掉的Iap_Read_Byte效率高些

读EEPROM
IAP寄存器访问的是相对地址,首地址为0
MOVC访问的是绝对地址,EEPROM从后向前规划,首地址由STCISP决定(可自定义EEPROM大小的型号)

页: [1] 2
查看完整版本: EEPROM 读取不出来擦除写入正常