主控型号: STC8H3K64S2
用户EEPROM大小为1K(下载程序时配置)
-
- //sfr IAP_CMD = 0xC5;
- #define IAP_STANDBY() IAP_CMD = 0 //IAP空闲命令(禁止)
- #define IAP_READ() IAP_CMD = 1 //IAP读出命令
- #define IAP_WRITE() IAP_CMD = 2 //IAP写入命令
- #define IAP_ERASE() IAP_CMD = 3 //IAP擦除命令
-
- //sfr IAP_TRIG = 0xC6;
- #define IAP_TRIG() do{ IAP_TRIG = 0x5A, IAP_TRIG = 0xA5 } while(0) // IAP触发命令
-
- // 7 6 5 4 3 2 1 0 Reset Value
- //sfr IAP_CONTR = 0xC7; IAPEN SWBS SWRST CFAIL - - - - 0000,x000 //IAP Control Register
-
- #define IAP_EN (1<<7)
- #define IAP_SWBS (1<<6)
- #define IAP_SWRST (1<<5)
- #define IAP_CMD_FAIL (1<<4)
-
- #define IAP_ENABLE() do{ IAP_CONTR = IAP_EN; IAP_TPS = MAIN_Fosc / 1000000; } while(0)
- #define IAP_DISABLE() do{ IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRH = 0xff; IAP_ADDRL = 0xff; } while(0)
-
- void F_EEPROM_Test(void)
- {
- u16 EE_address = 0xFC00;
- u8 WrDataBuf[9] = {0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
- u8 RdDataBuf[9] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- u16 number;
- EA = 0; //禁止中断
-
- // 先擦除
- IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
- IAP_ERASE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
- //只有扇区擦除,没有字节擦除,512字节/扇区。
- //扇区中任意一个字节地址都是扇区地址。
- IAP_ADDRH = (EE_address) / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = (EE_address) % 256; //送扇区地址低字节
- //触发EEPROM操作
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_();
-
- // 写
- IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
- IAP_WRITE(); //宏调用, 送扇区擦除命令,命令不需改变时,不需重新送命令
- for (number = 0; number < 9; ++number)
- {
- //只有扇区擦除,没有字节擦除,512字节/扇区。
- //扇区中任意一个字节地址都是扇区地址。
- IAP_ADDRH = (EE_address) / 256; //送扇区地址高字节(地址需要改变时才需重新送地址)
- IAP_ADDRL = (EE_address) % 256; //送扇区地址低字节
- IAP_DATA = WrDataBuf[number];
-
- //触发EEPROM操作
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_();
- EE_address++;
- }
-
-
- EE_address = 0xFC00;
- IAP_ENABLE(); //设置等待时间,允许IAP操作,送一次就够
- IAP_READ(); //送字节读命令,命令不需改变时,不需重新送命令
- for (number = 0; number < 9; ++number)
- {
- IAP_ADDRH = EE_address / 256; //设置 IAP 地址高字节
- IAP_ADDRL = EE_address % 256; //设置 IAP 地址低字节
- IAP_TRIG = 0x5a; //写触发命令(0x5a)
- IAP_TRIG = 0xa5; //写触发命令(0xa5)
- _nop_();
- _nop_();
- RdDataBuf[number] = IAP_DATA; //读 IAP 数据
- EE_address++;
- }
-
- // 判断写入与读出数据是否相同
- for (number = 0; number < 9; ++number)
- {
- if(RdDataBuf[number] != WrDataBuf[number])
- {
- break;
- }
- }
-
- if(number < 9)
- {
- P55 = 0;
- _nop_(); // 不同 仿真运行时跳到此处
- }
- else
- {
- P55 = 1;
- _nop_(); // 相同
- }
- EA = 1; //使能中断
- }
复制代码
能不能帮看看是哪的问题?谢谢.
另外问一下,写FLASH完成后,能不能有Memory里观察到数据的变化?
还在STC-ISP里的EEPROM文件这设置的EEPROM数据,通过下载到MCU后,在Memory只能看到代码部分是有数据(非0xff),
但EEPROM数据看不到,还是这颗IC,EEPROM空间为1K,那EEPROM数据应该是从0xFC00开始存放吧? |