PCF8574芯片介绍及驱动方法

举报
yd_274589494 发表于 2023/11/21 10:08:41 2023/11/21
【摘要】 @TOC 前言本篇文章带大家学习PCF8574芯片,了解PCF8574芯片有什么作用,以及学习PCF8574的控制方法。 一、PCF8574芯片介绍PCF8574是TI(Texas Instruments)公司生产的一种常见的I/O扩展芯片,用于将微控制器的少量GPIO引脚扩展为更多的GPIO接口。它采用I2C总线(串行通信协议)进行与微处理器的通信。PCF8574芯片具有8个并行输入/输出...

@TOC


前言

本篇文章带大家学习PCF8574芯片,了解PCF8574芯片有什么作用,以及学习PCF8574的控制方法。

一、PCF8574芯片介绍

PCF8574是TI(Texas Instruments)公司生产的一种常见的I/O扩展芯片,用于将微控制器的少量GPIO引脚扩展为更多的GPIO接口。它采用I2C总线(串行通信协议)进行与微处理器的通信。

PCF8574芯片具有8个并行输入/输出引脚(即I/O口),可以根据需要配置为输入或输出模式。每个I/O口可以提供高电平或低电平的逻辑状态,用于控制外部设备或接口。

以下是PCF8574芯片的特点和工作原理:

1.I2C接口: PCF8574芯片使用I2C通信协议进行与主控器的通信。I2C总线提供了双线控制和数据传输,使得多个设备可以在同一总线上进行通信。

2.8位I/O口: PCF8574芯片提供了8个I/O口,每个I/O口可以配置为输入或输出模式。可以通过读取和写入相应的寄存器来读取或控制每个I/O口的状态。

3.输入缓冲: PCF8574芯片具有输入缓冲区,可以防止输入信号的干扰对芯片的整体性能产生不良影响。

4.输出驱动能力: PCF8574芯片的输出引脚可以提供较高的驱动能力,适用于连接各种外设设备。

5.地址选择: PCF8574芯片的地址可以进行选择,允许多个芯片在同一I2C总线上共存。

PCF8574芯片常用于扩展微控制器的GPIO数量,特别适用于资源有限的嵌入式系统。通过与主控器之间的I2C通信,可以轻松地控制和读取外部设备,例如LED、LCD、继电器等。

需要注意的是,由于PCF8574是一个数字扩展芯片,每个I/O口的输出只能是高电平或低电平,无法进行模拟信号输出。

PCF8574功能框图:
在这里插入图片描述
PCF8574管脚描述和配置:
在这里插入图片描述

二、PCF8574读写地址确定

PCF8574芯片的地址由A0、A1和A2引脚决定,它们可以通过外部电阻的连接方式来设置为高电平(VCC)或低电平(GND),以确定芯片的地址。每个引脚可以选择连接到VCC或GND,以产生不同的电平状态,从而生成不同的地址。

PCF8574的读写地址由7位地址位+1位读写位组成。

假如A2,A1,A0为001,那么PCF8574的读地址为0x42,写地址为0x43。
在这里插入图片描述

三、PCF8574读写模式传输数据

写模式:

写模式发送数据流程:

发送起始信号,发送设备写地址,等待应答,发送数据,(等待应答,发送数据 可以连续发送多个数据)结束信号。
在这里插入图片描述

读模式:

读模式发送数据流程:

发送起始信号,发送设备读地址,等待应答,读取数据,(等待应答,读取数据 可以连续读取多个数据)结束信号。
在这里插入图片描述

四、PCF8574准双向I/O口

准双向I/O口通常指的是可以在输入和输出之间切换的数字I/O口。这种类型的端口允许设备在运行时动态地更改端口的功能,既可以作为输入接口接收外部信号,也可以作为输出接口发送信号。

在数字系统中,一般有两种主要类型的I/O口:

1.输入口: 用于接收外部信号或传感器的数据。这样的口通常被配置为输入,以便读取外部电平或数字信号。
2.输出口: 用于向外部设备发送信号或控制信号。这样的口通常被配置为输出,以便通过改变输出电平或数字值来与外部设备进行通信。

而"准双向I/O口"则允许在运行时切换这两种功能。这种灵活性对于一些应用场景非常有用,例如,一个数字引脚既可以用于读取传感器的数据,又可以用于控制一个执行器。

举例来说,PCF8574就提供了这样的准双向I/O口。它可以配置每个端口是输入还是输出,从而实现动态切换。这种功能使得PCF8574非常适用于通过I2C总线扩展数字I/O的场景,同时提供了灵活性和便利性。
总体来说,准双向I/O口是数字系统中一种非常有用的特性,可以在一个端口上灵活地实现输入和输出功能,以适应不同的应用需求。

PCF8574的8个准双向IO口:

在这里插入图片描述

五、PCF8574驱动程序编写

#include "stm32f4xx_hal.h"

// 定义PCF8574的I2C地址
#define PCF8574_ADDRESS 0x4E

// I2C句柄
I2C_HandleTypeDef hi2c1;

// 初始化I2C总线
void I2C_Init(void)
{
  hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

  if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  {
    Error_Handler();
  }
}

// PCF8574读取一个字节的数据
uint8_t PCF8574_Read(void)
{
  uint8_t data = 0;
  if (HAL_I2C_Master_Receive(&hi2c1, PCF8574_ADDRESS, &data, sizeof(data), HAL_MAX_DELAY) != HAL_OK)
  {
    Error_Handler();
  }
  return data;
}

// PCF8574写入一个字节的数据
void PCF8574_Write(uint8_t data)
{
  uint8_t i2cData[1] = {data};
  
  if (HAL_I2C_Master_Transmit(&hi2c1, PCF8574_ADDRESS, i2cData, sizeof(i2cData), HAL_MAX_DELAY) != HAL_OK)
  {
    Error_Handler();
  }
}

// 主函数
int main(void)
{
  HAL_Init();
  SystemClock_Config();
  
  // 初始化I2C总线
  I2C_Init();

  while (1)
  {
    // 向PCF8574写入数据,控制相应的IO口
    PCF8574_Write(0x0F); // 举例:控制PCF8574的低4位IO口输出高电平,其余输出低电平
    HAL_Delay(1000);
    
    PCF8574_Write(0xF0); // 状态翻转,控制PCF8574的低4位IO口输出低电平,其余输出高电平
    HAL_Delay(1000);
  }
}

总结

本篇文章主要讲解了PCF8574芯片功能,然后带大家编写使用了PCF8574的驱动代码。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。