找回密码
 立即注册
楼主: Sky_chen4

求助!

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-22 10:19:15
已绑定手机

9

主题

58

回帖

289

积分

中级会员

积分
289
发表于 2025-3-6 10:55:02 | 显示全部楼层
地址应该没问题
截图202503061054334805.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-3-6 11:12:44 | 显示全部楼层
你看到地址前面写的东西了么?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-22 10:19:15
已绑定手机

9

主题

58

回帖

289

积分

中级会员

积分
289
发表于 2025-3-6 11:27:29 | 显示全部楼层
_奶*** 发表于 2025-3-6 11:12
你看到地址前面写的东西了么?

刚刚试了一下,按照API地址的话,从0x0000开始,程序直接跑不起来了
按照MOVC的地址,起码还在运行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2025-3-6 11:30:01 | 显示全部楼层
Sky_c*** 发表于 2025-3-6 10:55
地址应该没问题

你的程序是 IAP 方式。
对于 Ai8051U 系列,使用 IAP 方式时,地址数据为 EEPROM 的目标地址,地址从 0000 开始
屏幕截图 2025-03-06 112652.jpg





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-02 14:37:11
已绑定手机

77

主题

4849

回帖

8382

积分

超级版主

DebugLab

积分
8382
发表于 2025-3-6 11:59:52 | 显示全部楼层
IAP操作,地址从0开始
MOVC读,要加offset
读建议使用MOVC读,速度快
可以参考我的例程
AI8051U,1K EEPROM
IAP_OFFSET=0xFC00,EEPROM=2sector
sector范围0或1,addr范围0~511
正确设置IAP_OFFSET后,MOVC读函数也自动计算好了,传入的sector从0开始
addr都是从0开始
以下程序供参考:
  1. #include <absacc.h>
  2. #define                IAP_TPS_        24                //等待参数
  3. #define                IAP_OFFSET        0xFC00        //EEPROM地址
  4. void Iap_Idle(void)
  5. {
  6.         IAP_CONTR&=~IAPEN;
  7.         IAP_CMD=IAP_IDL;
  8.         IAP_TRIG=0x00;
  9.         IAP_ADDRH=0x80;
  10.         IAP_ADDRL=0x00;
  11. }
  12. unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
  13. {
  14.         return *(CBYTE+IAP_OFFSET+sector*0x0200+addr);
  15. }
  16. //unsigned char Iap_Read_Byte(unsigned char sector,unsigned int addr)
  17. //{
  18. //        unsigned char dat;
  19. //        unsigned int add;
  20. //        add=sector*0x0200+addr;
  21. //        IAP_CONTR|=IAPEN;
  22. //        IAP_TPS=IAP_TPS_;
  23. //        IAP_CMD=IAP_READ;
  24. //        IAP_ADDRL=add;
  25. //        IAP_ADDRH=add>>8;
  26. //        IAP_TRIG=0x5A;
  27. //        IAP_TRIG=0xA5;
  28. //        _nop_();
  29. //        dat=IAP_DATA;
  30. //        Iap_Idle();
  31. //        return dat;
  32. //}
  33. void Iap_Program_Byte(unsigned char sector,unsigned int addr,unsigned char dat)
  34. {
  35.         unsigned int add;
  36.         add=sector*0x0200+addr;
  37.         IAP_CONTR|=IAPEN;
  38.         IAP_TPS=IAP_TPS_;
  39.         IAP_CMD=IAP_WRITE;
  40.         IAP_ADDRL=add;
  41.         IAP_ADDRH=add>>8;
  42.         IAP_DATA=dat;
  43.         IAP_TRIG=0x5A;
  44.         IAP_TRIG=0xA5;
  45.         _nop_();
  46.         Iap_Idle();
  47. }
  48. void Iap_Erase_Sector(unsigned char sector)
  49. {
  50.         unsigned int add;
  51.         add=sector*0x0200;
  52.         IAP_CONTR|=IAPEN;
  53.         IAP_TPS=IAP_TPS_;
  54.         IAP_CMD=IAP_ERASE;
  55.         IAP_ADDRL=add;
  56.         IAP_ADDRH=add>>8;
  57.         IAP_TRIG=0x5A;
  58.         IAP_TRIG=0xA5;
  59.         _nop_();
  60.         Iap_Idle();
  61. }
复制代码

DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-22 10:19:15
已绑定手机

9

主题

58

回帖

289

积分

中级会员

积分
289
发表于 2025-3-6 12:34:24 | 显示全部楼层
Debu*** 发表于 2025-3-6 11:59
IAP操作,地址从0开始
MOVC读,要加offset
读建议使用MOVC读,速度快

好的,我试试,感谢大佬
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-22 10:19:15
已绑定手机

9

主题

58

回帖

289

积分

中级会员

积分
289
发表于 2025-3-6 12:35:06 | 显示全部楼层
angm*** 发表于 2025-3-6 11:30
你的程序是用 IAP 方式。
对于 Ai8051U 系列,使用 IAP 方式时,地址数据为 EEPROM 的目标地址,地址从 0 ...

啊!那我地址用0x0000开始,直接运行不了了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-22 10:19:15
已绑定手机

9

主题

58

回帖

289

积分

中级会员

积分
289
发表于 2025-3-6 14:53:16 | 显示全部楼层
  1. #include "config.h"
  2. #include "Task.h"       
  3. #include "system_init.h"
  4. void IapIdle()
  5. {
  6.         IAP_CONTR = 0;                //禁止IAP操作
  7.         IAP_CMD   = 0;                //去除IAP命令
  8.         IAP_TRIG  = 0;                //防止IAP命令误触发
  9.         IAP_ADDRE = 0x00;   //将地址设置到非 IAP 区域
  10.         IAP_ADDRH = 0x00;   //将地址设置到非 IAP 区域
  11.         IAP_ADDRL = 0x00;
  12. }
  13. u8 IapRead(u32 EE_address)
  14. {
  15.         char dat;
  16.         EA = 0;
  17.         IAP_CONTR = 0x80;                //使能IAP模式
  18.         IAP_TPS = 24; //设置IAP TPS为24,即IAP模式下时钟频率为24MHz
  19.         IAP_CMD = 1; //读指令
  20.         IAP_ADDRE = EE_address >> 16; //送地址高字节(地址需要改变时才需重新送地址)
  21.         IAP_ADDRH = EE_address >> 8;  //送地址中字节(地址需要改变时才需重新送地址)
  22.         IAP_ADDRL = EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
  23.         IAP_TRIG = 0x5A;
  24.         IAP_TRIG = 0xA5;                    //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
  25.         _nop_();   //由于AI8051U是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
  26.         _nop_();
  27.         _nop_();
  28.         _nop_();       
  29.        
  30.         dat = IAP_DATA;  //读取
  31.         IapIdle();       
  32.         EA = 1;
  33.         return dat;
  34. }
  35. void IapProgram(u32 EE_address,u8 dat)
  36. {
  37.         EA = 0;
  38.         IAP_CONTR = 0x80;                //使能IAP模式
  39.         IAP_TPS = 24; //设置IAP TPS为24,即IAP模式下时钟频率为24MHz
  40.         IAP_CMD = 2; //读指令
  41.         IAP_ADDRE = EE_address >> 16; //送地址高字节(地址需要改变时才需重新送地址)
  42.         IAP_ADDRH = EE_address >> 8;  //送地址中字节(地址需要改变时才需重新送地址)
  43.         IAP_ADDRL = EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
  44.         IAP_DATA = dat;  //写入
  45.         IAP_TRIG = 0x5A;
  46.         IAP_TRIG = 0xA5;                    //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
  47.         _nop_();   //由于AI8051U是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();       
  51.        
  52.         IapIdle();       
  53.         EA = 1;
  54. }
  55. void IapErase(u32 EE_address)
  56. {
  57.         EA = 0;
  58.         IAP_CONTR = 0x80;                //使能IAP模式
  59.         IAP_TPS = 24; //设置IAP TPS为24,即IAP模式下时钟频率为24MHz
  60.         IAP_CMD = 3; //擦除指令
  61.         IAP_ADDRE = EE_address >> 16; //送地址高字节(地址需要改变时才需重新送地址)
  62.         IAP_ADDRH = EE_address >> 8;  //送地址中字节(地址需要改变时才需重新送地址)
  63.         IAP_ADDRL = EE_address;         //送地址低字节(地址需要改变时才需重新送地址)
  64.         IAP_TRIG = 0x5A;
  65.         IAP_TRIG = 0xA5;                    //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
  66.         _nop_();   //由于AI8051U是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
  67.         _nop_();
  68.         _nop_();
  69.         _nop_();       
  70.        
  71.         IapIdle();       
  72.         EA = 1;
  73. }
  74. void main()
  75. {
  76.         SYS_Init();
  77.         // u8 buf10[10]={1,2,3,4,5,6,7,8,9,2};               
  78.         // u8 buf1[10];
  79.         // u8 i;
  80.         while(1)
  81.         {
  82.                 u8 dat;
  83.                 IapErase(0x0400);
  84.                 dat = IapRead(0x0400);
  85.                 printf("eeprom%d:%d\r\n",0x0400,dat);
  86.                 IapProgram(0x0400,0x12);
  87.                 dat = IapRead(0x0400);
  88.                 printf("eeprom%d:%d\r\n",0x0400,dat);               
  89.         }
  90. }
复制代码
按照手册的测试程序成功了,原因暂时不清楚。研究明白继续更贴
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:19
  • 最近打卡:2025-04-22 10:19:15
已绑定手机

9

主题

58

回帖

289

积分

中级会员

积分
289
发表于 2025-3-6 16:00:16 | 显示全部楼层
找到问题,官方的"AI8051U_EEPROM"没有定义"IAP_TPS",
所以直接用会卡死,解决方法也简单。修改这个地方就能正常
截图202503061557256308.jpg
运行了。找了半天了,这个是漏了还是故意的?我感觉官方给的库函数不应该出现这种问题


回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 20:55 , Processed in 0.778370 second(s), 101 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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