STM32主要是作为主设备使用,这是要重点学习的部分。主设备通信分为发送过程与接收过程。发送与接收的时序逻辑图分别如图10-10与图10-11所示。
图10-10 STM32作为主设备发送通信时序逻辑图
图10-11 STM32作为主设备接收通信时序逻辑图
1.发送过程
与I2C主设备通信发送数据的时序一致,在通信过程中STM32会在发送每帧数据后产生不同事件,让CPU知道I2C的状态。比如7位地址格式发送的数据的时序逻辑如下:
(1)控制产生起始信号(S),当发生起始信号后,STM32产生事件EV5,并会对SR1寄存器的SB位置1,表示起始信号已经发送。
(2)紧接着发送设备地址并等待应答信号,若有从设备应答,则STM32产生事件EV6及EV8。这时SR1寄存器的ADDR位及TXE位被置1。ADDR为1表示地址已经发送,TXE为1表示数据寄存器为空。
(3)以上步骤正常执行且ADDR位被清零后,STM32往I2C的数据寄存器DR写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空。I2C外设通过SDA信号线一位一位把数据发送出去后,又会产生EV8事件,即TXE位被置1。这个过程,会不断重复,直至多个字节数据发送完毕。(www.xing528.com)
(4)当发送数据完成后,控制I2C设备产生一个停止信号(P),这个时候EV2事件会产生,SR1的TXE位及BTF位都被置1,表示通信结束。
如果使能了I2C中断,以上所有事件产生时,都会产生I2C中断信号,进入同一个中断服务函数,到I2C中断服务程序后,CPU再通过检查寄存器位来了解是哪一个事件。
2.接收过程
以7位地址格式为例,接收过程如下:
(1)起始信号(S)是由主机端产生的。控制发生起始信号后,STM32产生事件EV5,并会对SR1寄存器的SB位置1,表示起始信号已经发送。
(2)紧接着发送设备地址并等待应答信号,若有从设备应答,则产生事件EV6,这时SR1寄存器的ADDR位被置1,表示地址已经发送。
(3)从设备端接收到地址后,开始向主设备端发送数据。当主设备端接收到这些数据后,会产生EV7事件,SR1寄存器的RXNE被置1,表示接收数据寄存器非空,我们读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时我们可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据;若非应答,则停止传输。
(4)发送非应答信号后,产生停止信号(P),结束传输。
可以发现,STM32通过EV事件的查询可以得知I2C的工作状态,这些状态标志均在SR1与SR2状态寄存器中。STM32通过不断访问与控制这些状态(包括清零)标志来使用I2C,过程比较复杂。若使用固件库编程,开发人员不需要深入了解其工作过程。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。