一、IIC(I2C)的介绍
IIC(I2C)总线:是Philips公司推出的串行总线标准(为二线制,不包括地线)。总线上扩展的外围器件以及外设接口通过总线寻址,是具备总线仲裁和高低速设备同步(时钟线)等功能的高性能多主机总线。
作用:
串口:STM32跟电脑进行通信;
IIC:两个器件之间进行相互通信。(STM32跟AT24C02之间通信,所以两个通信的器件必须具备IIC总线接口)。
二、工作原理
串行数据线SDA和串行时钟线SCL构成的,可发送和接收数据。IIC 是由数据线和时钟线组成的。
硬件连接图:
所有挂接在I2C总线上的器件和接口电路都应具有I2C总线接口,且所有的SDA/SCL同名端相连。总线上所有器件要依靠SDA发送的地址信号寻址,不需要片选线。
特点:
组成系统结构简单,占用空间小,芯片管脚的数量少,无需片选信号,价格低。
允许若干兼容器件共享总线,应用比较广泛。
总线的长度可达7.6m,传送速度:快速IIC 400kbps ,标准IIC 100kbps,高速IIC 1M bps。
支持多个组件。支持多主控器件(某时刻只能有一个主控器件)。
I2C总线上所有设备的SDA, SCL引脚必须外接上拉电阻。
开发板上的AT24C02 接了STM32 的硬件IIC接口,但是 STM32的IIC硬件接口存在BUG.所以我们不用
它的硬件IIC接口,直接用IO口模拟的方法。 IIC的的通信速并不快,用IO口模拟的方法完全可以达到它的通信速度。
IO口模拟:读 、写 数据的过程都是通信代码来完成的,所以速度会比较慢。
硬件接口:读 、写 数据的过程由硬件功能自主完成。速度会比较快。
三、IIC总线协议
时序图:
从时序图可以得到 :
1. MSB--> 高位先发(IIC) ; LSB : --> 低位先发(串口)
2.起始信号:SCL为高电平期间,SDA由高电平向低电平跳变。
void IIC_Start(void) { SCL=1; SDA=1; delay_us(5); SDA=0; delay_us(5); SCL=0; }
3.停止信号:SCL为高电平器件,SDA由低电平向高电平跳变。
4.应答信号:每个字节(8bit)传输完成后的下一个时钟信号,在SCL为高电平器件,SDA为低电平,则表示一个应答信号;
IIC里面应答信号非常重要,IIC要求:接收方没接收一个数据都必须要给发送方一个应答;
应答: 主机给从机的应答, 从机给主机的应答! ! ! !
主机可以给 2 种应答:
1. 主机给应答-------继续给数据
2. 主机给非应答-------不需要再给数据了
应答信号的产生:
在主机发送数据完成后, 从机就会给出应答信号, 应答信号就是把 SDA 拉为低电平! ! !
主机可以读取SDA的电平状态来判断 从机是否给出应答信号
主机接收到数据后, 主机把 SDA 拉为低电平表示应答, 拉为高电平表示非应答! ! ! !
注意: IIC 里面应答信号也需要一个完整的时钟周期! ! ! ! !
同样这个应答信号也是在 SCL
- 非应答信号:每个字节( 8bit) 传输完成后的下一个时钟信号, 在 SCL 为高电平期间, SDA 为高, 则表示一个非应答信号(ack)。
- 空闲状态: SCL为高电平,SDA为高电平。
注意: 起始和停止信号总是由主设备发出。 应答信号和非应答信号是由接收数据方发出,发送数据方则是检测这个信号。 主机和从机都可以发生应答信号和非应答信号。
四、IIC数据的发送和接收
IIC 属于串行通信, 数据位也是一个位一个位的发送, IIC 里面固定是高位先发送! ! !
IIC 通信在 SCL 变为低电平后给出数据, 高电平采样数据! ! ! !
发送数据:
低电平主机给数据
高电平从机采样数据
记得: IIC 采用模拟时序的时候, 时钟采用: 低—高—低
void IIC_Send_byte(u8 data) { int i=8; While(i--) { SCL=0; if(data&0x80) { SDA=1 } } else SDA=0; data<<=1; SCL=1; }
2.数据的接收过程
IIC 通信在 SCL 变为低电平后给出数据, 高电平采样数据! ! ! !
接收数据:
低电平从机给数据
高电平主机采样数据
记得: IIC 采用模拟时序的时候, 时钟采用: 低—高—低
注意: SCL 的高电平的持续时间! ! ! ! !
高电平时间: 标准 IIC 4.0 us, 快速 IIC 0.6 us
低电平时间: 标准 IIC 4.7 us, 快速 IIC 1.3 us
u8 IIC_res_byte(void) { u8 data=0; u8 i=8; while(i--) { data<<=1; SCL=1; if(SDA) Data |= 0x01; } }