I2C通信是芯片之经常用的协议之一,列入存储器、传感器等器件经常带有I2C通信,学习掌握使用是单片机开发必备,接下来分享一下个人理解及总结:
1、I2C概念:
I2C是由Philips公司开发的一种通用数据总线,两根线:SCL、SDA,需上拉电阻,是同步,半双工通信,带数据应答,支持总线挂载多设备(一主多从、多主多从)。
I2C协议标准定义了不同模式的理论最高速率:
标准模式(Standard-mode):最高 100 kbps
快速模式(Fast-mode):最高 400 kbps
快速模式+(Fast-mode Plus):最高 1 Mbps
高速模式(High-speed mode):最高 3.4 Mbps
2、I2C硬件原理:
不管是单设备还是多设备连接时,SCL、SDA两根线上各添加一个上拉电阻(通常4.7-10K),具体阻值需根据通信速率调整。
3、I2C软件原理:
MCU配置SCL和SDA管脚均要配置成“开漏输出模式”,因为“开漏输出模式”具有驱动低电平能力,不具高电平驱动能力,因此IO口输出高电平时(其本质是高阻态),此时高电平由外部上拉电阻决定,这个主要为了从设备可以控制响应。
4、I2C通信原理:
开始通信:SCL高电平期间,SDA从高电平切换到低电平,时序图如下:

停止通信:SCL高电平期间,SDA从低电平切换到高电平,时序图如下:

发送一个字节数据时:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后主机释放SCL(置1),从机将在SCL高电平期间读取数据,所以在SCL高电平期间SDA不允许有数据变化,依次循环发送8次,即可完成发送一个字节数据,时序图如下:

接收一个字节数据时:SCL低电平期间,从机将数据依次放到SDA线上(高位先行),然后主机释放SCL(置1),主机将在SCL高电平期间读取数据,所以在SCL高电平期间SDA不允许有数据变化,依次循环接收8次,即可完成接收一个字节数据(注意:主机在接收数据之前,主机必须先释放SDA),时序图如下:

发送应答(主机作为接收方):主机在接收从机发过来的一个字节数据之后,主机必须在下一个SCL时钟高电平期间,主机发送一个数据位回应从机,发送0表示应答(回应从机我收到数据了),发送1表示非应答(回应从机我没收数据,停止接收),时序图如下:

接收应答(主机作为发送方):主机向从机发送完一个字节数据之后,主机在下一个SCL时钟高电平期间,判断从机是否应答,此时如果从机拉低SDA线(既发送0)(表示从机应答,已收到数据),此时如果从机拉高SDA线(既发送1)(表示从机非应答,没收到数据,停止发送)。(注意:主机在接收数据之前,必须释放SDA(置1),释放让从机控制SDA线回应主机是否收到数据),时序图如下:

这期先将到这里,下一期将以一个案例讲解“软件编程读写逻辑”,编写分享不易,谢谢大家的喜欢,请点个爱心关注,加速更新分享,下期见。
夜雨聆风