问题:
- IIC传输速率怎么确定?软件模拟中的延迟时间怎么确定?
- 发送设备地址时,比较设备地址怎么理解
- IIC好像并不是一个很严谨的协议
IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
- IIC是两线式串行总线,包括SCL(时钟线)和SDA(数据线)。SCL进行时钟同步,SDA进行数据发送和接收。即SDA是双向的,所以软件模拟IIC时需要不停的对SDA的引脚进行配置
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} //配置PB7为上拉/下拉输入模式
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} //配置PB7为通用推挽输出模式(50MHz)
- I2C总线通过上拉电阻接正电源。即当总线空闲时,两根线均为高电平。如此,连在总线上的任一器件输出的低电平,都可以使得总线的信号变低,也就是说各器件的SDA和SCL都是线"与"关系。如下图 R34,R35所示。
- I2C是同步串行总线,由SCL为所有设备提供统一的时钟信号。 即使多个节点发送时钟信号时,由于SCL"线与"的原因,SCL上为统一的时钟信号。为了时钟信号的统一,我们假定同一时刻只有一个设备发出时钟信号,该设备称为主机。其他IIC设备作为从机存在。
IIC也是一主多从模式,不过没有固定的主从设备,每个设备都可以是主设备,但同一时刻只有一个主设备(发出时钟信号的)。 - 数据位(1\0)有效性规定:I2C总线进行数据传送时,时钟信号为高电平期间,SDA线上的数据必须保持稳定;只有在SCL线的信号为低电平器件,SDA线的才可进行高低电平状态变化。
- I2C 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变(下降沿),开始传送数据。
结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变(上升沿),结束传送数据。
应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。
这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。
信号 | SCL | SDA | 注意 |
开始信号 | 高 | 由高到低 | 跳变前高电平持续时间要大于4.7us且SDA的低电平持续时间要大于4us |
停止信号 | 高 | 由低到高 | 跳变前低电平持续时间要大于4us且SDA的高电平持续时间要大于4.7us |
- 模拟IIC时序要以被操作对象的数据手册里时序图。STM32与AT24C02通过模拟IIC通信,延迟时间以AT24C02时序图为准。
上图为AT24C02 IIC总线时序图。
t_LOW | 脉冲低电平保持时间 |
---|---|
t_HIGH | 脉冲高电平保持时间 |
t_HD.STA | 开始信号保持时间 |
t_SU.STA | 开始信号建立时间 |
t_HD.DAT | 数据保持时间 |
t_SU.DAT | 数据建立时间 |
tSU.STO | 停止信号建立时间 |
- IIC是半双工方式,所以每次数据传输完成后,需要主从设备进行数据应答。
帧格式包括:起始信号+ACK+设备地址+ACK+字地址+ACK+DATA+ACK+停止信号
- IIC主机发送起始信号后发送的是"片选信号",即7位从机地址加1位方向(读写)控制。主机向从机发送地址,所有的从机都能接收到主机发出的地址,然后每个从机都将主机发出的地址与自己的地址比较,如果匹配上了,这个从机就会向主机发出一个响应信号。主机收到响应信号后,开始向总线上发送数据,与这个从机的通讯就建立起来了。如果主机没有收到响应信号,则表示寻址失败。
代码解析
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} //配置PB7为上\下拉输入
#