机灵小老鼠 发表于 2024-7-18 16:17:51

STC8051U-34K64-LQFP48 芯片EEPROM的疑问?

我使用 20.5.1 例程中的 4个EEPROM基本函数,然后把操作中间和最后的 EEPROM 数据通过串口上送PC机显示,进行EEPROM操作测试, 发现操作结果如下:

1. 烧写程序时设置 EEPROM 32K, 系统时钟 22.1184MHz,【我的测试程序代码只有2K不到】

2. 程序上电完成串口初始化之后,先读出 0x000000uL 地址开始的 32 字节,发现这32字节和 我的程序代码开头处的 32 字节完全相同;
   for(i=0, add=0x000000uL ; i<32; i++, add++) IapRead(add);

3. 再擦除 0x004000uL 地址处的1个扇区;
    IapErase(0x004000uL);

3. 然后读出 0x004000uL 地址开始的 32字节, 发现   这32字节 都是 0xFF
   for(i=0, add=0x004000uL ; i<32; i++, add++) IapRead(add);

4. 对 0x004000uL 地址开始 写入16字节
   memcpy(w_buf, "0123456789ABCDEF", 16);
       
   for(u16_i=0u, u32_addr=0x004000uL; u16_i<16u; u16_i++, u32_addr++)
{
        IapProgram(u32_addr, w_buf);                //EEPROM 0x004000 开始写入16字节
}

5.读出 0x004000uL 地址开始的 32字节, 发现   这32字节中,前16字节 是 "0123456789ABCDEF", 后16字节 都是 0xFF
   for(i=0, add=0x004000uL ; i<32; i++, add++) IapRead(add);
//==============================================================================

第二次测试:程序下载后,执行
IapErase(0x000000uL);   
然后再读出32字节
   for(i=0, add=0x000000uL ; i<32; i++, add++) IapRead(add);

上电之后的时候,程序传输一次数据后,状态就乱了【应该是程序第一扇区被擦除了, IAP的4个函数在C文件的最后,不使用第一扇区】

测试结论: 在 STC8051U-34K64-LQFP48 上面,   EEPROM的划分 似乎不像 芯片文档 20.4.1 的描述

请问版主,是这样的情况吗? 或者说不同的芯片型号,操作 EEPROM 还是有区别的? 如果是的话,文档也应该单独说明一下,谢谢!

DebugLab 发表于 2024-7-18 16:57:59

absacc.h是个好东西

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

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



#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 16:59:49


读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址

机灵小老鼠 发表于 2024-7-18 19:57:07

补充一点,我用的是C251编译器

机灵小老鼠 发表于 2024-8-1 22:10:12

今天使用C51中STC8H1K24芯片(此型号的芯片有固定的4K字节EEPROM)上使用IAP函数操作EEPROM,发现EEPROM的操作地址和文档写的一样,就是从 0x0000 开始是EEPROM的第一个扇区;
而 前面1楼所写 STC8051U的EEPROM地址中C251下使用IAP函数操作时, 貌似和文档描述不同; 不知道哪位师傅也这样测试过没有?

机灵小老鼠 发表于 2024-8-1 22:12:44

DebugLab 发表于 2024-7-18 16:59
读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址

C251下,IAP函数操作 STC8051U 的EEPROM 使用的是3字节地址, 应该不同于 STC8H系列 的2字节操作地址。
页: [1]
查看完整版本: STC8051U-34K64-LQFP48 芯片EEPROM的疑问?