野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23349|回复: 3

I2C—读写EEPROM

[复制链接]
发表于 2020-11-30 17:26:29 | 显示全部楼层 |阅读模式
书中例子的while条件为 :!(I2C_ReadRegister(EEPROM_I2Cx,I2C_Register_SR1)&0x0002),书中对于这一段的解释是,对EEPROM发送地址后,等待EEPROM响应,响应成功后ADDR置1。
既然是检测EEPROM对于地址广播的响应,我就想检测事件函数应该也可以,于是我将while条件改为了:!(I2C_CheckEvent(EEPROM_I2Cx,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
即检测事件6是否在广播地址后发生。但编译下载后,USART打印出写入的数据后,返回一个错误<<-EEPROM-ERROR->> I2C 等待超时!errorCode = 4。
即在页写入的过程中,检测到总线一直繁忙而导致超时。为什么会产生这样的错误呢。
野火论坛202011301725557243..png
野火论坛202011301726163629..png
野火论坛202011301726259574..png
回复

使用道具 举报

 楼主| 发表于 2020-11-30 20:39:10 | 显示全部楼层
改成按字节写入后,由于循环,不断打印错误,当循环达到256后,出现写成功,之后读取也成功。
野火论坛202011302039039952..png
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-30 22:07:46 | 显示全部楼层
第一次修改while条件时可能把别的地方也修改了。

因为后来检查发现TRA位状态为一直为0,导致根本跳不出WaitEepromStandbyState循环,也就无法打印错误信息。

第二次改用I2C_BytesWrite函数,如果while条件还是采用采用checkevent的方式,同样应该造成死循环。

如果采用书上的while条件,同时修改写入方式为BytesWrite的话,将会造成 2# 的情况,

因为TRA位一直为0,ByteWrite函数的checkevent一直超时,打印错误;

但外层BytesWrite不会停止循环,一直到256次也就是数组的大小,写入完成,同时报错停止。读出数据正常,说明写入正常。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-1 16:01:50 | 显示全部楼层
3#的回复中有些错误,实际上报错errorcode=1之前循环的256次里,并没有成功写数值到存储器中,

最后读取数据成功是因为当时检验的时候没有将EEPROM上已经记录的数据擦除。现在我们在第一行就用BuffWrite写入一个元素全是0的数组。

wait函数里采用书上的while条件,同时用BytesWrite方式写存储器。

其中如果BytesWrite先调用wait函数,再调用ByteWrite函数,以这样的方式写存储器,则只报错errorcode=1一次;读数据显示全为0,写入失败。
如果BytesWrite先调用ByteWrite函数,再调用wait函数,则不会报错,但数据写入失败,读取数据依然全是0。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 08:28 , Processed in 0.032255 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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