描述
这个用于两线双向总线(I 2 C)的16位扩展器设计用于2.3V至5.5VV CC 运行。通过I 2 C接口[串行时钟(SCL),串行数据(SDA)],它为大多数微控制器系列产品提供通用远程I /O扩展。

PCA9555由两个8位配置(输入或输出选择),输入端口,输出端口和极性反转(高电平有效或低电平有效运行)寄存器组成。在加电时,I /O被配置为输入。系统主控制器可以通过写入I /O配置位将I /O启动为输入或输出。每一个输入或者输出的数据被保存在相应的输入或者输出寄存器内。输入端口寄存器的极性可借助极性反转寄存器进行转换。所有寄存器都可由系统主控器读取。

特性
1μA低待机电流消耗(最大值)
I 2 C至并行端口扩展器
开漏电路低电平有效中断输出
可耐受5V电压的I /O端口
兼容大多数微控制器
li>400kHz快速I 2 C总线
针对多达8个器件使用的3个硬件地址引脚寻址
极性反转寄存器
具有最大高电流驱动能力的锁存输出,可用于直接驱动LED
闩锁性能超出JESD 78 II类规范要求的100mA
< li>静电放电(ESD)保护性能超过JESD 22规范的要求
2000V人体放电模型(A114-A)
200V机器模型(A115-A)
< li> 1000V充电器件模型(C101)

端口扩展芯片 PCA9555重新上电后,配置会恢复到默认值,P0.0引脚默认是输入状态。
在加电时,I/O 被配置为输入。系统主控制器可以通过写入 I/O 配置位将 I/O 启动为输入或输出。每一个输入或者输出的数据被保存在相应的输入或者输出寄存器内。

PCA9555,将8个寄存器分为四个寄存器组,即每组2个寄存器,这样可以联系写两个数据,第二个数据指的是REG_ADDR的下一个寄存器,而且也指出了,没有限制非要写两个数据,可以写一个之后主机立马发送停止位,这样相当于只写了一位数据,这种的状态机就比较复杂一些。

再针对时序进行分析,如下是写的时序,一共有两种command,一种是将数据作为并行端口输出,一种是将相应的寄存器写入到相应的配置中去,分别解释

1、写从机地址,从机应答,写COMMAND指出要开始转换数据,从机应答,写PORT0的数据,从机应答,并开始转换,写PORT1的数据,从机应答,并开始转换,其中转换时间位Tpv,主机发送结束

2、写从机地址,从机应答,写COMMADN指出要写配置寄存器,从机应答,写配置寄存器数据,从机应答,写下一个配置寄存器的数据,从机应答,主机发送结束

#include "pca9555.h"
/******************
笔记:pca9555.pdf
1、P17-控制寄存器和命令字节
2、P17-特性:如果之前有发送命令地址,则读数据命令,会从上个地址顺延,并读取数据。直到发送了新的命令地址。
3、P10-通讯过程:IIC启动-->发送器件识别地址1byte(0bit=R1/W0)-->ACK-->发送器件寄存器地址-->ACK-->[读数据/写数据]1byte
*******************/
U_INPUT   EX_IN;
U_OUTPUT  EX_OUT;/******************************
函数名:PCA9555Init
功  能:初始化器件两组IO口的引脚功能
形  参:PIN--器件信息结构体
返回值:
备  注:
*******************************/
IIC_STATUS PCA9555Init(const IIC_PIN *PIN)
{IIC_STATUS status;IIC_Init(PIN);IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);             //发送器件识别地址+写status = IIC_Wait_ACK(PIN);
//  IIC_WriteByte(PIN, PCA9555_REG_POL0);
//  status |= IIC_Wait_ACK(PIN);
//  IIC_WriteByte(PIN, PCA9555_POLARITY0);
//  status |= IIC_Wait_ACK(PIN);
//  IIC_WriteByte(PIN, PCA9555_POLARITY1);
//  status |= IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, PCA9555_REG_CFG0);     //寄存器地址写入(配置PIN脚为输入或输出)status |= IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, PCA9555_DERECTION0);   //设置IO0的0-7引脚全部为输入模式,因为与拨码器连接,作为IPADDR使用。status |= IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, PCA9555_DERECTION1);   //设置IO1的0-3引脚为输入,4-7为引脚为输出。status |= IIC_Wait_ACK(PIN);IIC_Stop(PIN);if(status)return(IIC_WRITE_ERR);elsereturn(IIC_OK);
}/******************************
函数名:PCA9555GetPin
功  能:从器件读取引脚状态
形  参:PIN--器件信息结构体 pin--存放引脚状态结构体
返回值:
备  注:
*******************************/
IIC_STATUS PCA9555GetPin(const IIC_PIN *PIN, U_INPUT *pin)
{uint8_t ch[2];IIC_STATUS status;IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);              //发送器件地址+写命令status = IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, PCA9555_REG_IN0);        //发送器件寄存器地址--0x00--输入寄存器0地址status |= IIC_Wait_ACK(PIN);IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR | 0x01);       //发送器件地址+读命令status |= IIC_Wait_ACK(PIN);IIC_ReadByte(PIN, &ch[0]);                  //读取[输入寄存器0]的数据IIC_ACK(PIN);IIC_ReadByte(PIN, &ch[1]);                  //读取[输入寄存器1]的数据(特性:地址自动顺延)IIC_NACK(PIN);IIC_Stop(PIN);if(status)return (IIC_READ_ERR);else{pin->input[0] = ch[0];pin->input[1] = ch[1];return (IIC_OK);}
}/******************************
函数名:PCA9555SetPin
功  能:设置器件的扩展IO口电平状态
形  参:PIN--器件信息结构体   pout--存放引脚状态结构体
返回值:
备  注:设置的值,只对之前配置为输出模式的引脚有效,输入模式的引脚无效。
*******************************/
IIC_STATUS PCA9555SetPin(const IIC_PIN *PIN, const U_OUTPUT *pout)
{IIC_STATUS status;IIC_Start(PIN);IIC_WriteByte(PIN, PIN->ADDR);status = IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, PCA9555_REG_OUT0);status |= IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, pout->output[0]);status |= IIC_Wait_ACK(PIN);IIC_WriteByte(PIN, pout->output[1]);status |= IIC_Wait_ACK(PIN);IIC_Stop(PIN);osDelay(10);if(status)return (IIC_WRITE_ERR);elsereturn (IIC_OK);
}
#ifndef __PCA9555_HEAD_
#define __PCA9555_HEAD_#include "stdio.h"
#include "stdint.h"
#include "string.h"
#include "cmsis_os.h"
#include "hal_iic.h"/********************* 个人自定义PAC9555的寄存器参数值***********************/
#define PCA9555_POLARITY0               0x00                                    //极性反转值0(0不反转 1反转,PIN脚为输入时有效,)
#define PCA9555_POLARITY1               0x00                                    //极性反转值1
#define PCA9555_DERECTION0          0xFF                                    //方向配置值0 (0输出 1输入)
#define PCA9555_DERECTION1          0x0F                                    //方向配置值1  高4位输出脚,低四位输入脚/********************* 定义PAC9555的寄存器地址 ***********************/
#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地址typedef struct{GPIO_TypeDef* port;uint16_t      pin;
}T_GPIO_TYPE;/*存放PCA9555扩展口的引脚电平状态*/
typedef union{uint8_t  input[2];uint16_t data;
}U_INPUT;/*需要对PCA9555扩展口的输出引脚设置电平信息*/
typedef union{uint8_t  output[2];uint16_t data;
}U_OUTPUT;extern U_INPUT    EX_IN;
extern U_OUTPUT EX_OUT;
IIC_STATUS PCA9555Init(const IIC_PIN *PIN);
IIC_STATUS PCA9555GetPin(const IIC_PIN *PIN,U_INPUT *pin);
IIC_STATUS PCA9555SetPin(const IIC_PIN *PIN,const U_OUTPUT *pout);#endif

pca9555.pdf

单片机 STM32 HAL IO扩展 PCA9555相关推荐

  1. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

  2. 单片机 STM32 HAL 网络模块 ENC28J60

    文章目录 一. 简介 二.特性 三.示例代码 一. 简介 ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器.它可作为任何 ...

  3. 单片机 STM32 HAL 温湿度 DS18B20

    /*************笔记**************** 1.CubeMX 定义任意一个引脚,作为数据脚,并对引脚作出如下配置:GPlO output level --LOWGPIO mode ...

  4. 单片机 STM32 HAL 步进电机 Motor

    /*************笔记**************** 1.CubeMX 定义任意四个引脚,作为ABCD相,并对引脚作出如下配置:GPlO output level --HighGPIO m ...

  5. 单片机 STM32 HAL PCF8574 例子代码

    #include "extgpio.h" #include "pcf8574.h" #include "74hc595.h" /****** ...

  6. 单片机 STM32 HAL 射频读卡器 RC522

    1.CubeMX 定义任意两个引脚,作为复位脚和片选脚,并对引脚作出如下配置: GPlO output level --High GPIO mode --Output Open Drain GPIO ...

  7. 单片机 STM32 HAL 液晶屏 LCD16032

    笔记: 1.采用串行输出 2.器件 [16 NC(PSB)]引脚需要接地, H:并口通信 L:串口通信 3.LCD_CS_Pin LCD_CS_GPIO_Port //片选控制,0,无效 1有效 LC ...

  8. 分享一款基于51单片机和MCP23017的IO扩展方案

    大家好,我是『芯知识学堂』的SingleYork,今天笔者要给大家分享一款单片机IO扩展的设计方案. 学单片机的小伙伴们都知道,单片机的IO口数量都是固定的,在做项目的时候,需要根据自己实际用到的IO ...

  9. 【51单片机快速入门指南】4.5:I2C 与 TCA6416实现双向 IO 扩展

    目录 硬知识 IO 扩展芯片 TCA6416A TAC6416A 的寄存器 IO 输入寄存器 IO 输出寄存器 IO 反相寄存器 IO 方向寄存器 TCA6416A 的操作 TCA6416A 写数据 ...

最新文章

  1. php计算格子xy,经纬度BL和直角坐标XY的正算反算 PHP代码
  2. SSL 1460——最小代价问题
  3. 精密单电源虚拟地芯片 TLE2426
  4. Selenium3自动化测试——18.窗口截图
  5. LeetCode Paint House II
  6. 软件项目开发流程及配置人员
  7. MySQL的空值查询
  8. 恢复mysql中root用户的所有权限_如何还原MySQL root用户的全部权限
  9. 深度搜索剪枝——数的划分
  10. 手把手教你实现Java发送邮件(1)-发送简单的文本
  11. java 实现压缩zip的几种方案
  12. Android轮播换背景,Android实现背景图片轮播
  13. 【WhatsApp营销】如何设置欢迎消息?WhatsAppBusiness问候语示例
  14. 四十岁以后,如何做夫妻?
  15. 华为DHCPv6实验配置
  16. Linux的操作系统
  17. 2.石头游戏(坑爹)
  18. 电车防盗报警器电路原来是这样的!
  19. java频繁的读写文件_大量较为频繁读写的文件一般如何进行存储?
  20. dpdk 的环境配置搭建

热门文章

  1. 华硕路由器官方固件开机自动运行脚本方法
  2. C++ 变量的生存期
  3. 查验身份证 浙大陈越习题
  4. Windows系统安全检查脚本
  5. 利用Javascript制作宾果(BINGO)游戏
  6. python读取文件详解_python 文件读取方法详解
  7. 缺少包含@author的注释信息解决方法
  8. python中lis的意思_Python语言入门(二)
  9. 自动还原魔方算法数据结构
  10. 智能硬件产品盈利模式