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

 

原文地址:http://www.cnblogs.com/Younger-Zhang/p/16905828.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性