找回密码
 立即注册
查看: 544|回复: 7

STC8H2K08U的iap技术的内部eeprom存储的问题 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-04-12 11:43:18

1

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2024-4-12 11:40:51 | 显示全部楼层 |阅读模式
#include "iap_eeprom.h"
#include <STC8H.H>
#include "intrins.h"
#include "main.h"
#include "intrins.h"

void IapIdle()
{
    IAP_CONTR = 0;                              //关闭IAP功能
    IAP_CMD = 0;                                //清除命令寄存器
    IAP_TRIG = 0;                               //清除触发寄存器
    IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
    IAP_ADDRL = 0;
}

char IapRead(int addr)
{
    char dat;

    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 1;                                //设置IAP读命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    dat = IAP_DATA;                             //读IAP数据
    IapIdle();                                  //关闭IAP功能

    return dat;
}

void IapProgram(int addr, char dat)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 2;                                //设置IAP写命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_DATA = dat;                             //写IAP数据
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();
    IapIdle();                                  //关闭IAP功能
}

void IapErase(int addr)
{
    IAP_CONTR = 0x80;                           //使能IAP
    IAP_TPS = 12;                               //设置等待参数12MHz
    IAP_CMD = 3;                                //设置IAP擦除命令
    IAP_ADDRL = addr;                           //设置IAP低地址
    IAP_ADDRH = addr >> 8;                      //设置IAP高地址
    IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
    IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
    _nop_();                                    //
    IapIdle();                                  //关闭IAP功能
}

//main.c
//while(1)循环的上面
uint8_t iap_data_box2;
iap_data_box2=IapRead(0x0400);
//        
        iap_data_box2+=2;
        IapErase(0x0400);
        IapProgram(0x0400,iap_data_box2);
        iap_data_box2=IapRead(0x0400);
//下面是加了个数码管显示iap_data_box2的代码救不贴出来了
设想是通过每次掉电上电存入iap_data_box2+2来检测是否真的存到eeprom,但是每次上电都是2不知道为什么

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-04-12 11:43:18

1

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2024-4-12 11:42:33 | 显示全部楼层
每次上电iap_data_box2显示都是2,有种它着eeprom存了但是又好像没存的感觉,挺没有头绪的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-4-12 13:17:27 | 显示全部楼层
烧录附件的例子到芯片试试,每次上电串口打印一次EEPROM读写数据。

STC8-EEPROM多字节读写操作-通过串口1输出.zip

8.28 KB, 下载次数: 73

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-04-12 11:43:18

1

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2024-4-12 15:07:30 | 显示全部楼层
乘风*** 发表于 2024-4-12 13:17
烧录附件的例子到芯片试试,每次上电串口打印一次EEPROM读写数据。

[15:03:07.904]接收←00 00 FE
[15:03:08.252]接收←69 71 FC CA 8E FE
[15:03:09.643]接收←00
[15:03:09.995]接收←72 69 8E C6 86
[15:03:11.619]接收←00 FF
[15:03:11.969]接收←E9 E9 71 CA 86
[15:03:13.148]接收←00 FF
[15:03:13.482]接收←73 E9 E9 CE 86
[15:03:14.417]接收←00
[15:03:14.764]接收←69 E9 E9 C2 86 86
[15:05:59.673]接收←00 00
[15:06:00.022]接收←E9 E9 CE 86 86
[15:06:02.060]接收←00 DC
[15:06:02.315]接收←00 FE
[15:06:02.507]接收←00
[15:06:02.555]接收←00
[15:06:02.905]接收←69 E9 CA 8E FC
[15:06:03.352]接收←00
[15:06:03.704]接收←E9 E9 E9 86 86
[15:06:05.949]接收←00
[15:06:06.293]接收←E9 E9 E9 8E 8E FC
[15:06:07.027]接收←00 FF
[15:06:07.105]接收←80 FD F8 C2 FF
[15:06:07.439]接收←E9 E9 E9 CA 8E FC
[15:06:11.423]接收←00
[15:06:11.773]接收←71 71 E9 CA CE 86
[15:06:12.985]接收←00 FE
[15:06:13.348]接收←73 72 8E CA C6 FC
[15:06:14.315]接收←00 00 00 FF
[15:06:14.694]接收←72 E9 E9 8E 82
[15:06:15.090]接收←00 FF
[15:06:15.153]接收←00 FF
[15:06:15.503]接收←69 71 F9 8E FE
[15:06:16.102]接收←00
[15:06:16.454]接收←E9 E9 FC 86 C6

大佬,这是上电收到的信息看样子是能存储的,不过我暂时还不知道原因
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-4-12 15:38:17 | 显示全部楼层
shuy*** 发表于 2024-4-12 15:07
[15:03:07.904]接收←00 00 FE
[15:03:08.252]接收←69 71 FC CA 8E FE
[15:03:09.643]接收←00

下载时, 选择IRC频率 11.0592MHz。
打印时串口波特率设置 115200,使用文本模式打印。
回复 支持 1 反对 1

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-04-12 11:43:18

1

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2024-4-12 15:48:46 | 显示全部楼层
乘风*** 发表于 2024-4-12 15:38
下载时, 选择IRC频率 11.0592MHz。
打印时串口波特率设置 115200,使用文本模式打印。 ...

Read1=0x00 0x01 0x02 0x03 0x04 0x10 0x09 0xe8 0xf9 0xcb
Read2=0x01 0x02 0x03 0x04 0x05 0x11 0x0a 0xe9 0xfa 0xcc
这是输出的报文属于正常吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-4-12 16:01:57 | 显示全部楼层
shuy*** 发表于 2024-4-12 15:48
Read1=0x00 0x01 0x02 0x03 0x04 0x10 0x09 0xe8 0xf9 0xcb
Read2=0x01 0x02 0x03 0x04 0x05 0x11 0x0a  ...

例子是将EEPROM读取的数据+1后重新写入,如果读数是FF的话赋初值。
看起来你读取的后面几个地址原本就有内容,就没有赋初值。
不过+1后写入,再次读取出来的结果是对的。
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-04-12 11:43:18

1

主题

4

回帖

15

积分

新手上路

积分
15
发表于 2024-4-12 17:04:15 | 显示全部楼层
乘风*** 发表于 2024-4-12 16:01
例子是将EEPROM读取的数据+1后重新写入,如果读数是FF的话赋初值。
看起来你读取的后面几个地址原本就有 ...

谢谢大佬,能正常存储是我的代码问题应该是,现在已经好了,谢谢大佬
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:53 , Processed in 0.219714 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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