目录
一、芯片介绍
二、Datasheet解读
1.硬件说明
2.寄存器说明
3.通信过程
三、驱动代码编写
1.软件I2C驱动
2. PCA9555芯片驱动函数
总结
一、芯片介绍
PCA9555可设置16路输入或输出口,I2C接口,用于IO扩展,3个硬件地址引脚寻址,工作电压:VCC(2.3V 至 5.5V)。
二、Datasheet解读
1.硬件说明
1)框图
- INT:中断输出
- A0,A1,A2:器件地址
- SCL,SDA:I2C总线
-
VCC,GND:器件电源供电
-
P07-P00:内部时钟
2)引脚说明
2.寄存器说明
1、对应控制寄存器的控制指令如下:
2、硬件地址寻址说明:最多可连接8个芯片
3、器件寄存器
①输入寄存器,用于读取输入IO值
②输出寄存器,用于写入输出IO值
③极性设置寄存器,用于设置输入IO的有效电平
④配置IO口为输入还是输出端口,1为输入,0为输出
3.通信过程
1,写时序
归纳为:器件地址+寄存器命令+P0数据+P1数据
2,读时序
归纳为:器件地址+寄存器命令+器件地址+P0数据+P1数据
三、驱动代码编写
1.软件I2C驱动
可参照BH1750驱动学习记录:https://blog.csdn.net/Huan_Xiang_Yu/article/details/127341523
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/87585761