xiaobendan 发表于 2026-5-14 17:06:14

继续研究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?

xiaobendan 发表于 2026-5-14 17:40:15

尝试只用一个数组读写,发现最后一个INT的低字节读出来的是0
需要在read的最后那个size参数那里+1,才能得到正确的数据

xiaobendan 发表于 2026-5-14 18:21:49

但是我问了百度,C51和C251都是低字节在前并且都是指向低字节的
但是在工具软件里面打开的EEPROM文件,观察内容,8位模式和32位模式下的内容是一样的
数据是这样的
生成的文件打开的内容
从210地址开始读8个字节,结果就是arr就等于0x1200,需要读9个字节才会等于0x1234,
如果在传输内存地址的时候不-1,那就有一个字节的错位,得到的数据全是错误的。需要读9个字节应该就是因为地址-1的问题吧。
请教前辈,这到底为啥?
8位模式下都是正常使用的代码。

xiaobendan 发表于 2026-5-14 19:43:16

无论怎么搞都差一个字节
现在就是读的时候从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;
}

AI-32位8051 发表于 2026-5-16 08:39:25

参考AI8051U实验箱19个读写EEPROM的测试程序

xiaobendan 发表于 2026-5-16 08:59:22

AI-32位8051 发表于 2026-5-16 08:39
参考AI8051U实验箱19个读写EEPROM的测试程序

感谢,已经弄好了,启动IAP后需要等待一下,加几个NOP,就OK了
页: [1]
查看完整版本: 继续研究AI8051U的32位模式的EEPROM