找回密码
 立即注册
查看: 25|回复: 2

15W1K16S EEPROM

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-13 11:40:44

19

主题

62

回帖

669

积分

高级会员

积分
669
发表于 3 天前 | 显示全部楼层 |阅读模式
封装SKDIP28
地址
#define      IAP_ADDRESS  0x3800   //EEPROM首地址
代码长度
Program Size: data=71.3 xdata=0 code=12333
主程序写进去以后
上电读出来00
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:468
  • 最近打卡:2025-06-16 07:06:57
已绑定手机

79

主题

5130

回帖

9136

积分

超级版主

DebugLab

积分
9136
发表于 3 天前 | 显示全部楼层
截图202506131156368634.jpg
  1. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  2. //若无特别说明,工作频率一般为11.0592MHz
  3. #include "reg51.h"
  4. #include "intrins.h"
  5. typedef unsigned char BYTE;
  6. typedef unsigned int WORD;
  7. //-----------------------------------------------
  8. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  9. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  10. sfr P0M1 = 0x93;
  11. sfr P0M0 = 0x94;
  12. sfr P2M1 = 0x95;
  13. sfr P2M0 = 0x96;
  14. sfr P3M1 = 0xB1;
  15. sfr P3M0 = 0xB2;
  16. sfr P4M1 = 0xB3;
  17. sfr P4M0 = 0xB4;
  18. sfr P5M1 = 0xC9;
  19. sfr P5M0 = 0xCA;
  20. sfr P6M1 = 0xCB;
  21. sfr P6M0 = 0xCC;
  22. sfr P7M1 = 0xE1;
  23. sfr P7M0 = 0xE2;
  24. sfr IAP_DATA    =   0xC2;           //IAP数据寄存器
  25. sfr IAP_ADDRH   =   0xC3;           //IAP地址寄存器高字节
  26. sfr IAP_ADDRL   =   0xC4;           //IAP地址寄存器低字节
  27. sfr IAP_CMD     =   0xC5;           //IAP命令寄存器
  28. sfr IAP_TRIG    =   0xC6;           //IAP命令触发寄存器
  29. sfr IAP_CONTR   =   0xC7;           //IAP控制寄存器
  30. #define CMD_IDLE    0               //空闲模式
  31. #define CMD_READ    1               //IAP字节读命令
  32. #define CMD_PROGRAM 2               //IAP字节编程命令
  33. #define CMD_ERASE   3               //IAP扇区擦除命令
  34. //#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
  35. //#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
  36. #define ENABLE_IAP  0x82            //if SYSCLK<20MHz
  37. //#define ENABLE_IAP 0x83           //if SYSCLK<12MHz
  38. //#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
  39. //#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
  40. //#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
  41. //#define ENABLE_IAP 0x87           //if SYSCLK<1MHz
  42. //测试地址
  43. #define IAP_ADDRESS 0x0400
  44. void Delay(BYTE n);
  45. void IapIdle();
  46. BYTE IapReadByte(WORD addr);
  47. void IapProgramByte(WORD addr, BYTE dat);
  48. void IapEraseSector(WORD addr);
  49. void main()
  50. {
  51.     WORD i;
  52.     P0M0 = 0x00;
  53.     P0M1 = 0x00;
  54.     P1M0 = 0x00;
  55.     P1M1 = 0x00;
  56.     P2M0 = 0x00;
  57.     P2M1 = 0x00;
  58.     P3M0 = 0x00;
  59.     P3M1 = 0x00;
  60.     P4M0 = 0x00;
  61.     P4M1 = 0x00;
  62.     P5M0 = 0x00;
  63.     P5M1 = 0x00;
  64.     P6M0 = 0x00;
  65.     P6M1 = 0x00;
  66.     P7M0 = 0x00;
  67.     P7M1 = 0x00;
  68.     P1 = 0xfe;                      //1111,1110 系统OK
  69.     Delay(10);                      //延时
  70.     IapEraseSector(IAP_ADDRESS);    //扇区擦除
  71.     for (i=0; i<512; i++)           //检测是否擦除成功(全FF检测)
  72.     {
  73.         if (IapReadByte(IAP_ADDRESS+i) != 0xff)
  74.             goto Error;             //如果出错,则退出
  75.     }
  76.     P1 = 0xfc;                      //1111,1100 擦除成功
  77.     Delay(10);                      //延时
  78.     for (i=0; i<512; i++)           //编程512字节
  79.     {
  80.         IapProgramByte(IAP_ADDRESS+i, (BYTE)i);
  81.     }
  82.     P1 = 0xf8;                      //1111,1000 编程完成
  83.     Delay(10);                      //延时
  84.     for (i=0; i<512; i++)           //校验512字节
  85.     {
  86.         if (IapReadByte(IAP_ADDRESS+i) != (BYTE)i)
  87.             goto Error;             //如果校验错误,则退出
  88.     }
  89.     P1 = 0xf0;                      //1111,0000 测试完成
  90.     while (1);
  91. Error:
  92.     P1 &= 0x7f;                     //0xxx,xxxx IAP操作失败
  93.     while (1);
  94. }
  95. /*----------------------------
  96. 软件延时
  97. ----------------------------*/
  98. void Delay(BYTE n)
  99. {
  100.     WORD x;
  101.     while (n--)
  102.     {
  103.         x = 0;
  104.         while (++x);
  105.     }
  106. }
  107. /*----------------------------
  108. 关闭IAP
  109. ----------------------------*/
  110. void IapIdle()
  111. {
  112.     IAP_CONTR = 0;                  //关闭IAP功能
  113.     IAP_CMD = 0;                    //清除命令寄存器
  114.     IAP_TRIG = 0;                   //清除触发寄存器
  115.     IAP_ADDRH = 0x80;               //将地址设置到非IAP区域
  116.     IAP_ADDRL = 0;
  117. }
  118. /*----------------------------
  119. 从ISP/IAP/EEPROM区域读取一字节
  120. ----------------------------*/
  121. BYTE IapReadByte(WORD addr)
  122. {
  123.     BYTE dat;                       //数据缓冲区
  124.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  125.     IAP_CMD = CMD_READ;             //设置IAP命令
  126.     IAP_ADDRL = addr;               //设置IAP低地址
  127.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  128.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  129.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  130.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  131.     dat = IAP_DATA;                 //读ISP/IAP/EEPROM数据
  132.     IapIdle();                      //关闭IAP功能
  133.     return dat;                     //返回
  134. }
  135. /*----------------------------
  136. 写一字节数据到ISP/IAP/EEPROM区域
  137. ----------------------------*/
  138. void IapProgramByte(WORD addr, BYTE dat)
  139. {
  140.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  141.     IAP_CMD = CMD_PROGRAM;          //设置IAP命令
  142.     IAP_ADDRL = addr;               //设置IAP低地址
  143.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  144.     IAP_DATA = dat;                 //写ISP/IAP/EEPROM数据
  145.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  146.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  147.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  148.     IapIdle();
  149. }
  150. /*----------------------------
  151. 扇区擦除
  152. ----------------------------*/
  153. void IapEraseSector(WORD addr)
  154. {
  155.     IAP_CONTR = ENABLE_IAP;         //使能IAP
  156.     IAP_CMD = CMD_ERASE;            //设置IAP命令
  157.     IAP_ADDRL = addr;               //设置IAP低地址
  158.     IAP_ADDRH = addr >> 8;          //设置IAP高地址
  159.     IAP_TRIG = 0x5a;                //写触发命令(0x5a)
  160.     IAP_TRIG = 0xa5;                //写触发命令(0xa5)
  161.     _nop_();                        //等待ISP/IAP/EEPROM操作完成
  162.     IapIdle();
  163. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:7
  • 最近打卡:2025-06-13 11:40:44

19

主题

62

回帖

669

积分

高级会员

积分
669
发表于 3 天前 | 显示全部楼层

程序越写越长 应该是代码覆盖了 手上有8H8K64
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-6-16 09:28 , Processed in 0.129317 second(s), 62 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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