I2C 读取总是 0xFF,但是 ACK 是正常的解决方法
最近要读写 24C256,没有参考网上代码,自己撸了几个小时,总是不对,读取结果总是 0xFF,但是ACK的返回都是正确的,经过一番努力,终于找到问题所在了。
在芯片规格书里面时序图只有 START 和 STOP,没有 RESTART,问题就是出在 RESTART 上面, 下图是 I2C 标准里面的图片。

对于 I2C 这种串行协议,根据不同的断句有两种写法。
第一种:
- START中先是 SCL, SDA 为高,然后 SDA 为低。
- 每bit 都是 SCL 为低,SDA输出,SCL 为高。 ACK 也是类似。
- STOP中先是 SCL 低,SDA低,然后 SCL 高, SDA 高。
第二种:
- START中先是 SCL, SDA 为高,然后 SDA 为低,然后 SCL 为低
- 每bit 都是 SDA输出,SCL 为高,然后 SCL 为低。 ACK 也是类似。
- STOP中先是 SDA低,然后 SCL 高, SDA 高。
对于这两种写法,初看上去好像没有什么效果是一样的,但是实际上是有区别的,第一种有BUG,第二种没有问题。网上很多I2C都是按照第二种方法来写的。第一种的BUG就是在读取数据的时候体现出来的。因为读取数据首先需要写入地址,然后不用STOP,直接RESTART,读取数据。
按照第一种的写法,ACK结束的时候 SCL 为高,SDA 为低,然后接上 START,SCL为高,SDA为高,然后SDA为低。
按照第一种的写法,ACK结束的时候 SCL 为低,SDA 为低,然后接上 START,SCL为高,SDA为高,然后SDA为低。
相当于第一种写法,在 RESTART的时候,吞掉了一个 SCL 为低的过程。而这种 BUG 在 STOP 的时候是正常的,ACK 的返回也是正常的,但就是读取数据的时候, 因为 RESTART不对,导致读取都是 0xFF.
找到问题了,那么有两种解决方法,一种是直接按照第二种去写,还有一种是直接增加一个 RESTART的函数,在这个函数里面先 SCL 为低,然后接上正常的START函数即可。
通过这次的调试,也能发现标准的重要性,很多规格书里面都是粗略的介绍,真正详细的还是要找到通讯协议的标准。
I2C 读取总是 0xFF,但是 ACK 是正常的解决方法的更多相关文章
- maven项目无法读取src/main/java目录下的配置文件解决方法
我们在用Mybatis去操作底层数据库的时候,需要用到xml配置文件,一般我们是把配置文件和dao放置在同一层目录.但是在用idea操作maven项目的时候,我们可能会遇到无法读取到dao对应的map ...
- Maven ResourceBundle.getBundle读取Properties异常MissingResourceException: Can't find bundlei解决方法
参考:https://blog.csdn.net/thousa_ho/article/details/72817616 问题描述 ResourceBundle读取properties配置文件提示 Mi ...
- php读取json时无数据(为空)的解决方法
在使用PHP调用一些json接口文件时 如果使用 file_get_contents 获取页面json数据后 再使用json_decode()解析后 数据无法正常输出 这是的返回值为null 这是由于 ...
- 读取Excel异常定义了过多字段的解决方法
/// <summary> /// 从Excel文件导入数据 /// </summary> /// <param name="ExcelStr"> ...
- 关于 K210 MaixPy 的 I2C 读取设备,搜索不到设备,通信失败的一些原因以及解决方案。
近来对 amigo 开发期间的遇到 I2C 问题做一下总结. 我们发现有一些 I2C 设备搜索不到,主要原因是 DATA 的信号衰减,也可能是 I2C 的总线被拉住了. 软件层面的问题 例如在实现 A ...
- I2C死锁原因及解决方法(转)
源:http://blog.csdn.net/zyboy2000/article/details/5603091 死锁总线表现为:SCL为高,SDA一直为低 现象:单片机采用硬件i2c读取E2PROM ...
- C#读取Excel遇到无法读取的解决方法
C#读取Excel遇到无法读取的解决方法:1.在导入数据连接字符串中,将IMEX=1加入,“Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\ ...
- PHP file_get_contents函数读取远程数据超时的解决方法
PHP file_get_contents函数读取远程数据超时的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了PHP file_get_contents函数读取 ...
- 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释
在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...
随机推荐
- 将java项目打包为jar
打开Eclipse,点击file,选择export 选择java,选择其中的JAR file并点击next 选择需要的到处的项目,并在下方输入将项目保存为的目录,文件名字. 如果,已经将项目打包为一个 ...
- 设置两个div是总是不能重合,浏览器user agent stylesheet问题
如图 两个div之间总是有一个空行,设置了margin为0还是没卵用,f12调试发现 多了一个user agent stylesheet样式,经百度是浏览器自带的样式 重新为div内的元素ul设置cs ...
- 数据加密,android客户端和服务器端可共用
安卓中,不管是内网还是外网,数据的传输首要考虑就是安全问题,尤其是用户信息,以及各种密码等敏感信息. 所以说,对数据的加密是很有必要的,尤其是当下物联网蓬勃发展的今天,数据安全尤为重要. 数据加密的方 ...
- JeeSite如何正确连接SQL SERVER 数据库
JeeSite如何正确连接SQL SERVER 数据库 jeesite介绍 感谢jeesite项目的作者thinkgem. 没有你我也不会更改这数据源非了恁大的劲,,,,嘻嘻嘻说多了. JeeSite ...
- APP上传APP Store遇到的各种问题
内容含敏感话题或对苹果不友好的信息(如苹果婊) 使用了友盟的统计SDK,获取了IDFA但是上传填写无广告 采用友盟IDFA的sdk,并用友盟的默认淘宝页面广告,被告知和产品内容不符(最近) App在i ...
- VS2012 未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService
最近新换了系统还真是问题多多呀!! 系统更新补丁后打开 VS2012 ,新建C#项目的时候出现这个问题 VS2012 未找到与约束ContractName Microsoft.VisualStudio ...
- button的用法
C# 如何去掉button按钮的边框线? 设置FlatStyle为Flat,并且设置FlatAppearance下的BorderSize为0.
- ArcGIS 网络分析[8.4] 资料4 聚合——创建及打开网络数据集的类实现
这篇是对前三篇的总结,因为网络数据集涉及的"点"太多了,我只能挑重点来设置,大家明白框架后可以自行寻求帮助文档添加功能. 我以C#类的形式给出,这个类包含很多种方法,因为本人的C# ...
- ntopng 推送solr
1.修改代码在且不说 2.修改完之后先卸载原先的ntopng 使用 whereis ntopng 找到安装目录,然后删除 /usr/local/bin/ntopng /usr/local/share/ ...
- JQ 为未来元素添加事件处理器—事件委托
随着DOM结构的复杂化和Ajax等动态脚本技术的运用,有了较多的动态添加进来的元素,直接用JQ添加click事件会发现新添加进来的元素并不能直接选取到,在这里就需要用到事件委托方法,JQ为事件委托提供 ...