https://blog.csdn.net/ctyqy2015301200079/article/details/83830326  (此文章可能有误)

从目前来看,所有读写操作(包括ACK的读写)都是CLK=0,保持, 读取SDA后,CLK=1, 保持

起始信号和终止信号,都是先保持CLK=1,  然后前者SDA从1变为0, 后者SDA从0变1

其实CLK=0的作用代表要读写了, CLK=1的作用为恢复普通态, TODO。。。 占从设备角度看待是如何接受主设备的CLK命令的

起始信号

  SDA,SCL设置为输出模式

  SDA=1, SCL=1, 保持

  SDA=0, 保持

终止信号

  SCL=0, SDA=0, 保持

  SCL=1, 保持

  SDA=1, 保持

  SDA, SCL设置为输入模式  

  // 有些人的描述为 SCL高电平时,SDA由低变高  

单字节读

  SDA设置为输入模式

  循环8次:

    SCL=1, 读SDA, 保持

    SCL=0, 保持

  从设备在SCL=0时可能已经准备好了SDA给主设备去读取

主控器发送ACK (读入一个字节后需要发送ACK)

  SDA设置为输出模式

  SCL=0, SDA=0, 保持

  SCL=1, 保持

  SCL=0, 保持

单字节写

  SDA设置为输出模式

  循环8次:

    SCL=0,保持

    写SDA, SCL=1, 保持

  最后

    SCL=0

  此处,输出SDA后, 怀疑是保持了一段时间, 再设置SCL=1,

  实际上输出SDA可能不需要保持一段时间再设置SCL=1,因为SCL=1在SDA之后设置的,SCL=1时,从设备才开始读入主设备设置的SDA

主控器读取ACK (写入一个字节后需要读ACK)

  SDA设置为输入模式

  SCL=1, 读SDA, 保持

  SCL=0, 保持

(这里可能是SCL=0, 读SDA, 保持,然后再SCL=1保持)

  此处写字节的最后一个位写完之后, 主设备SDA更换为读入模式, 而从设备马上就拉低了SDA代表收到了写入的字节

读数据流程:

  1. 先发送开始信号S

  2. 再发送从设备地址(7位,bit7~bit1), 再发送读标记1 (bit0为1代表读数据), 再读入ACK (用于判断从设备是否收到了地址)  

  3. 读入一个字节, 再发送ACK(告诉从设备已经读入了该字节)

  4. 重复3去读取多个数据 (其实在3之前可能要写入一个寄存器地址或者寄存器的起始,之后才是读入多个数据)

  5. 发送停止信号P

写数据流程

  1. 先发送开始信号S

  2. 再发送从设备地址(7位,bit7~bit1), 再发送读标记0 (bit0为0代表写数据), 再读入ACK (用于判断从设备是否收到了地址)

  3. 写入一个字节, 再读入ACK(用于判断从设备是否收到了此字节)

  4. 重复3去写入多个数据 (通常是写入两个数据, 一个寄存器地址和一个数据, 但是有些从设备定义的应用协议为寄存器起始地址 + 一大堆数据)

  5. 发送停止信号P

  

硬件协议之i2c的更多相关文章

  1. 硬件GPIO,UART,I2C,SPI电路图

  2. I2C总线通讯协议

    I2C总线通讯协议 1. I2C总线简介 I2C是Inter-Integrated Circuit的简称,读作:I-squared-C.由飞利浦公司于1980年代提出,为了让主板.嵌入式系统或手机用以 ...

  3. SPI、I2C、UART三种串行总线协议的区别

    第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous R ...

  4. SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

    SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...

  5. 转载:关于STM32硬件I2C读写EEPROM代码实现原理的理解与总结

    http://home.eeworld.com.cn/my/space-uid-716241-blogid-655190.html 一.I2C协议简介 I2C是两线式串行总线,用于连接微控制器及其外围 ...

  6. I2C的协议层和物理层

    I2C 协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART.CAN 等通讯协议的 ...

  7. i2c协议简要分析(转载)

    声明 本文大部分内容为转载,因此标定为转载 源地址: http://www.cnblogs.com/zym0805/archive/2011/07/31/2122890.html http://blo ...

  8. I2C的基本概念和协议

    概念   I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息.  主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任 ...

  9. I2C总线和S5PV210的I2C总线控制器

    一.什么是I2C通信协议? 1.物理接口:SCL + SDA (1)SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道. (2)SDA(serial ...

  10. Linux I2C总线设备驱动模型分析(ov7740)

    1. 框架1.1 硬件协议简介1.2 驱动框架1.3 bus-drv-dev模型及写程序a. 设备的4种构建方法a.1 定义一个i2c_board_info, 里面有:名字, 设备地址 然后i2c_r ...

随机推荐

  1. dafny : 微软推出的形式化验证语言

    dafny是一种可验证的编程语言,由微软推出,现已经开源. dafny能够自我验证,可以在VS Code中进行开发,在编辑算法时,写好前置条件和后置条件,dafny验证器就能实时验证算法是否正确. 在 ...

  2. i春秋Hash

    打开题目页面是一个超链接 先查看源码得到一段信息 没什么,这只是超链接跳转的信息 点击跳转到下一个界面 提示我们如果我们的传入不是123,123也就是key了,在上面的url就可以看到 如果key!= ...

  3. i春秋Not Found

    点开网页,显示404,告诉我们404.php的存在,我们先试试404.php,打开是haha四个字母,源码和抓包都没看到什么,然后其抓包,也没什么,无功,返回原网页,抓包,没发现什么的感觉,go一遍, ...

  4. Blender修改视野范围

    首先,我不是专门的建模人员.但是有时候会拿到建模人员的制作的模型导入进行修改. 比如简单的删除某个模型,调整模型的尺寸. 还有就是调整模型的建模中心点,这点有时候显得特别重要,模型的中心点偏离较大会给 ...

  5. <二>强弱指针使用场景之 多线程访问共享对象问题

    代码1 #include <iostream> #include <thread> using namespace std; class A { public: A() { c ...

  6. k8s-学习笔记总结(从入门到放弃的学习路线)

    刚入门学习k8s,我觉得挺难的,一头雾水,买了一本<Kubernetes权威指南>,真的很厚.我觉得作为应用开发人员的学习路线,不要想着一口气看完k8s的所有概念,要逐步学习,要看完这么厚 ...

  7. lv逻辑卷

    一.逻辑卷的使用 1.逻辑卷的概念 LVM(逻辑卷管理) 适合于管理大存储设备,并允许用户动态调整文件系统的大小.此外,LVM 的快照功能可以帮助我们快速备份数据.LVM 为我们提供了逻辑概念上的磁盘 ...

  8. Go 快速入门指南 - 序言

    这本书是写什么的? 这是一本 Go 语言快速入门手册,目标读者是有任一编程语言基础,希望以最快的时间 (比如一个周末) 入门 Go 语言. 这本书应该怎么读? 书中几乎没有较长篇幅的理论知识,更多的是 ...

  9. js迭代循环

    一.for loop for (let i = 0; i < products.length; i++) { console.log(products[i]); } 支持循环中断,可以用brea ...

  10. [编程基础] Python模块和包使用笔记

    本文探讨Python模块和Python包,这两种机制有助于模块化编程. 模块化编程是指将大型笨拙的编程任务分解为单独的,较小的,更易于管理的子任务或模块的过程.然后可以像构建模块一样将各个模块拼凑在一 ...