1.简介
PCA9555 是24 Pin 的CMOS 设备,为I2C总线提供 16位通用并行输入/输出的(GPIO)拓展,是个IO拓展器。增强了IO的驱动能力,更低的电源电流等。
当ACPI电源开关、传感器、按钮、led、风扇等需要额外的I/O时,I/O扩展器提供了一个简单的解决方案,PCA9555包括两个8位配置(输入或输出选择);
系统主控可以通过写入输入IO配置位来启用输入IO作为输入或输出。每个输入或输出的数据都保存在相应的输入或输出寄存器中。
读取寄存器的极性可以用极性反转寄存器进行倒置。
设备地址:0x4X,根据电路图具体接线确定地址。
2.寄存器
共有8个字节命令寄存器,通过配置最后两个寄存器,来定义Port 0, Port 1的模式,输入或输出
地址如下:
#define PCA9555_U53_INPUT_PORT0_REG 0x00
#define PCA9555_U53_INPUT_PORT1_REG 0x01
#define PCA9555_U53_OUTPUT_PORT0_REG 0x02
#define PCA9555_U53_OUTPUT_PORT1_REG 0x03
#define PCA9555_U53_INVERSION_PORT0_REG 0x04
#define PCA9555_U53_INVERSION_PORT1_REG 0x05
#define PCA9555_U53_CONFIG_PORT0_REG 0x06
#define PCA9555_U53_CONFIG_PORT1_REG 0x07
Registers 6 and 7: Configuration registers
往对应位写 1 ,对应端口引脚配置位高阻抗驱动器的输入,写0,对应端口配置为输出
3.设备初始化
/*初始化设备A为输出*/
void AXL9555_REG_Init(void)//初始化为输出模式
{
uint8_t AXL9555_REG[8]; //PCA9555:共8个REG
AXL9555_REG[6] = 0x00; //配置第6个REG
AXL9555_REG[7] = 0x00;
HAL_I2C_Mem_Write(&hi2c2, XL9555_Addr1, AXL9555_CONFIG_PORT0_REG, I2C_MEMADD_SIZE_8BIT, &AXL9555_REG[6], 2, 1000);//6:U74_REG 第6个寄存器
}
初始化器件U53 为输入,器件A输出信号,器件U53接收信号
void PCA9555_U53_REG_Init(void)//初始化为输入
{
uint8_t PCA9555_U53_REG[8]; //PCA9555:共8个REG
PCA9555_U53_REG[6] = 0xFF; //配置第6,7个REG,使端口为高阻抗输出模式
PCA9555_U53_REG[7] = 0xFF;
//取数组的第7位为基地址,连续写入两个数据,每个数据8 bit
HAL_I2C_Mem_Write(&hi2c2, PCA9555_U53Addr, PCA9555_U53_CONFIG_PORT0_REG, I2C_MEMADD_SIZE_8BIT, &PCA9555_U53_REG[6], 2, 1000);//6:U74_REG 第6个寄存器
}
4.设备A输入给值
void AXL9555_SET0 (void) //往Port0,Port1 两组IO 写0,读U53 器件读到的值是否为0x00 0x00
{
uint8_t AXL9555_OUTPUT_PORT0 = 0x00;
uint8_t AXL9555_OUTPUT_PORT1 = 0x00;
TCA9548A_SetChannel(0);
AXL9555_REG_Init();
HAL_I2C_Mem_Write(&hi2c2,XL9555_Addr1,AXL9555_OUTPUT_PORT0_REG,I2C_MEMADD_SIZE_8BIT,&AXL9555_OUTPUT_PORT0,1,100);
HAL_I2C_Mem_Write(&hi2c2,XL9555_Addr1,AXL9555_OUTPUT_PORT1_REG,I2C_MEMADD_SIZE_8BIT,&AXL9555_OUTPUT_PORT1,1,100);
printf ("AXL9555_SET0 ok\r\n");
}
/*往Port0,Port1 两组IO 写1,读U53 器件读到的值是否为0xFF 0xFF,可写入其它值验证*/
void AXL9555_SET1 (void)
{
uint8_t AXL9555_OUTPUT_PORT0 = 0xFF;
uint8_t AXL9555_OUTPUT_PORT1 = 0xFF;
TCA9548A_SetChannel(0);
AXL9555_REG_Init();
HAL_I2C_Mem_Write(&hi2c2,XL9555_Addr1,AXL9555_OUTPUT_PORT0_REG,I2C_MEMADD_SIZE_8BIT,&AXL9555_OUTPUT_PORT0,1,100);
HAL_I2C_Mem_Write(&hi2c2,XL9555_Addr1,AXL9555_OUTPUT_PORT1_REG,I2C_MEMADD_SIZE_8BIT,&AXL9555_OUTPUT_PORT1,1,100);
printf ("AXL9555_SET1 ok\r\n");
}
5. 读U53器件两组IO 的值
void RD_PCA9555_U53_Value(void)
{
uint8_t U53_IO_0_7;
uint8_t U53_IO_1_7;
TCA9548A_SetChannel(4);//此案例通过I2C 开关四扫描到U53设备,故需先开通道,具体案例具体分析
PCA9555_U53_REG_Init ();
HAL_I2C_Mem_Read (&hi2c2,PCA9555_U53Addr,PCA9555_U53_INPUT_PORT0_REG,I2C_MEMADD_SIZE_8BIT,&U53_IO_0_7,1,1000);
printf ("the U53_IO_0_7 Value is:0x%02X \r\n",U53_IO_0_7);
HAL_I2C_Mem_Read (&hi2c2,PCA9555_U53Addr,PCA9555_U53_INPUT_PORT1_REG,I2C_MEMADD_SIZE_8BIT,&U53_IO_1_7,1,1000);
printf ("the U53_IO_1_7 Value is:0x%02X \r\n",U53_IO_1_7);
}
4. 结果
通过调用串口指令,读U53的值
AXL9555_SET0 ,RD_U53_PRNST,可读到 0x00 0x00
AXL9555_SET1 ,RD_U53_PRNST,可读到 0xFF 0xFF