I2C 总线拓展GPIO 通道

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

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值