2.1.I2C协议编程
Posted 衾许°
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.1.I2C协议编程相关的知识,希望对你有一定的参考价值。
关于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 |
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
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
以上是关于2.1.I2C协议编程的主要内容,如果未能解决你的问题,请参考以下文章
资料软硬通吃!1710份C语言及硬件设计系统资料合集706期