STC15W4K56S4 eeprom 写入数据出错
本帖最后由 284423641 于 2024-8-6 17:36 编辑现在STC15W4K56S4的芯片写eeprom 0地址可以写入数据512开始的就写不了数据,我现在分两个区域分别储存不同的数据1区域 从地址从开始存储12个字节 ,2区域从512开始 存储另外的24个字节,现在1区域存储数据没有问题2区域确不行
一个扇区512个字节,地址0~511 编程只能1变0,擦除整个扇区擦除,0变1 https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=9674&pid=94104
absacc.h是个好东西
没注释掉的Iap_Read_Byte效率比注释掉的Iap_Read_Byte效率高些
读EEPROM
IAP寄存器访问的是相对地址,首地址为0
MOVC访问的是绝对地址,EEPROM从后向前规划,首地址由STCISP决定(可自定义EEPROM大小的型号)
读EEPROM时,
注意IAP寄存器是相对地址,MOVC是绝对地址
#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-8-6 18:52
https://www.stcaimcu.com/forum.php?mod=redirect&goto=findpost&ptid=9674&pid=94104
absacc.h是个好东 ...
我是按照这么处理的我是15W56S4的单片机第一个扇区首地址 是 0第2扇区的首地址是512开始的
页:
[1]