1I2C
I2C(Inter-Intergrated Circuit)指的是 IC之间的通信方式。它是一种总线式结构,使用Clock Line(SCL:Serial Clock)和Data Line(SDA:Serial Data)进行数据传输,不同于uart,它属于同步串行通信方式,且同一时间只能单方向通信(半双工)。数据通过时钟同步经过数据线进行传输。生成时钟信号并输出的设备便是Master, 时钟信号作为输入并接受数据的设备便是Slave。一般情况下,Master便是MicroController,Slave便是周边的设备,比如RTC, EEPROM, TOUCH等等。
SDA(串行数据) – Master和Slave发送和接收数据的线路。
SCL(串行时钟) – 传送时钟信号的线。
2I2C总线协议
I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生。
起始和结束信号产生条件:总线在空闲状态时,SCL和SDA都保持着高电平,当SCL为高电平而SDA由高到低的跳变,表示产生一个起始条件;当SCL为高而SDA由低到高的跳变,表示产生一个停止条件。
在起始条件产生后,总线处于忙状态,由本次数据传输的主从设备独占,其他I2C器件无法访问总线;而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。起始和结束如图所示:
3I2C是如何工作的
使用I2C,数据以消息形式传输 。消息被分解 为数据帧。每条消息都有一个包含slave的二进制地址的地址帧,以及一个或多个包含正在发送的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件,读/写位和ACK / NACK位:
- 在 将SCL线从高电平切换到低电平之前,master通过将SDA线从高电平切换到低电平来向每个连接的slave发送启动条件 :
- master向每个slave发送要与之通信的slave的7位或10位地址,以及读/写位:
- 每个slave将master发送的地址与其自己的地址进行比较。如果地址匹配,则slave通过将SDA线拉低一位返回一个ACK位。如果来自master的地址与slave自身的地址不匹配,则slave会将SDA线拉高。
- 主机发送或接收数据帧:
- 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:
- 为了停止数据传输,主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件:
4UART优缺点
优点
- 仅使用两根线
- 支持多个master和多个slave
- ACK / NACK位用于确认已成功传输每个帧
- 硬件不如使用UART复杂
缺点
- 数据传输速率比SPI慢
- 数据帧的大小限制为8位
- 实现比SPI更复杂的硬件
5参考
- I2C 介绍及FPGA实现(RTL):
- I2C标准: