前言
PCF8574 是 NXP公司生产的一款芯片。该芯片可以通过IIC协议进行IO口扩展。每个IO口可以单独的分配为输入或者输出。例如,作为输入时,可以用于监控中断或者键盘。作为输出时,可以用于点亮发光二极管。系统控制器可以通过单独的寄存器读取输入端口状态或者配置输出端口状态。

因为该芯片具有三个地址管脚,也就是最多可以同时分配8个地址。所以,在同一个系统中,最多可以通过16个管脚拓展出128个IO口。此外,该芯片还提供一个中断管脚(低电平有效)。当任何一个输入管脚和其对应的寄存器状态不同时,触发该中断。

单片机 STM32 HAL IO扩展 PCF8574_#include


设备地址

为了节省电能,PCF8574内部没有在地址管脚放置上拉电阻,因此,这几个地址必须外部置高或者置低。这些地址管脚可以直连或者通过一个电阻连接到VCC或者GND。

单片机 STM32 HAL IO扩展 PCF8574_数据_02


PCF8574是一款并口扩展芯片,它的引脚图如下图所示,它与主控芯片通过IIC接口进行通讯。

在这个电路中,S71为8路的拨码开关,拨码开关的一段接地,另一端接上拉电阻,并且与PCF8574的8路扩展IO连接。当拨码开关闭合时,输出低电平,当拨码开关断开时,输出高电平。PCF8574的SDA和SCL与单片机的IIC接口连接。这样单片机通过2个引脚就可以读取8路拨码开关的输入信号,如果将地址不同的8个PCF8574都挂接到IIC总线上,则最多可以读取64路信号的输入。

PCF8574是CMOS电路。它通过两条双向总线(I2C)可使大多数MCU实现远程IO口扩展。
该器件包含一个8位准双向口和一个I2CC总线接口,PCF8574电流消耗很低,且输出锁存具
有大电流驱动能力,可直接驱动LED.它还带有一条中断接线(INT)可与MCU的中断逻辑相
连。通过INT发送中断信号,远端IO口不必经过I2C总线通信就可通知MCU是否有数据从端
口输入。这意味着PCF8574可以作为一个单被控器。

​使用教程​

读首先要写,第一次一定要发COMMAND,决定要读哪个寄存器,不然不确定读的是哪个,重新开始之后,主机写从机地址,然后写1,读命令位,然后从机应答,并且从机开始发送之前command指定读取的内容

1、主机发送从机地址,首次发送写,从机应答,主句发送command命令,从机应答,主机发送开始,并发送从机地址,从机应答,从机开始发送第一位数据,主机应答,从机开始发送第二位数据,主机应答,主机不应答,主机发送终止信号

主机发送开始, 并发送从机数据,从机应答,并且开始读取port0的数据,并且发送到主机,读取port0的数据是ack信号后的一定的保持时间内,tph,这时候数据不能变化,不然读取不准,然后发完之后,主机应答,然后再读取port1的数据,如果主机不发送nack,则来回发送

INT的时序,有当数据变化,什么时候拉低,有当读取完之后,什么时候拉高,不读取则一直位低等待读取

#include "pcf8574.h"
/******************
笔记:
1、PCF8574寻址:1帧1字节,[0100 A2 A1 A0 R1/W0]
2、
3、
*******************/

/******************************
函数名:PCF8574ReadByte
功 能:读取端口状态
形 参:I--器件信息结构体 ch--用于存放端口状态的变量
返回值:0--正常 1--错误
备 注:
*******************************/
IIC_STATUS PCF8574ReadByte(const IIC_PIN *I, uint8_t *ch)
{
uint8_t tmp;
IIC_STATUS status;

IIC_Start(I);
IIC_WriteByte(I, I->ADDR | 0x01); //发送器件地址,并切换为读取模式
status = IIC_Wait_ACK(I);
if(status)
{
return(IIC_WRITE_ERR);
}
else
{
IIC_ReadByte(I, &tmp); //读取数据
IIC_NACK(I);
IIC_Stop(I);
*ch = tmp;
return(IIC_OK);
}
}

/******************************
函数名:PCF8574WriteByte
功 能:写入端口状态
形 参:I--器件信息结构体 ch--欲写入端口状态的变量
返回值:0--正常 1--错误
备 注:
*******************************/
IIC_STATUS PCF8574WriteByte(const IIC_PIN *I, uint8_t ch)
{
IIC_STATUS status;

IIC_Start(I);
IIC_WriteByte(I, I->ADDR); //发送器件地址,并切换为写入模式
status = IIC_Wait_ACK(I);
if(status)
{
return(IIC_WRITE_ERR);
}
else
{
IIC_WriteByte(I, ch); //数据写入
status |= IIC_Wait_ACK(I);
IIC_Stop(I); //停止
if(status)
{
return(IIC_WRITE_ERR);
}
else
{
return(IIC_OK);
}
}
}
#ifndef __PCF8574_HEADER__
#define __PCF8574_HEADER__

#include "hal_iic.h"

IIC_STATUS PCF8574ReadByte(const IIC_PIN *I, uint8_t *ch);
IIC_STATUS PCF8574WriteByte(const IIC_PIN *I, uint8_t ch);

#endif //__PCF8574_HEADER__

​PCF8574中文手册.pdf​