一、介绍
PCA9555是一款高性能、低功耗的I/O扩展芯片,具有以下主要特性和功能:
- 通用性:PCA9555是一款24引脚的CMOS器件,为I²C总线/SMBus应用提供16位通用并行输入/输出(GPIO)扩展。它旨在增强恩智浦半导体的I2C总线I/O扩展器系列,具有更高的驱动能力、5V I/O容差、更低的电源电流、独立的I/O配置和更小的封装。
- 配置灵活性:PCA9555由两个8位配置(输入或输出选择)组成,包括输入、输出和极性反转(高电平有效或低电平有效操作)寄存器。系统控制器可以通过写入I/O配置位来启用I/O作为输入或输出。每个输入或输出的数据保存在相应的输入或输出寄存器中。
- 兼容性:PCA9555的I/O端口可耐受5V电压,兼容大多数微控制器。它还具有400kHz的快速I2C总线,以及针对多达8个器件使用的3个硬件地址引脚寻址功能。此外,它还具有极性反转寄存器,允许用户根据需要配置每个通道的极性。
- 驱动能力:PCA9555具有最大高电流驱动能力的锁存输出,可用于直接驱动LED等外部设备。
总之,PCA9555是一款功能强大、配置灵活且兼容性良好的I/O扩展芯片,适用于各种需要额外I/O的应用场景。
二、配置方法
1、配置地址位
PCA9555是一款基于I²C总线的16位通用并行输入/输出(GPIO)扩展芯片。其配置地址的设置是通过I²C通信协议和特定的地址位来实现的。以下是关于PCA9555配置地址的详细说明:
- 地址位:PCA9555的地址位由A2、A1和A0三个硬件引脚决定。这三个引脚通常被称为“地址引脚”或“寻址引脚”,用于设置PCA9555在I²C总线上的唯一地址。每个引脚都有两种状态(高电平或低电平),因此,通过组合这三个引脚的不同状态,最多可以连接8个PCA9555芯片到同一个I²C总线上,而不会产生地址冲突。
- I²C通信:PCA9555通过I²C总线与主控制器(如微处理器、微控制器等)进行通信。
- 地址格式:PCA9555的地址格式由8位组成。其中,前4位是固定的,后3位(A2、A1、A0)则是由PCA9555的地址引脚决定的,用于在同一I²C总线上区分不同的PCA9555芯片。
- 读写操作:地址的最后一位(也称为“读写位”或“R/W位”)用于指示接下来的操作是读操作还是写操作。当读写位为高电平时(通常为1),表示接下来的操作是读操作;当读写位为低电平时(通常为0),表示接下来的操作是写操作。
2、Command Byte寄存器
PCA9555芯片提供了多种内部寄存器,用于配置和管理其GPIO(通用输入输出)端口的行为。以下是关于PCA9555芯片主要寄存器地址的说明:
- 输入寄存器 0x00、0x01(Input Register):
- 功能:输入寄存器反映GPIO端口的当前输入状态。无论引脚被配置为输入还是输出,输入寄存器都会显示引脚的实际电平状态。
- 输出寄存器 0x02、0x03(Output Register):
- 功能:输出寄存器控制GPIO端口的输出状态。当引脚被配置为输出时,写入输出寄存器将改变相应引脚的电平状态。
- 极性反转寄存器 0x02、0x03(Polarity Inversion Register):
- 功能:极性反转寄存器允许用户配置每个GPIO引脚是否进行极性反转。例如,如果某个引脚被设置为极性反转,则高电平输入将被视为低电平,低电平输入将被视为高电平。
- 配置寄存器 0x06、0x07(Configuration Register):
- 功能:配置寄存器用于设置每个GPIO引脚的工作模式(输入或输出)。
要访问这些寄存器,主控制器(如微处理器或微控制器)需要通过I²C总线向PCA9555发送特定的命令和数据。命令通常包括PCA9555的I²C地址、要访问的寄存器地址以及读写位。数据则用于读取或写入寄存器的内容。
3、端口配置时序
3.1、配置输入输出模式
PCA9555在配置输入输出模式时,主要涉及到的是其配置寄存器0x06、0x07(Configuration Register)。这个寄存器允许用户为每个GPIO引脚设置其工作模式,即输入或输出。这里是配置的P00~P07的IO口。
- Slave Address为PCA9555的通信地址。
- Command Byte为需要访问的寄存器。
- Data为需要设置的P00~P07端口的输入输出工作模式。
3.2、写入Write端口输出状态
在PCA9555中,设置P00~P07端口的电平状态通常是通过写入输出寄存器(Output Register)来实现的。
- 单片机发送PCA9555的设备地址(包括由A2、A1、A0确定的地址位)以及一个写操作位(通常为0,表示写操作)。设备地址和写操作位一起构成了I²C地址字节。
- 单片机接下来发送输出寄存器的地址。这个地址指定了要写入哪个输出寄存器(0x02对于P00~P07)。
- 单片机现在发送要写入输出寄存器的数据。对于P00~P07,这通常是8位的数据,其中每一位对应一个GPIO引脚的电平状态(0为低电平,1为高电平)。
3.3、读取Read端口输入状态
在PCA9555中,读取P10~P17端口的电平状态通常是通过读取输入寄存器(Input Register)来实现的。
- 单片机发送PCA9555的设备地址(包括由A2、A1、A0确定的地址位)以及一个写操作位(通常为0,表示写操作)。
- 单片机接下来发送读取的寄存器地址。这个地址指定了要读取那个输入寄存器(0x01对于P10~P17)。
- 单片机发送PCA9555的设备地址(包括由A2、A1、A0确定的地址位)以及一个读操作位(通常为1,表示读操作)。
- 单片机接收寄存器的数据。这通常是一个8位的数据,其中每一位对应一个GPIO引脚的电平状态(0为低电平,1为高电平)。
三、代码示例
//配置扩展IO芯片PCA9555的地址 //0 1 0 0 A2 A1 A0
#define PCA9555 0x40 //0 1 0 0 0 0 0
//扩展IO芯片PCA9555 --> P00~P07读取IO口的电平
#define PCA9555_Input_P0 0x00
//扩展IO芯片PCA9555 --> P10~P17读取IO口的电平
#define PCA9555_Input_P1 0x01
//扩展IO芯片PCA9555 --> P00~P07设置IO口的高低电平
#define PCA9555_Output_P0 0x02
//扩展IO芯片PCA9555 --> P10~P17设置IO口的高低电平
#define PCA9555_Output_P1 0x03
//配置扩展IO芯片PCA9555 --> P00~P07的端口模式
#define PCA9555_Config_P0 0x06
//配置扩展IO芯片PCA9555 --> P10~P17的端口模式
#define PCA9555_Config_P1 0x07
// 扩展IO芯片PCA9555的P00~P07设置为输出(0:输出 1:输入)
uint8_t buff1[]={PCA9555_Config_P0,0x00};
HAL_I2C_Master_Transmit(&hi2c1,PCA9555,buff1,sizeof(buff1),50);
HAL_Delay(20);
// 扩展IO芯片PCA9555的P10~P17设置为输入(0:输出 1:输入)
uint8_t buff2[]={PCA9555_Config_P1,0xFF};
HAL_I2C_Master_Transmit(&hi2c1,PCA9555,buff2,sizeof(buff2),50);
HAL_Delay(20);
完整代码:https://download.csdn.net/download/qq_26043945/89305547