iic协议介绍
IIC(Inter-Integrated Circuit)是一种串行通信协议,用于在电路板和芯片之间传输数据。它由Philips公司(现在是NXP公司)于1982年开发,因此也被称为Philips I2C。 IIC协议使用两根信号线,一根为时钟线(SCL),另一根为数据线(SDA)。它可以连接多个设备,其中每个设备都有一个唯一的地址。 IIC协议被广泛用于数字电路中的芯片间通信,如存储器芯片、传感器、扩展IO等。
硬件电路
CPU为主设备,所有iic从设备挂载在iic线上,所有iic设备的SCL连在一起,SDA连在一起。
一主多从模式下(一个主机控制多个iic设备)SCL和SDA均配置为开漏输出模式并且SCL和SDA各添加一个上拉电阻,阻值一般为4.7千欧左右。
接下来我们将为什么要配置成开漏输出模式:
不管是主机还是从机,都是通过在规定的SCL线上通过改变SDA线的高低电平来实现通信的。主机完全控制SCL线,并且能主动控制SDA线。从机只有在接收到读取信号或者发送应答信号的时候才能短暂控制SDA线。iic是半双工协议,不管是主机还是从机,在发送数据的时候处于输出状态,接收数据的时候处于输入状态。如果某一刻没处理好,导致主机与从机都处于输出状态并且一个输出高电平一个输出低电平就会导致短路。所以将引脚设置为开漏输出模式。
开漏输出模式就是:在输出低电平的时候就正常处于强下拉状态,而在输出高电平的时候,引脚会处于浮空状态。此时通过外接电阻来上拉引脚,引脚会处于弱上拉状态,这样就不会出现短路状态了。而且,输出高电平的时候相当于断开引脚,所以在输入之前直接输出高电平状态,就不用切换输入模式了。第三,如果一个或多个设备输出了低电平,总线就处于低电平,只有所有设备输出高电平,总线才处于高电平。iic可以利用“线与”的这个特征执行多主机模式下的时钟同步和总线仲裁。
时序设计
起始条件:SCL高电平期间,SDA从高电平切换到低电平
终止条件:SCL高电平期间,SDA从低电平切换到高电平
发送一个字节:SCL低电平期间,主机将数据从高到低位依次放到SDA上(1:SDA拉高电平;0:SDA拉低电平),然后释放SCL,从机会在SCL高电平的时候读取SDA。循环8次则发送一个字节。
接收一个字节:SCL低电平期间,从机将数据从高到低位依次放到SDA上(1:SDA拉高电平;0:SDA拉低电平),然后释放SCL,主机会在SCL高电平的时候读取SDA。循环8次则接收一个字节。(主机在接收之前需要释放SDA)(图中实线为主机操控,虚线为从机操控)
发送应答:主机在接收完一个字节后,在下一个时钟发送一位数据,0表示应答,1表示非应答,代表从机要不要继续发送(主机每接收到一个字节的时候都向从机发送一个字节,告诉从机你要不要继续发送数据);
接收应答:主机在发送完一个字节后,在下一个时钟接收一位数据,判断从机是否应答,0表示应答,1表示非应答。(主机在接收之前需要释放SDA,由从机拉低,如果主机接收到从机拉低,代表从机接收到应答)
指定地址读写操作
指定地址写:
起始条件+指定从机地址写(一般为7位地址+1位读写位,0:写操作;1:读操作)+从机应答+指定地址(从机的地址指针)+从机应答+写入数据+从机应答+...+从机应答+终止条件
当前地址读(当前指针所指寄存器):
起始条件+指定从机地址读(一般为7位地址+1位读写位,0:写操作;1:读操作)+主机应答+(转入读时序)读取数据+主机应答+...+主机应答(主机应答1)+终止条件
指定地址读:
起始条件+指定从机地址写(一般为7位地址+1位读写位,0:写操作;1:读操作)+从机应答+指定地址(从机的地址指针)+起始条件+指定从机地址读(一般为7位地址+1位读写位,0:写操作;1:读操作)+主机应答+(转入读时序)读取数据+主机应答+...+主机应答(主机应答1)+终止条件
要注意:主机在每次发送数据的时候,都要接收一次应答确保每个数据从机都接收到了;而主机在每次读取数据(接收数据)的时候,都要发送一次应答,告诉从机要不要继续读取(接收)。