目录
IIC概述
IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式。
IIC/I²C总线的主要特点:
-
两线制:仅需要SDA(数据线)和SCL(时钟线)两条线即可实现设备间的通信,大大简化了连接方式和布线难度。
-
多主机系统:IIC总线允许多个主机设备同时存在于总线上,通过仲裁机制决定哪个主机可以占用总线进行通信。
-
地址识别:每个连接到IIC总线的设备都有一个唯一的地址,主机通过发送设备的地址来选择与哪个设备进行通信。
-
同步通信:IIC总线是一种同步通信总线,所有的数据传输都是在时钟信号的驱动下进行的。
-
灵活的数据传输:IIC总线支持多种数据传输速率,并且可以在传输过程中进行数据的读写操作。
-
广泛的设备支持:许多微控制器、传感器、存储器等外围设备都支持IIC接口,使得IIC总线在嵌入式系统中非常流行。
构成:
IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控 器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线 的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。
IIC协议的详细解析:
一、协议概述
- 开发公司:PHILIPS公司
- 类型:两线式串行、同步、半双工通信协议
- 主要线路:数据线SDA、时钟线SCL
- 应用领域:广泛应用于电子设备、传感器、显示器等领域的集成电路通信
二、硬件要求与信号线
- SDA:串行数据线,用于传输数据。在硬件上,SDA和SCL都属于外加上拉电阻的开漏输出,以确保在总线空闲时能够保持高电平。
- SCL:串行时钟线,由主设备提供时钟信号,以控制数据在总线上的同步传输。
三、协议状态与信号
1. 空闲状态
- 当IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时,各个器件的输出级场效应管均处在截止状态,由两条信号线各自的上拉电阻把电平拉高。
2. 开始信号
- 当SCL为高电平时,SDA由高电平到低电平的跳变定义为起始信号,表示总线通信的开始。
3. 停止信号
- 当SCL为高电平时,SDA由低电平到高电平的跳变定义为停止信号,表示总线通信的结束。
4. 应答信号
- 有效应答(ACK):发送器每发送一个字节后(8个bit),在第9个时钟脉冲期间释放数据线(即拉高SDA),由接收器反馈一个低电平的应答信号,表示接收器已成功接收该字节。
- 无效应答(NACK):应答信号为高电平时,表示接收器接收该字节没有成功,一般在最后一个字节后发送以通知发送器结束数据传输。
四、数据传输过程
- 发送数据:在SCL为高电平时,SDA线必须保持稳定;在SCL为低电平时,SDA线的电平可以变化。发送器通过控制SDA线的高低电平变化,在SCL的同步下逐位发送数据。
- 接收数据:接收器在SCL的每一个时钟脉冲下读取SDA线上的数据,实现数据的接收。
五、通信流程
- 主机发送起始信号:通知总线上的所有设备开始通信。
- 主机发送设备地址+读写位:选择需要通信的从设备,并指定是读操作还是写操作。
- 从设备应答:被选中的从设备通过拉低SDA线进行应答。
- 数据传输:根据读写位的不同,主机和从设备之间进行数据的发送或接收。
- 发送停止信号:通信完成后,主机发送停止信号,表示总线通信结束。
这段代码是I2C通信中用于发送一个字节数据的函数IIC_Send_Byte
的实现。
关键点:
-
位操作:通过
&
和<<
操作符,函数能够逐位地处理要发送的数据。dataSend & 0x80
检查dataSend的最高位(第7位),而dataSend = dataSend << 1
则将dataSend左移一位,以便在下一次迭代中处理下一个位。 -
时钟控制:SCL(时钟线)的拉高和拉低控制数据的发送时机。在SCL拉高期间,SDA(数据线)上的数据应该保持稳定,以便接收设备能够正确读取。
-
延时:
_nop_()
函数(或其等效物)用于在关键操作之间提供必要的延时,以确保数据稳定传输。然而,需要注意的是,_nop_()
的具体实现和效果可能取决于编译器和硬件平台。在某些情况下,您可能需要使用更精确的延时函数(如循环延时或定时器延时)。 -
数据准备:在每次发送数据位之前,通过将SCL拉低,可以确保SDA上的数据在发送之前已经稳定。