WCH沁恒单片机
直播中

吴湛

10年用户 914经验值
擅长:417804
私信 关注
[问答]

CH32V307的 I2C读写E2PROM数据错误怎么处理?

板上接了一块 FT24C32A 的E2PROM, 挂在在 I2C2, SCL-->PB10, SDA-->PB11, 写数据地址是16位,2字节
同样的代码在F4上读写正常,但是无法在 V307上读取正确的数据。
但是, 进入Debug模式,利用单步跳过的方式走代码,又能读取出正确的数据。
读和写的代码中都已经做了等待总线空闲处理,全速运行时能够走完,但是打印出的数据不对。
官方例程也无法正常打印,会卡在I2C的某个状态中。

把 'E' 写入, 再读出放入 ch2中。



打印出来的是方块,%d打出来的是-95。



Debug中,走到读出寄存器值时,已经正确读出来了。



最后正确打印出 'E'。


等待总线空闲程序,放在写字节函数的结尾、读字节函数的开头。






请问问题原因在哪里,另外还有一个奇怪的问题,在写和读函数中间加入多个 printf 函数,不会打印这些信息,调试代码会发现进入I2C总线忙碌状态。
不明白为什么在没有printf函数的情况下,能够走完程序,不影响总线,而加了多个printf函数,会影响I2C总线。
更奇怪的事,反复进出调试模式,只是点调试和停止调试这两个按钮,这些printf函数又都能打印出来,不明白为什么会这样。




回帖(1)

周密

2022-9-14 14:40:34
您好,若你使用官方例程也有问题,应该是卡死在EV6事件,主要是由于在判断EV6事件的时候,EEPROM此时还在写入数据,地址发送了过去,但并没有产生应答,可在判断EV6事件加一个延时,应该可以解决该问题,如下图。附件为测试例程,可测试一下。后续若有问题,可通过邮箱和我联系(lzs@wch.cn)
IIC_EEPROM.zip
举报

更多回帖

发帖
×
20
完善资料,
赚取积分