一、踩坑缘由

在调试 I2C 器件时,我一般习惯于使用 i2cdetect 工具来确认芯片是否有应答,通常有应答之后,就会开始着手移植或者编写对应的驱动程序,但是在调试 sgp41 传感器时却不灵了。

二、问题现象

在连续完成多个 I2C 器件的调试和驱动开发之后,最后一个 sgp41 传感器却一直无法被检测到。在使用示波器再次测量芯片供电、检查I2C波形、引脚顺序、电平匹配都正确后,认为是芯片坏了,换了多颗芯片,都无法识别,寄给供应商,供应商又说检测良好,这就很神奇了。

在同一个座子上,sht41 都能正常被检测到,但是 sgp41 却无法检测,更何况该总线上还挂了其它的 I2C 器件都能准确检测出来。

三、问题分析

百思不得其解,在仔细观察逻辑分析仪解析的结果,发现在检测 0x44(sht41) 器件地址的时候,i2cdetect 使用的是采用写的方式检测,而检测 0x59(sgp41) 器件地址时,采用读的方式检测。

由于之前调试过 sht41 器件,知道这类传感器需要先写再读,才会有应答信号(规格书没有体现出来),因此推测跟这个有关。手写了一个 I2C 设备驱动,先写再读取,发现可以正常通信,证实了我的猜测。

四、深入分析

我特别好奇的是,为什么 i2cdetect 工具会对不同的地址段采用不同的方式进行检测,我分析了 i2cdetect.c 源代码,发现默认是以自动模式检测,而自动模式则会根据不同的地址段采取读或写来实现检测。

源码下载:http://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.0.tar.gz

如果需要检测类似 sht41、sgp41 这种必须要先写再读才会有应答的芯片,就必须要指定检测模式为写检测(MODE_QUICK),由于 sht41 的器件地址 0x44 恰好在自动模式中以写的方式检测,因此可以检测得到。通过分析源码发现,-r 和 -q 即可指定读写模式:

下图为指定以写的方式检测 sgp41(0x59),可以发现有应答信号,被检测出来了:

五、经验总结

1. 不是所有的 I2C 器件都会直接响应读请求。
2. 使用 i2cdetect 工具检测芯片,建议使用 -q 和 -r 参数都试试。

最新文章

  1. 解析UML箭头、线条代表的意义(转)
  2. [转]<jsp:include>和<%@include%>的区别
  3. BufferedReader与BufferedWriter读写中文乱码问题
  4. dbca:Exception in thread "main" java.lang.UnsatisfiedLinkError: get
  5. SAP接口编程 之 JCo3.0系列(04) : 会话管理
  6. UIImagePickerController拍照与摄像(转)
  7. 武汉北大青鸟解读2016年10大IT热门岗位
  8. kindeditor-4.1.10在线编辑器的使用[多个]
  9. Mesh绘制雷达图(UGUI)
  10. [Oracle] 参数修改小结
  11. 七天学会ASP.NET MVC (四)——Layout页面使用和用户角色管理 (代码下载)
  12. 201521123033《Java程序设计》第11周学习总结
  13. python学习之装饰器-
  14. 联想G510F1F2..功能键和FN+功能键反过来
  15. 重新学习Java的开始~
  16. springboot 返回json字符串格式化问题
  17. pax3 quick start guide
  18. Ubuntu 关闭触摸板
  19. centos7.4安装nginx
  20. 大叔力量VIP介绍

热门文章

  1. 虚拟机VMware运行Ubuntu时无法和主机之间复制粘贴的问题
  2. Jekyll于windows中使用
  3. 【k8s连载系列】k8s介绍
  4. VO层
  5. CC3
  6. Latex数学公式学习
  7. Go语言核心36讲20
  8. labuladong
  9. i春秋phone number
  10. 8 STL-stack