关于 V307 的 I2C 读写 E2PROM 问题

板上接了一块 FT24C32A 的E2PROM, 挂在在 I2C2, SCL-->PB10, SDA-->PB11, 写数据地址是16位,2字节

同样的代码在F4上读写正常,但是无法在 V307上读取正确的数据。

但是, 进入Debug模式,利用单步跳过的方式走代码,又能读取出正确的数据。

读和写的代码中都已经做了等待总线空闲处理,全速运行时能够走完,但是打印出的数据不对。

官方例程也无法正常打印,会卡在I2C的某个状态中。

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


2.jpg

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


3.jpg

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


4.jpg

最后正确打印出 'E'。


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


1662748913683036.jpg

1662748913145870.jpg


请问问题原因在哪里,另外还有一个奇怪的问题,在写和读函数中间加入多个 printf 函数,不会打印这些信息,调试代码会发现进入I2C总线忙碌状态。

不明白为什么在没有printf函数的情况下,能够走完程序,不影响总线,而加了多个printf函数,会影响I2C总线。

更奇怪的事,反复进出调试模式,只是点调试和停止调试这两个按钮,这些printf函数又都能打印出来,不明白为什么会这样。

1662749166103892.jpg


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

icon_rar.gifIIC_EEPROM.zip

image.png


只有登录才能回复,可以选择微信账号登录