10 I2C通信协议

I2C通信

  • I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)
  • 同步,半双工
  • 带数据应答
  • 支持总线挂载多设备(一主多从、多主多从)

 硬件电路

  • 所有I2C设备的SCL连在一起,SDA连在一起
  • 设备的SCL和SDA均要配置成开漏输出模式
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右

 

CPU作为总线的主机,它可以对SCL线完全控制,任何时候都是主机完全掌握SCL线,在空闲状态下,主机可以主动发起对SDA的控制,只有在从机发送数据和从机应答的时候,主机才会转交SDA的控制权给从机,被控IC可以是姿态传感器、OLED、存储器、时钟模块。对于SCL时钟线,在任何时刻都只能被动读取,从机不允许主动发起对SDA的控制,只有在主机发起读取从机的命令后,或者从机应答的时候,从机才能短暂获取SDA的控制权。

推挽输出

推挽输出的结构是由两个三极管或者MOS管受到互补信号的控制,两个管子始终保持一个处于截止,另一个处于导通的状态。电路工作时,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高、既提高电路的负载能力,又提高开关速度。

开漏输出

当输出低电平时,开关管导通,输出高电平时,开关管断开。 

  • 当MOS管闭合时,开漏输出电路输出高电平,且连接着负载时,电流流向是从外部电源,流经上拉电阻RPU,流进负载,最后进入GND。
  • 开漏输出的这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。
  • 开漏输出的这一特性另一个好处在于可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现短路电流倒灌,损坏器件。
     

 I2C时序基本单元

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

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

 

在SCL低电平期间,允许改变SDA电平,主机如果想输出0,则在SDA上来一个下降沿,如果想输出1,则在SDA上来一个上升沿。当这一位放好后,主机松手时钟线,SCL回弹到高电平,高电平期间(一般时SCL上升沿期间),从机读取SDA。

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

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

 

I2C时序

指定地址写

对于指定设备(Slave Address),在指定地址(Reg Address)下,写入指定数据(Data)

从机地址7位+1位数据位 ,最后一位为0表示主机想写数据

这个数据帧的目的时,对于指定从机地址为1101000的设备,在其内部0x19的寄存器中,写入0xAA这个数据。

当前地址读

对于指定设备(Slave Address),在当前地址指针指示的地址下,读取从机数据(Data)

指定从机地址为1101000,最后一位为1,表示主机想要读取数据 ,从机应答0,代表从机接收到了第一个字节

//在从机中,所有的寄存器被分配到了一个线性区域中,会有一个单独的指针变量,指示其中一个寄存器,上电后指针默认指向0地址,并且,每写入一个字节和读出一个字节后,指针自动自增一次,移动到下一个位置。在调用当前地址读的时序时,主机没有指定要读哪个地址,从机就会返回当前指针指向的寄存器的值

//假设刚调用指定地址写,在0x19的位置写入0xAA,那么指针就会+1,移动到0x1A的位置

继续调用指定地址读的指令时,返回的就是0x1A地址下的值,再调用一次,返回的就是0x1B地址下的值。

指定地址读

对于指定设备(Slave Address),在指定地址(Reg Address)下,读取从机数据(Data) 

从机地址是1101000,读写标志位是0,代表要进行写的操作,从机应答之后,第二个字节,用来指定地址0x19 。重新再来个起始标志位SR,此时读写标志位为1,代表开始读的操作,接着主机接收一个字节0xAA,这个字节就是0x19地址下的数据。

时序是先起始S,再重复起始SR,再停止P,将两条时序拼接成一条。

在最后一部分里可以重复读写多个字节,地址指针在每次读写之后也会自增,所以就可以在连续一片寄存器地址进行读写操作。

当想停止读写操作时,一定要在最后给从机发送个非应答SA=1。主机给应答,从机就会继续发,给非应答,主机就不再发。

非应答即该主机应答的时候,主机不把SDA拉低,从机读到SDA为1,就代表主机没有应答。从机就会释放总线,把SDA控制权交还给主机。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值