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));
}
请问一下为什么读取的时候读取不出来呢
使用附件例子测试正常后再进行修改或者移植。 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:}
乘风飞扬 发表于 2024-7-4 09:51
使用附件例子测试正常后再进行修改或者移植。
{:4_250:} hsrzq 发表于 2024-7-4 20:30
1. 注意我在你的dat前加的两个星号;
2. 以及在调用的时候yyy前面的&号。
{:4_250:} {:5_332:} 请教一下, STC8051U-34K64 芯片,64K FLASH ,那EEPROM如果在程序下载的时候设置为0.5K,就是只有一个扇区;
那读、写这个扇区的首字节~尾字节的时候,地址 0uL~0x1ff; 那操作这个芯片EEPROM的时候,还可以串口仿真吗?
我仿真了一下,程序单步操作,似乎没有写成功,系统频率是22.1184MHz。 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();
}
机灵小老鼠 发表于 2024-7-17 22:57
请教一下, STC8051U-34K64 芯片,64K FLASH ,那EEPROM如果在程序下载的时候设置为0.5K,就是只有一个扇区 ...
执行IAP操作时,CPU暂停
DebugLab 发表于 2024-7-18 00:38
absacc.h是个好东西
没注释掉的Iap_Read_Byte效率比注释掉的Iap_Read_Byte效率高些
读EEPROM
IAP寄存器访问的是相对地址,首地址为0
MOVC访问的是绝对地址,EEPROM从后向前规划,首地址由STCISP决定(可自定义EEPROM大小的型号)
页:
[1]
2