zoukankan      html  css  js  c++  java
  • 通过实例来分析I2C基本通信协议

    本文旨在用最通俗易懂的方式。让大家明确I2C通信的过程到底是怎么回事。
    I2C起源于飞利浦公司的电视设计,但之后朝通用路线发展,各种电子设计都有机会用到I2C


    总的来说,I2C能够简单归纳为,两根线,一个时钟线,一个数据线;一个总线上,一个主控。多个从设备。I2C的作用当然是用来数据传输,它的最大特点就是仅仅用了2根线,能够完毕对总线上多个从设备的有序通信,这就依赖于其通信协议了。
    主控相当于I2C的大脑,每一次读写操作都必须是主控发起的。这样就保证了多个从属设备间是无法直接通信的,这样就防止了仅有的2根线上数据传输发生混乱。


    我们还是简单回想一下《I2C 简单介绍》中的I2C 总线的几种信号状态

    1. 空暇状态:SDA 和 SCL 都为高电平。


    2. 開始条件(S)SCL 为高电平时,SDA 由高电平向低电平跳变。開始传送数据。

    3. 结束条件(P)SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

    4. 数据有效:在 SCL 的高电平期间,SDA 保持稳定,数据有效。

    SDA 的改变仅仅能发生在 SCL 的低电平期间。

    5. ACK 信号:数据传输的过程中,接收器件每接收一个字节数据要产生一个 ACK 信号,向发送器件发出特定的低电平脉冲。表示已经收到数据。


    • 空暇状态

    当没有数据须要读写时,大家风平浪静,时钟和数据线都是出于高电平状态,可是当数据传输时,就必须有一个规则产生,那就是


    • 開始条件(S)
    Start: 在clk为高的情况下,data由高变低为start。


    • 结束条件(P)
    Stop:在clk为高的情况下。data由低变高是stop。
            

    • 数据有效
    仅仅有在clk为高的时候。数据才有效。

    Clk为低。数据无效。




    • ACK 信号
    每个字节完毕。都会有一个ack,不管由master还是slave发出。ack位是低电平,表示有应答,假设是高电平,表示无应答。



    • 读写协议
    读数据须要有offset。所以offset须要先用写协议告诉slave,然后再读。
    所以一个完整的写协议就是: S 7_BIT_ADD W A OFFSET A RS 7_BIT_ADD R A DATA A P
    ST: 起始位
    SAD: 设备地址
    SAK: 从设备应答位
    MAK: 主控应答位
    SUB: offset
    DATA: 详细数据
    SP: 结束位 



    • 实例分析

    二进制串为S 001111000 000010000 {RS} 001111010 110111101 P
    翻译就是3C 08 3D DE
    另外能够看出,RS restart start波形非常类似,并且P之前slave没有ack,就说明slave不准备再提供数据了,说明是byte读。

    假设要读多byte,由于这个是stsensor。所以在offset位最高位写1即可了。这是stprivate规定。




    数据位是S 001100000 001000000 001001110 P
    翻译一下就是30 20 27。slave address 18 (30/2) offset 20, data 27.


    从图中能够看出。第九位应答位为高。说明并没有master并没有收到应答
    数据位是S 001111001 000000001(并非完整的波形)
    翻译一下slave address 1e(3c/2) offset 0 .....

    本文简单分析了I2C的读写的详细过程。以及依据几个波形图的实例,分析了详细发送的数据,供大家參考。

  • 相关阅读:
    类型转换
    struts2默认拦截器
    struts2自定义拦截器
    struts2之I18N
    代理模式
    抽象类 abstract class 接口
    java基础题
    final
    内部类
    tomcat 端口占用问题解决
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10021224.html
Copyright © 2011-2022 走看看