shuyuan 发表于 2024-4-12 11:40:51

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

#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不知道为什么

shuyuan 发表于 2024-4-12 11:42:33

每次上电iap_data_box2显示都是2,有种它着eeprom存了但是又好像没存的感觉,挺没有头绪的

乘风飞扬 发表于 2024-4-12 13:17:27

烧录附件的例子到芯片试试,每次上电串口打印一次EEPROM读写数据。

shuyuan 发表于 2024-4-12 15:07:30

乘风飞扬 发表于 2024-4-12 13:17
烧录附件的例子到芯片试试,每次上电串口打印一次EEPROM读写数据。

接收←00 00 FE
接收←69 71 FC CA 8E FE
接收←00
接收←72 69 8E C6 86
接收←00 FF
接收←E9 E9 71 CA 86
接收←00 FF
接收←73 E9 E9 CE 86
接收←00
接收←69 E9 E9 C2 86 86
接收←00 00
接收←E9 E9 CE 86 86
接收←00 DC
接收←00 FE
接收←00
接收←00
接收←69 E9 CA 8E FC
接收←00
接收←E9 E9 E9 86 86
接收←00
接收←E9 E9 E9 8E 8E FC
接收←00 FF
接收←80 FD F8 C2 FF
接收←E9 E9 E9 CA 8E FC
接收←00
接收←71 71 E9 CA CE 86
接收←00 FE
接收←73 72 8E CA C6 FC
接收←00 00 00 FF
接收←72 E9 E9 8E 82
接收←00 FF
接收←00 FF
接收←69 71 F9 8E FE
接收←00
接收←E9 E9 FC 86 C6

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

乘风飞扬 发表于 2024-4-12 15:38:17

shuyuan 发表于 2024-4-12 15:07
接收←00 00 FE
接收←69 71 FC CA 8E FE
接收←00


下载时, 选择IRC频率 11.0592MHz。
打印时串口波特率设置 115200,使用文本模式打印。

shuyuan 发表于 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
这是输出的报文属于正常吗

乘风飞扬 发表于 2024-4-12 16:01:57

shuyuan 发表于 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后写入,再次读取出来的结果是对的。

shuyuan 发表于 2024-4-12 17:04:15

乘风飞扬 发表于 2024-4-12 16:01
例子是将EEPROM读取的数据+1后重新写入,如果读数是FF的话赋初值。
看起来你读取的后面几个地址原本就有 ...

谢谢大佬,能正常存储是我的代码问题应该是,现在已经好了,谢谢大佬
页: [1]
查看完整版本: STC8H2K08U的iap技术的内部eeprom存储的问题 | 已解决