STM32之IIC协议
物理层
1.从机数量选择
- 地址限制:IIC协议本身没有严格规定总线上device最大数目, 从理论上看, IIC能挂的device数目取决于能表示的最大地址空间, 在7位地址模式下, 减去0x00地址不可用, 理论上可以挂2^7 -1 = 127个设备。
- 总线电容限制:
- 由于器件的管脚都是有输入电容的,PCB上也会有寄生电容,所以会有一个限制。实际设计中经验值大概是不超过8个器件。
2.引脚模式的选择:连接在SDA数据线的输出信号线必须是OD(开漏)输出或者OC(开集)输出,以保证线与的功能(门电路介绍)
3.上拉电阻阻值的选择:通讯速度限制由上升沿和下降沿时间决定,OD门的下降速度较快,因此主要由上拉能力决定,上拉能力主要由电源和上拉电阻决定,如果上拉电阻值过小,Vcc灌入端口的电流(Ic)变大,这样会导致器件开漏输出的MOS管(三极管)不完全导通,由饱和状态变成放大状态,这样端口输出的低电平值增大(I2C协议规定,端口输出低电平的最高允许值为0.4V)。上拉电阻推荐4.7K~10k之间。
4.串联电阻的选用:I2C协议还定义了串联在SDA、SCL线上电阻Rs。该电阻的作用是,有效抑制总线上的干扰脉冲进入从设备,提高可靠性。这个电阻的选择一般在100~200ohm左右。当然,这个电阻并不是必须的,在恶劣噪声环境中,可以选用。
协议层:
1.起始与停止信号
- 总线在空闲状态 时,SCL和SDA都保持着高电平,
- 当SCL为高而SDA由高到低的跳变,表示产生一个起始条件;
- 当SCL为高而SDA由低到高的跳变,表示产生一个 停止条件。
- 在起始条件产生后,总线处于忙状态(线与),由本次数据传输的主从设备独占,其他I2C器件无法访问总线;
- 而在停止条件产生后,本次数据传输的主从设备将释放总线,总线再次处于空闲状态。
2.传输数据有效性
- SDA线上的数据必须在SCL的高电平时保持稳定。
- SDA线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。
即SCL高时,SDA不可以动,SCL低时,SDA可动(用于区别起始和停止信号),改变SDA信号时候,总是要先拉低SCL信号,改变SDA的电平状态,以发送数据,由于接收端需要一个信号来确定每一位的位置,所以在改变SDA后需要将SCL重新拉高,以产生一个上升沿,此时从机根据上升沿读取这个SDA电平,在SCL上升后由于需要再次发送一个字节,因此需要再次将SCL拉低,准备下一次的SDA数据发送。
3.一次发送的字节数量必须是8位,每次可以传输的字节数量不被限制,每个字节后必须跟一个响应位,首先传输数据最高位MSB
4.ACK信号:
当主设备向从设备发送数据或地址后,或者从设备向主设备发送数据后,接收方会在第 9 个时钟脉冲期间通过将 SDA 线拉低来发送 ACK 信号,表示数据已成功接收。
这个信号代表此次的数据发送成功,如果回传Nack那么从机接收到后可以按情况处理
要通过 IIC 发送多个字节的数据,可以按照以下步骤进行:
起始条件:主设备发送起始信号(SCL 为高电平时,SDA 从高电平切换到低电平),启动通信。
发送从设备地址:主设备发送 7 位的从设备地址,并在第 8 位表示写操作(通常为 0)。
等待应答:从设备接收到地址后,发送应答信号(ACK)。
发送第一个字节数据:主设备在 SCL 的控制下,逐位发送第一个字节的数据。
接收应答:从设备在第 9 个时钟脉冲时发送应答信号(ACK),表示第一个字节数据接收成功。
重复步骤 4 和 5,依次发送后续的字节数据,直到所有要发送的数据字节都完成传输。
停止条件:主设备发送停止信号(SCL 为高电平时,SDA 从低电平切换到高电平),结束通信。
例如,假设要从主设备向从设备发送三个字节的数据 0xAA、0xBB、0xCC :
首先发送起始条件,然后发送从设备地址并等待应答。接着发送 0xAA 并等待应答,再发送 0xBB 并等待应答,之后发送 0xCC 并等待应答。最后发送停止条件。
在整个过程中,SCL 始终控制着通信的节奏,确保数据的稳定传输和正确的应答。