2.1.I2C协议编程

I2C协议通过两条线SCK和SDA实现通信,需要上拉电阻防止短路。数据传输包括写入和读出,涉及START和STOP信号、设备地址和响应信号ACK。SMBus是I2C的子集,有更严格的规定,如电压范围、时钟频率限制和数据格式定义。
摘要由CSDN通过智能技术生成

关于I2C这个协议,它体现了一个单片机难度的开始,我记得当时我学51时,I2C一直都理解不了,现在回来一看,它的原理貌似又显得如此的简单..

硬件连接

 对于硬件连接,也就是SCK时钟线,SDA数据线,两条线而已,这里唯一有讲究的就是I2C上为什么要加上拉电阻:SDA这条线上不一定只接有一个I2C设备,若是在数据传输过程中,设备1的SDA输出1,而设备2的SDA因为设计等各种原因输出了2,那么造成短路,设备将会有烧坏的风险,在这里,我们可以看向I2C设备的内部结构图:

 对于一个I2C设备而言,SDA并不直接由设备驱动,而是由OUT处的三极管控制,当OUT=1导通时,SDA接地,则SDA=0,相对的,当OUT=0时,SDA则由外部的电路决定其电平属性。若两边的设备OUT都为0,SDA悬空,那么上拉电阻就能为原本为悬空状态的SDA设置电平为高。有以下真值表

  AOUT    BOUT    SDA   
001
010
100
110


I2C原理

白色背景表示主-->从,灰色背景表示从-->主

数据写入

流程如下:

1.主芯片(开发板内置)发出一个START信号到从设备

2.主芯片发出设备地址(用于选中I2C总线上的I2C设备)以及方向(0表示写,1表示读)

3.从设备回应(用于确定设备是否存在)

4.主设备发送一个字节的数据给从设备,并等待回应,当接受到从设备的回应后才继续发送下一个字节的数据

5.数据发送结束后,主设备送出一个停止信号给从设备。

数据读出

 流程如下:

1.主芯片(开发板内置)发出一个START信号到从设备

2.主芯片发出设备地址(用于选中I2C总线上的I2C设备)以及方向(0表示写,1表示读)

3.从设备回应(用于确定设备是否存在)

4.从设备发送一个字节的数据给主设备,并等待回应,当接受到主设备的回应后才继续发送下一个字节的数据

5.数据发送结束后,主设备送出一个停止信号给从设备。

I2C信号如何形成?

那么START信号,设备地址,方向,停止信号等等又该如何形成呢?

  •  开始信号(S):当SCL保持高电平的情况下,SDA从高电平到低电平跳变,即为开始信号
  •  结束信号(P):当SCL保持高电平的情况下,SDA从低电平到高电平跳变,即为结束信号
  • 响应信号(ACK):接收器在接收到8位数据后,在之后的第9个时钟周期内拉低SDA,即为响应信号

  • 数据传输(设备地址,方向):当SCL为高电平时,SDA上的将数据被传输(读或写),而SDA上的数据想要变化,只能在SCL为低电平时进行跳变。

设备地址怎么看?

以AT24C02为例子

 对于不同大小的I2C设备,具有不同的从器件地址。由于24C02为2k容量,也就是说只需要参考下图中第一行的内容

 即AT24C02的设备地址为:1010xxx,若AT24C02的A1,A2,A3引脚都接地,则AT24C02的设备地址为1010000

SMBus协议

SMBus(System Management Bus)系统管理总线,是I2C的一个子集,它是基于I2C的基础提出了更为严格的使用规范。

VDD极限值对比I2C:

  • I2C:范围广,最高甚至可达12V
  • SMBus:1.8V~5V

SCL时钟频率对比I2C:

  • I2C:时钟最小频率无限制,且无Clock Stretching时长的限制。
  • SMBus:时钟最小频率10KHZ,有Clock Stretching时长的限制。

地址回应(Address Acknowledge)对比I2C:

  • I2C:没有强制要求必须发出回应信号(ack)
  • SMBus:强制要求必须发出回应信号(ack)chu

 数据传输格式对比I2C:

  • I2C:只定义了怎么传输数据,未定义数据的格式,数据格式完全由设备定义
  • SMBus:定义了几种固定的数据格式

1.Quick Command数据格式 

这种数据格式如图,可以在发出设备地址后,只发出一位数据,用于一些简单的I2C设备使用,如开关等。

2.Receive Byte数据格式 

这种数据格式如图,和原本的I2C协议很像,但区别在于主设备在接收到从设备发出的数据后,不需要进行应答(ACK)

3.Send Byte数据格式 

 几乎与I2C的过程一致。

4.Read Byte数据格式 

与上面的Receive Byte不同,Read Byte需要在发出设备地址后,还需要发出一个8位的芯片寄存器地址(Command Code),然后发出一个重复S信号(后面会讲这个机制)

5.Read Word数据格式 

 与Read Byte类似,但区别就是把数据分为高字节与低字节,就是一个是传8位数据用,一个传16位的数据。

6.Write Byte数据格式

7.Write Byte数据格式

对应的写操作数据格式如上:

8.Block Read数据格式

在这个块的读操作涉及到一个新的地方即:从设备会将数据数量Block Count的值上报到主设备,然后主设备才从从设备中读取N个块的数据。

9.Block Write数据格式

类似的东西,不再赘述

10.Block Write - Block Read Process Call数据格式

这个数据格式即写入N个数据块后立即读出N个数据块的数据,这里的两个N分别由主设备和从设备决定

11.PEC数据格式

PEC数据格式是一种错误校验码,即一个用于检验数据是否发送正常的数据块

SMBus中还存在REPEATED START Condition信号的机制(重复发出S信号)

即主设备在完成对数据的写操作后,主设备不用发出结束信号(P),而是直接发出下一个开始信号(S),然后对数据进行读操作即可。在BLOCK数据格式中,如果把传输Block Count的步骤去掉即为I2CBlock数据格式。在两种协议中更建议使用SMBus

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值