最近要读写 24C256,没有参考网上代码,自己撸了几个小时,总是不对,读取结果总是 0xFF,但是ACK的返回都是正确的,经过一番努力,终于找到问题所在了。

在芯片规格书里面时序图只有 START 和 STOP,没有 RESTART,问题就是出在 RESTART 上面, 下图是 I2C 标准里面的图片。

对于 I2C 这种串行协议,根据不同的断句有两种写法。

第一种:

  1. START中先是 SCL, SDA 为高,然后 SDA 为低。
  2. 每bit 都是 SCL 为低,SDA输出,SCL 为高。 ACK 也是类似。
  3. STOP中先是 SCL 低,SDA低,然后 SCL 高, SDA 高。

第二种:

  1. START中先是 SCL, SDA 为高,然后 SDA 为低,然后 SCL 为低
  2. 每bit 都是 SDA输出,SCL 为高,然后 SCL 为低。 ACK 也是类似。
  3. 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 是正常的解决方法的更多相关文章

  1. maven项目无法读取src/main/java目录下的配置文件解决方法

    我们在用Mybatis去操作底层数据库的时候,需要用到xml配置文件,一般我们是把配置文件和dao放置在同一层目录.但是在用idea操作maven项目的时候,我们可能会遇到无法读取到dao对应的map ...

  2. Maven ResourceBundle.getBundle读取Properties异常MissingResourceException: Can't find bundlei解决方法

    参考:https://blog.csdn.net/thousa_ho/article/details/72817616 问题描述 ResourceBundle读取properties配置文件提示 Mi ...

  3. php读取json时无数据(为空)的解决方法

    在使用PHP调用一些json接口文件时 如果使用 file_get_contents 获取页面json数据后 再使用json_decode()解析后 数据无法正常输出 这是的返回值为null 这是由于 ...

  4. 读取Excel异常定义了过多字段的解决方法

    /// <summary> /// 从Excel文件导入数据 /// </summary> /// <param name="ExcelStr"> ...

  5. 关于 K210 MaixPy 的 I2C 读取设备,搜索不到设备,通信失败的一些原因以及解决方案。

    近来对 amigo 开发期间的遇到 I2C 问题做一下总结. 我们发现有一些 I2C 设备搜索不到,主要原因是 DATA 的信号衰减,也可能是 I2C 的总线被拉住了. 软件层面的问题 例如在实现 A ...

  6. I2C死锁原因及解决方法(转)

    源:http://blog.csdn.net/zyboy2000/article/details/5603091 死锁总线表现为:SCL为高,SDA一直为低 现象:单片机采用硬件i2c读取E2PROM ...

  7. C#读取Excel遇到无法读取的解决方法

    C#读取Excel遇到无法读取的解决方法:1.在导入数据连接字符串中,将IMEX=1加入,“Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\ ...

  8. PHP file_get_contents函数读取远程数据超时的解决方法

    PHP file_get_contents函数读取远程数据超时的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了PHP file_get_contents函数读取 ...

  9. 编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时会产生Additional information: 阅读器关闭时尝试调用 Read 无效问题,解决方法与解释

    在自学杨中科老师的视频教学时,拓展编写SqlHelper使用,在将ExecuteReader方法封装进而读取数据库中的数据时 会产生Additional information: 阅读器关闭时尝试调用 ...

随机推荐

  1. atom添加eslint插件

    在atom编辑器里添加插件,操作步骤如下:以atom-ide-vue插件为例 //切换到插件目录cd /Users/name/.atom/packages //将需要下载插件的源代码拉下来git cl ...

  2. NodeJs学习笔记(三)

    最近在用sails框架写移动后台,马上就过年了,打算总结一下.   1.资源      node官方网站: www.nodejs.org      sails官方网站:www.sailsjs.org ...

  3. 前端MVC Vue2学习总结(三)——模板语法、过滤器、计算属性、观察者、Class 与 Style 绑定

    Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解 ...

  4. 关于llvm kaleidoscope: 记一次Debug血泪之路

    简而言之,慎(bu)用(yong)全局变量! 这次debug基本上花了我一周的时间,我基本上是晚上9点30下自习回然后调试到11点30,如此反复一周直到今天周五终于解决了,,以前都听说前辈们 说尽量不 ...

  5. Spring入门篇总结:

    本文是对慕课网上"搞定SSM开发"路径的系列课程的总结,详细的项目文档和课程总结放在github上了.点击查看 视频传送门:Spring入门篇 该门课程主要从Spring的Bean ...

  6. PHP 购物车 php闭包 array_walk

    <?php class Cart { const PRICE_BUTTER = 1.00; const PRICE_MILK = 3.00; const PRICE_EGGS = 6.95; p ...

  7. 使用图片地图减少HTTP请求数量

    前言 最近在看<高性能网站建设>,记录一下所学. 现在很多网站都是图片形式的导航,点击图片跳转到对应的链接.如果导航项目很多的话,图片的数量就会很多,每需要加载一张图片就会多一个HTTP请 ...

  8. Java的虚方法

    虚方法出现在Java的多态特性中, 父类与子类之间的多态性,对父类的函数进行重新定义.如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding).在Java中,子类 ...

  9. APP瘦身绝技(快速减少包大小)

    如果要清理无用类文件和无用图片,参考博客<iOS 清理Xcode项目中没有使用到的图片资源和类文件>.当下众多app项目,尤其是初创公司,明显的特点就是,开发周期短,迭代更新快,甚至一周一 ...

  10. numpy库常用基本操作

    NumPy数组的维数称为秩(rank),一维数组的秩为1,二维数组的秩为2,以此类推.在NumPy中,每一个线性的数组称为是一个轴(axes),秩其实是描述轴的数量.比如说,二维数组相当于是一个一维数 ...