继续研究AI8051U的32位模式的EEPROM
很奇怪的现象同样的代码,8位下是没问题的,32位就全乱了,取得变量的地址时需要-1才行,感觉对于INT型的地址8位指向高字节,32位指向低字节
为了得到连续的地址方便存储,几个数组的数据是用_at_指定绝对地址
在产生EEPROM数据的文件里面也用这个方法,结果出现一个问题,前边3个数组的数据都是对的,最后一个却不对。
琢磨半天,把这几个数组放到一个结构体里面,这样就直接获得连续地址了,在读的时候
read(0x00,(uchar*)0x10,(uchar*)&myeep-1,sizeof(myeep));
一样还是得-1,否则也一样,但是,最后那个数组的数据对了。
有点乱,看起来之前都是自学的,很多东西都是用到才研究的。基础不行啊。
另外一个请教,sizeof();的问题,无论8位还是32位模式,取得的都是字节数吗?比如sizeof(int),在8位模式是2,在32模式也是2还是1?
尝试只用一个数组读写,发现最后一个INT的低字节读出来的是0
需要在read的最后那个size参数那里+1,才能得到正确的数据 但是我问了百度,C51和C251都是低字节在前并且都是指向低字节的
但是在工具软件里面打开的EEPROM文件,观察内容,8位模式和32位模式下的内容是一样的
数据是这样的
生成的文件打开的内容
从210地址开始读8个字节,结果就是arr就等于0x1200,需要读9个字节才会等于0x1234,
如果在传输内存地址的时候不-1,那就有一个字节的错位,得到的数据全是错误的。需要读9个字节应该就是因为地址-1的问题吧。
请教前辈,这到底为啥?
8位模式下都是正常使用的代码。
无论怎么搞都差一个字节
现在就是读的时候从0x11开始,写的时候从0x10开始
这样数组的后面数据是对的,但是第一个成员的数据就错了,截图里面,第一个成员是0000,但是读出来的数据是5680
void read(uchar sq,unsigned char * eadd,unsigned char * nbadd,unsigned char size){
unsigned char i = size;
EA = 0;
while(i--){
IAP_TPS = 33;
IAP_ADDRE = 0;
IAP_ADDRH = sq; //0x10=使用第9扇区
IAP_ADDRL = (char*)eadd;
IAP_CONTR = 0x80|IAP_WAIT_TIME; //22M
IAP_CMD = IAP_BYTE_READ; //读命令
IAP_TRIG= 0x5A;IAP_TRIG= 0xA5; //启动IAP
*nbadd = IAP_DATA;
nbadd++;eadd++;
}
IAP_CONTR = 0;
IAP_CMD = 0;
IAP_TRIG= 0;
IAP_ADDRH = 0xff; //重新指向第0扇区
EA = 1;
}
void save(uchar sq,unsigned char *eadd,unsigned char *nbadd,unsigned char size){
unsigned char i = size;
EA = 0;
IAP_TPS = 33;
IAP_CONTR = 0x80;
IAP_ADDRH = sq; //0x10=第9扇区
IAP_ADDRL = 0x00;
IAP_CMD = IAP_SECTOR_ERASE; //擦除命令
IAP_TRIG= 0x5A;IAP_TRIG= 0xA5; //启动IAP
while(i--){
IAP_ADDRE = 0;
IAP_ADDRH = sq;
IAP_ADDRL = (char*)eadd;
IAP_CONTR = 0x82; //11M
IAP_CMD = IAP_BYTE_PROG; //写入命令
IAP_DATA = *nbadd;
IAP_TRIG= 0x5A;IAP_TRIG= 0xA5; //启动IAP
nbadd++;eadd++;
}
IAP_CONTR = 0; //关闭IAP
IAP_CMD = 0;
IAP_TRIG= 0;
IAP_ADDRH = 0xff; //重新指向第0扇区
EA = 1;
}
参考AI8051U实验箱19个读写EEPROM的测试程序
AI-32位8051 发表于 2026-5-16 08:39
参考AI8051U实验箱19个读写EEPROM的测试程序
感谢,已经弄好了,启动IAP后需要等待一下,加几个NOP,就OK了
页:
[1]