找回密码
 立即注册
查看: 368|回复: 4

STC15W4K56S4 eeprom 写入数据出错

[复制链接]

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 2024-8-6 17:27:22 | 显示全部楼层 |阅读模式
本帖最后由 284423641 于 2024-8-6 17:36 编辑

现在STC15W4K56S4的芯片写eeprom 0地址可以写入数据  512开始的就写不了数据,我现在分两个区域分别储存不同的数据  1区域 从地址从开始  存储12个字节 ,2区域从512开始 存储另外的24个字节,现在1区域存储数据没有问题  2区域确不行
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:470
  • 最近打卡:2025-06-18 08:23:09
已绑定手机

79

主题

5137

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2024-8-6 18:48:03 | 显示全部楼层
一个扇区512个字节,地址0~511
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:470
  • 最近打卡:2025-06-18 08:23:09
已绑定手机

79

主题

5137

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2024-8-6 18:49:01 | 显示全部楼层
编程只能1变0,擦除整个扇区擦除,0变1
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:470
  • 最近打卡:2025-06-18 08:23:09
已绑定手机

79

主题

5137

回帖

9138

积分

超级版主

DebugLab

积分
9138
发表于 2024-8-6 18:52:51 | 显示全部楼层
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
回复 支持 反对

使用道具 举报 送花

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 2024-8-6 22:53:37 | 显示全部楼层
Debu*** 发表于 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开始的
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-18 11:57 , Processed in 0.137430 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表