STM32标准库开发—I2C通信协议

协议介绍

在这里插入图片描述

硬件电路

在这里插入图片描述

在这里插入图片描述

  • 配置成开漏输出模式,只允许输出低电平而不允许输出高电平,这样的情况下就会出现浮空的状态,为了避免浮空的状态,需要添加俩个上拉电阻,形成弱上拉模式。
  • 这样的设计有效避免了电源短路,即VCC
    GND出现直连的状态。也可以避免引脚模式的频繁切换,但要输出的时,只需要拉低SDA,输入模式下,只需要放开SDA总线,观察电平信号即可。最后在此电路设计下会出现“线与”的现象,即一个设备输出低电平,所有的设备都输出低电平,只有所有的设备输出高电平才是高电平(多主机模式下才有用)

I2C时序分析

I2C起始条件与终止条件

在这里插入图片描述
在这里插入图片描述

注意:起始条件与终止条件都必须有主机完成,这里不考虑多主机模式

I2C发送一个字节

在这里插入图片描述
在这里插入图片描述

注意:
从机需要在上升沿期间需要立刻读取SDA上的电平信号,在SCL高电平期间SDA数据上的内容不能变化。由于主机对时钟有主导权,所以主机放数据时不用非常着急,只需在低电平任意时刻放置数据即可。
当中断发生时,由于是同步时序,SCL SDA的电平信号会维持原来不变,直到中断处理完成,继续维持原来的数据发送!

I2C接收一个字节

在这里插入图片描述
在这里插入图片描述

注意:在接收数据期间,主机需要释放SDA总线,将总线控制权交换从机,主机在高电平读取,从机在低电平中写入数据

I2C发送应答

在这里插入图片描述在这里插入图片描述

I2C接收应答

在这里插入图片描述
在这里插入图片描述

I2C指定地址写

在这里插入图片描述
在这里插入图片描述

在SCL高电平期间,SDA总线被主机拉低,此时代表起始。紧接着主机需要立即发送一个7位设备地址位置,加1位的读写控制位,0表示数据写入1表示数据读出。RA代表数据的应答,0代表有人应答,1代表没人应答。在写模式下,会要求输入一个要写入的数据地址位置。每写入一个字节,就必须释放SDA总线获取设备的应答情况。当需要停止时就必须在SCL高电平期间,拉高SDA总线代表数据传输结束。

I2C当前地址读

在这里插入图片描述
在这里插入图片描述

在SCL高电平期间,SDA总线被主机拉低,此时代表起始。紧接着主机需要立即发送一个7位设备地址位置,加1位的读写控制位,0表示数据写入1表示数据读出。RA代表数据的应答,0代表有人应答,1代表没人应答。在读模式下,主机要释放SDA总线接收数据,由于不能指定数据读取位置,一般数据会从起始位置读出。当要停止读取的时候,主机必须要给从机一个非应答位SA ,这样主机才能控制SDA总线,在SCL上升沿期间拉高SDA从而结束数据传输。

I2C指定地址读

在这里插入图片描述在这里插入图片描述

在SCL高电平期间,SDA总线被主机拉低,此时代表起始。紧接着主机需要立即发送一个7位设备地址位置,加1位的读写控制位,0表示数据写入1表示数据读出。RA代表数据的应答,0代表有人应答,1代表没人应答。在指定地址读模式下,其实就是指定地址写+当前地址读的模式。在指定地址写模式下,会要求输入一个要写入的数据地址位置。每写入一个字节,就必须释放SDA总线获取设备的应答情况。获取完后SR代表重复发送一个起始信号,写入7位设备地址位置,加1位的读写控制位。此时切换为当前地址读模式,由于地址寄存器已经在写模式下被修改,所以读出的数据就是指定地址写位置下的数据。此时正常读取一个字节的数据就是指定位置的数据。同样的需要停止接收,需要主机给一个非应答,在SCL上升沿期间拉高SDA代表结束信号