I2C回顾性学习,只记要点
1 原理分析
- I2C(Inter IC Bus)是由Philips公司开发的一种通用数据总线
- 两根通信线:SCL(Serial Clock串行时钟线)、SDA(Serial Data串行数据线)
- SCL和SDA均要配置开漏输出模式
- SDA配置为开漏输出目的:因为SDA半双工,主从机都可以输出,为了防止主从对SDA线输出不同电平,导致避免短路,所以采取禁止所有设备输出强上拉的高电平(对单片机来说是推挽模式),采用外置若上拉电阻加开漏输出的电路结构
- 强上拉:PMOS/NMOS或者开关连接VCC/GND
- 弱上拉:用电阻连接至VCC/GND
- 开漏模式+弱上拉情况下,只有每个设备都输出高电平,才是高电平,但凡有一个设备输出低电平,就是低电平
- SCL配置为开漏输出目的:出于多主机模式下时钟同步和总线仲裁考虑
- SDA配置为开漏输出目的:因为SDA半双工,主从机都可以输出,为了防止主从对SDA线输出不同电平,导致避免短路,所以采取禁止所有设备输出强上拉的高电平(对单片机来说是推挽模式),采用外置若上拉电阻加开漏输出的电路结构
- SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右


2 STM32软件I2C
2.1 时序逻辑
开始/结束:SCL高电平期间,变换SDA 接受/发送数据:SCL低电平时,放置SDA,SCL高电平时读走
2.1 时序基本单元
- 起始条件:SCL高电平期间,SDA下降沿

- 终止条件:SCL高电平期间,SDA上升沿

- 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位先行),然后释放SCL,从机将在SCL上升沿时读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
- 简单概括:SCL低电平主机放数据,高电平从机读数据

- 接收一个字节:SCL低电平期间(实为下降沿时),从机将数据位依次放到SDA线上(高位先行),然后释放SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)
- 简单概括:SCL低电平从机放数据,高电平主机读数据
- 注意点:主机需要提前释放SDA(置1)

- 发送应答:主机在接收完一个字节之后,在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
- 概括:主机接受完之后,发送1bit数据
- 理解:从机发送完数据以后,等待SDA拉低,从而判断主机接收到了数据,即可再发下一笔数据,否则便释放SDA总线,不干扰主机下一步操作

- 接收应答:主机在发送完一个字节之后,在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
- 概括:主机发送完之后,接收1bit数据
- 理解:主机发送完数据以后,等待SDA拉低,从而判断从机接收到了数据,若没有接收到应答,主机可以视情况产生停止条件,并提示一些信息

2.2 三种数据帧
2.2.1 指定地址写
- 步骤:
- 起始
- 主机写从机设备地址+写标志位(0)
- 从机地址一般为7位
- 主机接收从机应答
- 主机写从机内部地址
- 传感器:寄存器地址
- ADC:指令控制字
- Flash:内部RAM地址
- 主机接收从机应答
- 主机写数据
- 主机接收从机应答
- 停止
- 注意:
- 扩展:如果想在一条数据帧连续写入多字节地址,则在7后重复6、7即可,地址会自动+1

2.2.1 当前地址读
- 步骤:
- 起始
- 主机写从机设备地址+读标志位(1)
- 主机接收从机数据
- 主机发送从机非应答(SA)(1)
- 停止
- 注意:
- 该方式无法指定从机内部地址,只能通过上一笔读写过的地址+1判断,若没有操作过默认为0地址。
- 地址会存入从机内部一个寄存器中,不会因为起始/停止改变地址内容
- 发送非应答SA,表示主机不想再继续接收数据,此时从机会释放SDA
- 扩展:如果想在一条数据帧连续读出多字节地址,则将4改为“主机发送从机应答”后重复3、4即可,地址会自动+1,直到不想再接收数据,将4改为“主机发送从机非应答”
- 该方式无法指定从机内部地址,只能通过上一笔读写过的地址+1判断,若没有操作过默认为0地址。

2.2.2 指定地址读
- 步骤:
- 起始
- 主机写从机设备地址+写标志位(0)
- 主机接收从机应答
- 主机写从机内部地址
- 主机接收从机应答
- restart(Sr)
- 主机写从机设备地址+读标志位(1)
- 主机接收从机应答
- 主机接收从机数据
- 主机发送从机非应答位(SA)
- 停止
- 注意:
- 相当于主机先写了一个地址但没写数据,然后再发起一个读请求,从机就会由这个地址读取

3 STM32硬件I2C
—————————————————————————————————————
Ongoing
—————————————————————————————————————