STM32外设芯片驱动学习记录 —— (二) PCA9555 IO扩展芯片驱动开发

STM32外设芯片驱动学习记录 —— (二) PCA9555 IO扩展芯片驱动开发目录 一 芯片介绍 二 Datasheet 解读 1 硬件说明 2 寄存器说明 3 通信过程 三 驱动代码编写 1 软件 I2C 驱动 2 PCA9555 芯片驱动函数 总结 一 芯片介绍 PCA9555 可设置 16 路输入或输出口 I2C 接口 用于 IO 扩展 3 个硬件地址引脚寻址

大家好,我是讯享网,很高兴认识大家。

目录

一、芯片介绍

二、Datasheet解读

1.硬件说明

2.寄存器说明

3.通信过程

三、驱动代码编写

1.软件I2C驱动

2. PCA9555芯片驱动函数

总结

 一、芯片介绍

        PCA9555可设置16路输入或输出口,I2C接口,用于IO扩展,3个硬件地址引脚寻址,工作电压:VCC(2.3V 至 5.5V)。

二、Datasheet解读

1.硬件说明

1)框图

48499ec930a744e8bcd5401e0e0adbde.png
讯享网

 

  • INT:中断输出
  • A0,A1,A2:器件地址
  • SCL,SDA:I2C总线
  • VCC,GND:器件电源供电
  • P07-P00:内部时钟

2)引脚说明

fe3d9d3e93684bc38d20665c0f980fcc.png

bfae25c18bea4cdba34af9c756165935.png 

2.寄存器说明

      cb75896e3662481c8702863c605ae87a.png

 1、对应控制寄存器的控制指令如下:

667c1cf29c7045e9ba20772c30ff23c7.png

 2、硬件地址寻址说明:最多可连接8个芯片

9f925b96b09a4fce908a3c616d46497b.png

 3、器件寄存器

①输入寄存器,用于读取输入IO值

77bfe1ad298b4fe199ab77a44298ccad.png

②输出寄存器,用于写入输出IO值

f14772e494af49d68c6441938cabc22e.png 

③极性设置寄存器,用于设置输入IO的有效电平

ab9a27acea8c4467ba8cdf9aa9cc5d5d.png 

④配置IO口为输入还是输出端口,1为输入,0为输出

081bec93ee7b4b04a2dfc0ceb1389fd4.png 

3.通信过程

       1,写时序

d98411d255c94919bae281acca4b77a4.png

归纳为:器件地址+寄存器命令+P0数据+P1数据 

        2,读时序

b59333730c424cff90d3d73a0906837c.png

 归纳为:器件地址+寄存器命令+器件地址+P0数据+P1数据

三、驱动代码编写

1.软件I2C驱动

        可参照BH1750驱动学习记录:https://blog.csdn.net/Huan_Xiang_Yu/article/details/

2. PCA9555芯片驱动函数

#define PCA9555_1 0x20//地址:A2 A1 A0均为低电平 #define PCA9555_2 0x21//地址:A2 A1 为低电平,A0为高电平 /* 定义PCA9555的寄存器地址 */ #define PCA9555_REG_IN0 0x00 //输入寄存器0地址 #define PCA9555_REG_IN1 0x01 //输入寄存器1地址 #define PCA9555_REG_OUT0 0x02 //输出寄存器0地址 #define PCA9555_REG_OUT1 0x03 //输出寄存器1地址 #define PCA9555_REG_POL0 0x04 //极性反转寄存器0地址(PIN脚为输入时有效) #define PCA9555_REG_POL1 0x05 //极性反转寄存器1地址 #define PCA9555_REG_CFG0 0x06 //方向配置寄存器0地址 #define PCA9555_REG_CFG1 0x07 //方向配置寄存器1地址 void PCA9555_Init(void); void PCA9555_WriteData(uint8_t slaveAddress, uint16_t REG_Data); uint16_t PCA9555_ReadData(uint8_t slaveAddress); #include "myiic.h" #include "PCA9555.h" / * 函数功能: 输入极性设置 * 输入参数: slaveAddress:器件地址 REG_Data :设置值0xffee(ff设置P1,ee设置P0) * 返 回 值: 无 * 说 明: 无 */ void PCA9555_Polarity_Inversion(uint8_t slaveAddress, uint16_t REG_Data) { uint8_t buf[3]={0}; buf[0]=PCA9555_REG_POL0; buf[1]=(uint8_t)REG_Data; buf[2]=(uint8_t)(REG_Data>>8); Soft_I2C_Write(slaveAddress,buf,3,1); } / * 函数功能: IO配置 * 输入参数: slaveAddress:器件地址 REG_Data :设置值0xffee(ff设置P1,ee设置P0) * 返 回 值: 无 * 说 明: 无 */ void PCA9555_IOConfiguration(uint8_t slaveAddress, uint16_t REG_Data) { uint8_t buf[3]={0}; buf[0]=PCA9555_REG_CFG0; buf[1]=(uint8_t)REG_Data; buf[2]=(uint8_t)(REG_Data>>8); Soft_I2C_Write(slaveAddress,buf,3,1); } / * 函数功能: 输出口数据 * 输入参数: slaveAddress:器件地址 REG_Data :设置值0xffee(ff设置P1,ee设置P0) * 返 回 值: 无 * 说 明: 无 */ void PCA9555_WriteData(uint8_t slaveAddress, uint16_t REG_Data) { uint8_t buf[3]={0}; buf[0]=PCA9555_REG_OUT0; buf[1]=(uint8_t)REG_Data; buf[2]=(uint8_t)(REG_Data>>8); Soft_I2C_Write(slaveAddress,buf,3,1); } / * 函数功能: 读取输入口数据 * 输入参数: slaveAddress:器件地址 REG_Data :设置值0xffee(ff设置P1,ee设置P0) * 返 回 值: 无 * 说 明: 无 */ uint16_t PCA9555_ReadData(uint8_t slaveAddress) { uint8_t buf[2]={0}; uint16_t temp; uint8_t sendBuffer[1]={0}; sendBuffer[0]=PCA9555_REG_IN0; Soft_I2C_Write(slaveAddress,sendBuffer,1,0); Soft_I2C_Read(slaveAddress, buf, 2, 1); temp= ((uint16_t)buf[1]<<8) + buf[0] ; return temp; } / * 函数功能: PCA9555初始化 * 输入参数: 无 * 返 回 值: 无 * 说 明: 无 */ void PCA9555_Init(void) { PCA9555_IOConfiguration(PCA9555_1, 0xFFFF );// I2C设备PCA9555-1(地址 0x20) 的16个IO口 输入/输出配置,bit表示,1 - 输入,0 - 输出 PCA9555_IOConfiguration(PCA9555_2, 0 );// I2C设备PCA9555-2(地址 0x21) 的16个IO口 输入/输出配置,bit表示,1 - 输入,0 - 输出 PCA9555_Polarity_Inversion(PCA9555_1, 0xFFFF);// I2C设备PCA9555-1(地址 0x20) 输入/输出口反向,bit表示,1 - 反向,0 - 默认 }

讯享网

总结

        参考源代码如下链接:

https://download.csdn.net/download/Huan_Xiang_Yu/

 

小讯
上一篇 2025-03-04 09:10
下一篇 2025-02-24 17:50

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/118486.html