• I2C总线原理及总线信号的实现


    目录

    1. I2C总线简介

    1.1 I2C电路规范

    1.2 I2C总线的通信过程

    1.3 I2C的寻址方式

    1.4 起始信号与停止信号

    1.5  字节传送与应答

    1.6 主机向从机发数据

    1.7 从机向主机发数据

    1.8 发送应答与接收应答

     1.9 同步信号

    2. 典型I2C时序

    2.1 发送一帧数据(主机向从机发数据)

    2.2 接收一帧数据(从机向主机发数据)

    2.3  先发送再接收数据帧(复合格式)


    1. I2C总线简介

    I2C总线(Inter IC BUS)是由Philips公司开发的一种串行,同步、半双工总线;
    通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度;

    I2C总线是一种多主机总线,连接IIC总线上的器件分为主机和从机,主机有权发起和结束一次通信,而从机只能被主机呼叫;当总线上有多个主机同时启用总线时,I2C也具备冲突检测和仲裁的功能来防止错误产生;每个连接到IIC总线上的器件都有一个唯一的地址(7bit),且每个器件都可以作为主机也可以作为从机(同一时刻只能有一个主机),总线上的器件增加和删除不影响其他器件正常工作;I2C总线在通信时总线上发送数据的器件为发送器,接收数据的器件为接收器;主要用于近距离(抗干扰能力稍弱),低速的芯片之间的通信(传输视频,带宽要求比较高的场合也是不行的);I2C总线有两根双向的信号线,时钟线SCL(Serial Clock)用于通信双方时钟的同步、(I2C可以发送任意多个字节,因为收发双方用的是同一个时间基准数据线SDA(Serial Data)用于收发数据,IIC总线硬件结构简单,成本较低,因此在各个领域得到了广泛的应用;

    1.1 I2C电路规范

    所有I2C设备的SCL连在一起,SDA连在一起
    设备的SCL和SDA均要配置成开漏输出模式
    SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
    开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题

    1.2 I2C总线的通信过程

    一: 主机发送起始信号启用总线

    二:主机发送一个字节数据指明从机地址和后续字节的传送方向;

    往总线上发一个字节数据:高7位地址,低一位为0主机向从机发数据;为1从机向主机发数据;

    三:被寻址的从机发送应答信号回应主机;

    应答:告诉主机“我存在,我听见了”

    四:发送器发送一个字节数据

    最低位为0发送器为主机,接收器为从机;

    最低位为1发送器为从机,接收器为主机;

    发送过程中不允许改变通信方向;

    五:接收器发送应答信号回应发送器

    0为应答1为非应答

    . . . 循环步骤4和5

    n:通信完成后主机发送停止信号释放总线

    1.3 I2C的寻址方式

    I2C总线上传的数据是广义的,既包括地址,又包括真正的数据

    主机在发送起始信号后必须先发送一个字节的数据,该数据的高7位为从机地址,最低位表示后续字节的传送方向,‘0’表示主机发送数据,‘1’表示主机接收数据;总线上所有的从机接收到该字节数据后都将这7位地址与自己的地址比较,如果相同,则认为自己被主机寻址,然后再根据最低位将自己定为发送器或者接收器;

    1.4 起始信号与停止信号

    起始条件:SCL高电平期间,SDA从高电平切换到低电平
    终止条件:SCL高电平期间,SDA从低电平切换到高电平

    起始信号和停止信号都是由主机后发出的,起始信号产生总线处于占用状态,停止信号产生后总线处于空闲状态;

    1.5  字节传送与应答

    I2C总线通信时每个字节为8位长度,数据传送时,先传送最高位,后传送低位(串口先低后高),发送器发送完一个学节数据后接收器必须发送1位应答位来回应发送器即一帧共有9位

    1.6 主机向从机发数据

    发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

    注:I2C它的时钟相位和时钟极性是固定的,SCL低电平发送器发数据,SCL高电平时接收器读取数据;空闲时SCL,SDA为高电平;

    1.7 从机向主机发数据

    接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

    1.8 发送应答与接收应答

    发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
    接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

     1.9 同步信号

    I2C总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定;

    2. 典型I2C时序

    2.1 发送一帧数据(主机向从机发数据)

    第一步:主机发送起始信号启用总线;第二步:主机向总线发送1个字节的数据,高7位为从机地址,最低为后续字节的传输方向,这里为主机向从机发数据,所以最低位为0;第三步:从机应答;第四步:发送一个字节数据;第五步:从机应答;. . .直到遇到下面两种情况主机发送停止信号,停止通信;

    两种情况:

    1. 从机应答完,主机不想发了,主机直接发送停止信号,停止本次通信;

    2. 从机不应答,主机也不会自找没趣,直接发送停止信号,停止本次通信;

    2.2 接收一帧数据(从机向主机发数据)

     第一步:主机发送起始信号启用总线;第二步:主机向总线发送1个字节的数据,高7位为从机地址,最低为后续字节的传输方向,这里为从机向主机发数据,所以最低位为1;第三步:主机应答;第四步:发送一个字节数据;第五步:主机应答;不断重复直到主机不应答,主机发送停止信号,停止本次通信;(1为非应答,0为应答)

    2.3  先发送再接收数据帧(复合格式)

    要想改变数据的传输方向,只要再重新开始一次通信就可以改变方向了;

    注意: 主机发起第二次通信的时候在它之前没有发送停止信号,如果第一次通信发停止信号,总线有可能会被其它主机占用,抢走使用权;

  • 相关阅读:
    【Linux】信号的处理
    国内的聚宽量化平台好不好用?
    闲鱼的商品结构化是如何演进的
    Collections.synchronizedMap() 和 ConcurrentHashMap 区别
    【MySQL】MySQL中多表连接的背景、笛卡尔积的错误与如何正确地多表查询
    运用可视化报表设计器,实现高效率办公!
    数据结构----静态链表c++
    数字化建设方案
    MSQL中DATETIME或TIMESTAMP的区别
    SAP ABAP 动态结构实现发送企业微信应用消息
  • 原文地址:https://blog.csdn.net/YLG_lin/article/details/126842027