这次来记录下I2C总线实现的过程
I2C是比较常用的方式,2根线实现通讯 ,对这2根总线进行上拉。标准模式传输速率为 100kbit/s ,快速模式为 400kbit/s ,高速模式
下可达 3.4Mbit/s,但目前大多 I2C 设备尚不支持高速模式。
分别来看I2C的起始信号,传输数据,ACK,停止信号。
起始信号: 在SCL为高电平的情况下,SDA从高电平跳变到低电平
停止信号:在SCL为高电平的 情况下,SDA从低电平条跳变到高电平
传输数据时:在SCL为高电平时进行采样,在SCL为低电平时数据 进行变换
I2C 的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种
信号。作为数据接收端时,当设备(无论主从机)接收到 I2C 传输的一个字节数据或地址后,
若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号,发送方会继续发送下
一个数据;若接收端希望结束数据传输,则向对方发送“非应答(NACK)”信号,发送方接
收到该信号后会产生一个停止信号,结束信号传输。
传输时主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接
收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)
再来看通讯过程,一般都是第3种情况
写:
1)发送起始信号
2) 发送从机地址
3)发送读或者写信号 如果是0,则是写信号。如果是1,则是读信号
4)判断是否有应答,有应答的话继续下一步
5)发送写的数据
6判断是否有应答,有应答的话继续下一步
7)重复5)和 6) 的过程
8)发送停止信号
来看TI的一个使用I2C通讯的过程
读:
1)发送起始信号
2) 发送从机地址
3)发送写信号,写信号是0
4)判断是否有应答,有应答的话继续下一步
5)发送写的数据
6判断是否有应答,有应答的话继续下一步
7)重复起始信号
8)发送从机地址
9)发送读信号,读信好是1
10)开始读数据
11)判断应答
12发送停止信号
如果是使用stm32HAl库的话那很简单。在初始化配置号好后调用HAL库函数即可。里面集成了通讯过程。
要是用标准库函数的话会麻烦点.用自己写的GPIO软件模拟也会麻烦点.好处是方便一直。
一般I2C都有官方例程。
一般I2C都是作为主机,很少作为从机。从机的话需要自己设置从机地址,流程还是差不多。一般时用中断来接收,用模拟的话很少见。下面的链接可以参考。
https://mp.weixin.qq.com/s/Fi5uglP_gOO8m0TDm1R9Ug