STM32 的普通 IO 口模拟 IIC 时序,可实现与 EEPROM 外设双向通信。
IIC 简介
IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器以及其外围设备。
IIC 是由数据线 SDA 和时钟线 SCL 构成的串行总线。
IIC 总线有如下特点:
① 数据线用来传输数据,时钟线用来同步数据收发。
② 总线上每个器件都有唯一器件地址,只需知道器件地址,根据时序即可实现微控制器与器件之间的通信。
③ 数据线 SDA 和时钟线 SCL 都是双向线路,空闲时都是 SDA 和 SCL 都是高电平。
④ IIC 传输速率在标准模式下可达 100kbit/s 在快速模式下可达 400kbit/s 在高速模式下可达 3.4Mbit/s。
⑤ IIC 总线支持多设备挂载在上面,同时支持多从机,连接到总线的接口数量只受总线电容 400pF 的限制。
IIC总线协议
IIC 时序是经典面试题。
① 起始信号。SCL 高电平期间,SDA 出现下降沿就表示起始位。
② 停止信号。SCL 高电平期间,SDA 出现上升沿就表示停止位。
③ 应答信号。IIC 发送完 8 位数据以后会将 SDA 改成输入状态,等待 IIC 从机应答。从机会在主机提供的 SCL 时钟信号下将 SDA 拉低,代表成功应答。
④ 数据有效性。在 SCL 高电平期间,SDA 必须保持稳定。因此 SCL 低电平期间, SDA 电平状态才允许变化。
⑤ 数据传输。在 SCL 配合下, SDA 上逐位地串行传送每一位数据。数据位的传输是边沿触发。
⑥ 空闲状态。SCL 和 SDA 同时处于高电平时,总线处于空闲状态。
IIC 读写通讯过程
IIC 的读写通讯过程,包括写操作,即主机写数据到从机,读操作,主机从从机读取数据。
写时序的具体步骤:
1)、起始信号。
2)、发送 I2C 设备地址,等应答。设备地址是 8 位数据,前 7 设备地址,最后位是读写位。
3)、重新发起始信号,发送要写写入数据的寄存器地址。等应答。
4)、发送要写入寄存器的数据。 等应答。
5)、停止信号。
读时序具体步骤:
1)、主机发送 START 信号。
2)、主机发送要读取的 I2C 从设备地址+读写位。7 位设备地址,最后一位读写位。等应答。
3)、重新发送 START 信号。主机发送要读取的寄存器地址。等应答。
4)、重新发送 START 信号。重新发送要读取的 I2C 从设备地址+读写位。等应答。
5)、从 I2C 器件里面读取到数据。
6)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
7)、主机发出 STOP 信号,停止 I2C 通信。
I2C 多字节读写时序:
有时候我们需要读写多个字节,多字节读写时序和单字节的基本一致,只是在读写数据的时候可以连续发送多个自己的数据,其他的控制时序都是和单字节一样的。
24C02 简介
24C02 是一个 2K bit 的串行 EEPROM 存储器,内部含有 256 个字节。在 24C02 里面还有一个 8 字节的页写缓冲器。该设备的通信方式 IIC,通过其 SCL和 SDA与其他设备通信,芯片的引脚图如图 36.1.2.1 所示。
图中 WP 是写保护引脚,接高电平只读,接地允许读和写,阿波罗板子上该引脚接地。 24C02 的设备地址是包括不可编程部分和可编程部分,可编程部分是根据上图的硬件引脚A0、A1 和 A2 所决定。设备地址最后一位用于设置数据的传输方向,即读操作/写操作,0 是写操作,1 是读操作,具体格式如下图 36.1.2.2 所示:
根据阿波罗板子的设计,A0、A1 和 A2 均接地处理,所以 24C02 设备的读操作地址为:0xA1;写操作地址为:0xA0。
IIC 访问 EEPROM 配置流程
1)使能 IIC 的 SCL 和 SDA 对应的 GPIO 时钟。SDA 线的 GPIO 模式使用开漏输出模式(硬件已接外部上拉电阻,也可以用内部的上拉电阻。SCL 线的 GPIO 模式使用推挽输出模式,通过函数 HAL_GPIO_Init 设置实现。
2)设置对应 GPIO 工作模式(SCL 推挽输出 SDA 开漏输出)。
3)参考 IIC 总线协议,编写信号函数(起始信号,停止信号,应答信号)
起始信号:SCL 为高电平时,SDA 由高电平向低电平跳变。
停止信号:SCL 为高电平时,SDA 由低电平向高电平跳变。
应答信号:接收到 IC 数据后,向 IC 发出特定的低电平脉冲表示已接收到数据。
4)编写 IIC 的读写函数
通过参考时序图,在一个时钟周期内发送 1bit 数据或者读取 1bit 数据。读写函数均以一字节数据进行操作。有了读和写函数,我们就可以对外设进行驱动了。
IIC 总线 I/O 扩展
PCF8574 简介
PCF8574是飞利浦公司推出的一款带 IIC 总线,可使大多数 MCU实现远程 I/O 扩展。该器件包含一个 8 位准双向口和一个 IIC 总线接口。它还带有一条中断接线(INT)可与 MCU 的中断逻辑相连,通过 INT 发送中断信号,远端 I/O 口不必经过 IIC 总线通信就可通知 MCU 是否有数据从端口输入,这意味着 PCF8574 可以作为一个单被控器。
阿波罗开发板使用的PCF8574采用SO16封装,总共16个脚,其中包括:8个准双向IO口(P0~P7)、3 个地址线(A0~A2)、SCL、SDA、INT、VDD 和 VSS。每个 PCF8574T 只需要最少 2 个 IO口,就可以扩展 8 路 IO,且支持一个 IIC 总线上挂最多 8 个 PCF8574T,这样通过 2 个 IO,最多可以扩展 64 个 IO 口。
PCF8574 寻址:
一个 IIC 总线上,最多可以挂 8 个 PCF8574T(通过 A0~A2 寻址),PCF8574T 的从机地址格式如图 37.1.1 所示:
A0~A2 为 PCF8574T 的寻址信息,我们开发板上 A0~A2 都是接 GND 的,所以,PCF8574T 的地址为:0X40。最后一位是读/写信号。
写数据:
发送 PCF8574T 的从机地址+写信号(R/W=0),然后等待 PCF8574 的应答信号,在应答成功后,发送数据(DATA1)给 PCF8574T 就可以了。
读数据:
发送 PCF8574T 的从机地址+读信号(R/W=1),然后等待 PCF8574T 应答(注意:PCF8574T 在发送应答的同时,会锁存 P0~P7 的数据),然后读取 P0~P7 的数据。数据读取支持连续读取,在最后的时候发送 STOP 信号,即可完成读数据操作。
中断:
PCF8574T中的中断引脚(INT)提供了一种高效的通知机制,使得微控制器(MCU)无需通过耗时的I²C总线通信就可以得知I/O端口状态的变化。当使用PCF8574T作为远程I/O扩展器时,其8个端口可以配置成输入或输出。当这些端口被配置为输入时,其中任意一个端口状态发生改变(比如从低电平变为高电平,或从高电平变为低电平),INT引脚就会产生一个中断信号,即INT引脚被拉低到低电平(平时 INT 为高,开漏,接了上拉电阻)。
特别指出的是,当INT引脚产生中断后,MCU必须通过I²C总线对PCF8574T进行一次读取或写入操作,以清除中断标志(INT 恢复高电平),也就是所谓的中断复位。如果不这样做,INT引脚将保持在低电平状态,不会响应下一次的输入信号变化产生的中断请求。
IIC 访问 IO扩展配置步骤
例程功能:
开机时检测 PCF8574T 是否存在,然后在主循环里面检测按键和 PCF8574T 的中断信号,当按键按下时,IIC 控制 PCF8574T 的 P0 口输出,从而控制蜂鸣器(连接在P0口)的开关;
当检测到PCF8574T的 INT 引脚中断产生的低电平信号时,读取 EXIO(连接在PCF8574T的P4口)的状态,当 EXIO=0(即 P4=0)时,控制 LED1 的翻转。同时,LCD 模块显示相关信息,并用 DS0 提示程序正运行。