1. I2C扫描出的地址“错误”
看代码中I2C地址是0x78H,结果扫描出来是0x3c —— 没有注意到它们是两倍关系。
I2C.scan()扫描出来的确实是地址,只有7bit,比如0x3c:0111100XB;
写入数据的时候最后一位填0或1,分别表示读写,所以代码上面才会有0x78H。
2. 摄像头的I2C设备总是扫描不到?
这是我遇到的第一个问题,我以为I2C不通,所以买了OLED096用来测试I2C通路。
使用SoftI2C调通OLED096之后,同样的代码再来调试OV7670还是不通;
经过查询得知OV7670需要MCLK提供clock才可以正常I2C通信,于是PWM安排上,不通。
买了一个便宜的逻辑分析仪,看到现象:
OLED096在哪个PIN都可以被I2C识别,同样的代码换到OV7670却不可以,SDA和SCL巍然不动。
想要使用手动实现以下I2C,实现之前脑子一热:再试一下PICOW的硬件I2C吧,结果竟然读出来OV7670的slave addr?!
焕然大悟:这应该是硬件差别,也就是上拉电阻的区别!
3. I2C与上拉电阻
I2C通信的时候,master和slave的SDA与SCL连接后,至少有一个设备要通过上拉电阻连接至高电平。
PICOW的硬件I2C:把SCL和SDA都上拉至高电平 —— 可以接任何设备;
软件I2C:把SCL上拉高电平,SDA则只是设置为开漏 —— 只能接上拉至高电平的I2C设备;
OLED的I2C带有上拉电阻,所以使用任意PIN的软件I2C均可以;
OV7670的I2C没有通过上拉电阻接到高电平,与软件I2C连接的时候,高电平其实就是两个开路,当然无法通信了。
关于开漏输出和推挽输出,这个文档写的很清晰易懂:https://zhuanlan.zhihu.com/p/41942876
3. 为什么要使用软件I2C?
硬件I2C无法提供I2C.start()和I2C.stop()等操作!软件I2C可调用的接口更多。
4. I2C正常波形一图秒懂
5. 解决方法
a. 使用硬件I2C + 手动实现一些函数
b. 使用软件I2C,添加上拉电阻
c. 全部手动实现I2C
标签:电阻,高电平,OV7670,避坑,上拉,PICOW,I2C From: https://www.cnblogs.com/Younger-Zhang/p/16905828.html