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 还是有区别的? 如果是的话,文档也应该单独说明一下,谢谢!
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();
}
读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址
补充一点,我用的是C251编译器 今天使用C51中STC8H1K24芯片(此型号的芯片有固定的4K字节EEPROM)上使用IAP函数操作EEPROM,发现EEPROM的操作地址和文档写的一样,就是从 0x0000 开始是EEPROM的第一个扇区;
而 前面1楼所写 STC8051U的EEPROM地址中C251下使用IAP函数操作时, 貌似和文档描述不同; 不知道哪位师傅也这样测试过没有? DebugLab 发表于 2024-7-18 16:59
读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址
C251下,IAP函数操作 STC8051U 的EEPROM 使用的是3字节地址, 应该不同于 STC8H系列 的2字节操作地址。
页:
[1]