- #include "config.h"
- #include "Task.h"
- #include "system_init.h"
-
- void IapIdle()
- {
- IAP_CONTR = 0; //禁止IAP操作
- IAP_CMD = 0; //去除IAP命令
- IAP_TRIG = 0; //防止IAP命令误触发
- IAP_ADDRE = 0x00; //将地址设置到非 IAP 区域
- IAP_ADDRH = 0x00; //将地址设置到非 IAP 区域
- IAP_ADDRL = 0x00;
- }
-
- u8 IapRead(u32 EE_address)
- {
- char dat;
-
- EA = 0;
- IAP_CONTR = 0x80; //使能IAP模式
- IAP_TPS = 24; //设置IAP TPS为24,即IAP模式下时钟频率为24MHz
- IAP_CMD = 1; //读指令
-
- IAP_ADDRE = EE_address >> 16; //送地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRH = EE_address >> 8; //送地址中字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = EE_address; //送地址低字节(地址需要改变时才需重新送地址)
-
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
- _nop_(); //由于AI8051U是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
- _nop_();
- _nop_();
- _nop_();
-
- dat = IAP_DATA; //读取
- IapIdle();
- EA = 1;
- return dat;
- }
-
- void IapProgram(u32 EE_address,u8 dat)
- {
- EA = 0;
- IAP_CONTR = 0x80; //使能IAP模式
- IAP_TPS = 24; //设置IAP TPS为24,即IAP模式下时钟频率为24MHz
- IAP_CMD = 2; //读指令
-
- IAP_ADDRE = EE_address >> 16; //送地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRH = EE_address >> 8; //送地址中字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = EE_address; //送地址低字节(地址需要改变时才需重新送地址)
-
- IAP_DATA = dat; //写入
-
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
- _nop_(); //由于AI8051U是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
- _nop_();
- _nop_();
- _nop_();
-
- IapIdle();
- EA = 1;
- }
-
- void IapErase(u32 EE_address)
- {
- EA = 0;
- IAP_CONTR = 0x80; //使能IAP模式
- IAP_TPS = 24; //设置IAP TPS为24,即IAP模式下时钟频率为24MHz
- IAP_CMD = 3; //擦除指令
-
- IAP_ADDRE = EE_address >> 16; //送地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRH = EE_address >> 8; //送地址中字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = EE_address; //送地址低字节(地址需要改变时才需重新送地址)
-
- IAP_TRIG = 0x5A;
- IAP_TRIG = 0xA5; //先送5AH,再送A5H到IAP触发寄存器,每次都需要如此
- _nop_(); //由于AI8051U是多级流水线的指令系统,触发命令后建议加4个NOP,保证IAP_DATA的数据完成准备
- _nop_();
- _nop_();
- _nop_();
-
- IapIdle();
- EA = 1;
- }
-
-
- void main()
- {
- SYS_Init();
-
- // u8 buf10[10]={1,2,3,4,5,6,7,8,9,2};
- // u8 buf1[10];
- // u8 i;
-
- while(1)
- {
- u8 dat;
- IapErase(0x0400);
- dat = IapRead(0x0400);
- printf("eeprom%d:%d\r\n",0x0400,dat);
- IapProgram(0x0400,0x12);
- dat = IapRead(0x0400);
- printf("eeprom%d:%d\r\n",0x0400,dat);
- }
- }
复制代码
按照手册的测试程序成功了,原因暂时不清楚。研究明白继续更贴
|