PCF8574芯片介绍及驱动方法

文章目录

  • 前言
  • 一、PCF8574芯片介绍
  • 二、PCF8574读写地址确定
  • 三、PCF8574读写模式传输数据
  • 四、PCF8574准双向I/O口
  • 五、PCF8574驱动程序编写
  • 总结


前言

本篇文章带大家学习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的驱动代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/126646.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【kafka】Java客户端代码demo:自动异步提交、手动同步提交及提交颗粒度、动态负载均衡

一&#xff0c;代码及配置项介绍 kafka版本为3.6&#xff0c;部署在3台linux上。 maven依赖如下&#xff1a; <!-- kafka --><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka_2.13</artifactId><version>3.6.0…

Dapp开发流程以及应用

随着区块链技术的发展和普及&#xff0c;Dapp&#xff08;去中心化应用&#xff09;逐渐成为了区块链领域中备受关注的话题。Dapp是一种运行在区块链网络上的应用程序&#xff0c;具有去中心化、透明、安全、自治等特点&#xff0c;能够为人们提供更加便捷、高效、安全的应用体…

Stable Diffusion webui 源码调试(一)

Stable Diffusion webui 源码调试&#xff08;一&#xff09; 个人模型主页&#xff1a;LibLibai stable-diffusion-webui 版本&#xff1a;v1.4.1 内容更新随机&#xff0c;看心情调试代码~ 调试txt2img的参数和工作流 文件 /work/stable-diffusion-webui/modules/txt2img…

Rust和isahc库编写代码示例

Rust和isahc库编写的图像爬虫程序的代码&#xff1a; rust use isahc::{Client, Response}; fn main() { let client Client::new() .with_proxy("") .finish(); let url ""; let response client.get(url) .send() …

rtklib进行PPK解算

使用RTKLIB_bin-rtklib_2.4.3&#xff0c; 打开RTKPOST。 配置相关文件的路径&#xff0c;如果没有广播星历&#xff0c;则到武汉大学IGS数据中心 下载。 打开Options&#xff0c;进行配置。 点击执行 解算中 查看成果

使用OkHttp库爬取百度云视频详细步骤

目录 摘要 一、OkHttp库简介 二、爬虫基本概念 三、使用OkHttp库爬取百度云视频 1、发送HTTP请求 2、处理响应 3、下载文件 四、可能遇到的问题及解决方案 五、注意事项 总结与建议 摘要 本文将详细介绍如何使用OkHttp库爬取百度云视频。文章首先简要介绍OkHttp库和…

stm32f407栈溢出导致跑程序异常

栈溢出&#xff0c;固件下载后&#xff0c;会运行异常。如下代码&#xff1a; 代码运行异常&#xff0c;进入debug&#xff0c;发现有hard fault的错&#xff1a; 因为栈已经溢出&#xff0c;一般MCU的栈地址都是向下增长的&#xff0c;stm32也是一样&#xff0c;stm32在启动文…

《QT从基础到进阶·十六》QT实现客户端和服务端的简单交互

QT版本&#xff1a;5.15.2 VS版本&#xff1a;2019 客户端程序主要包含三块&#xff1a;连接服务器&#xff0c;发送消息&#xff0c;关闭客户端 服务端程序主要包含三块&#xff1a;打开消息监听&#xff0c;接收消息并反馈&#xff0c;关闭服务端 1、先打开服务端监听功能 …

Java 设计模式——访问者模式

目录 1.概述2.结构3.案例实现3.1.抽象访问者类3.2.抽象元素类3.3.具体元素类3.4.具体访问者类3.5.对象结构类3.6.测试 4.优缺点5.使用场景6.扩展6.1.分派6.2.动态分配6.3.静态分配6.4.双分派 1.概述 访问者模式 (Visitor Pattern) 是一种行为型设计模式&#xff0c;它用于将数…

jQuery中显示与隐藏

在我们jQuery当中&#xff0c;有多个显示隐藏的方法&#xff0c;本篇介绍一下hide()、show()、toggle() 在我们JS当中&#xff0c;或是CSS当中&#xff0c;我们常用到display:none或block; 在我们jQuery当中&#xff0c;我们该如何实现显示隐藏 在我们jQuery当中&#xff0c;我…

定义无向加权图,并使用Pytorch_geometric实现图卷积

首先定义无向边并定义边的权重 import torch import torch.nn as nn from torch_geometric.nn import GCNConv import torch.nn.functional as F from torch_geometric.data import Dataa torch.LongTensor([0, 0, 1, 1, 2, 2, 3, 4]) b torch.LongTensor([0, 1, 2, 3, 1, 5,…

amazon产品采集数据

导入需要的库&#xff1a;requests&#xff0c;BeautifulSoup&#xff0c;re&#xff0c;chardet requests用于发送HTTP请求&#xff1b;BeautifulSoup用于解析HTML&#xff1b;re用于正则表达式&#xff1b;chardet用于识别网页编码。 定义函数&#xff0c;接受URL参数&#…

c语言初学者用vs还是vscode?

c语言初学者用vs还是vscode? 看是科班还是自学&#xff0c;一般学校会有要求的编译软件&#xff0c;在这两者之间&#xff0c;用VS的居多&#xff0c;一个可能的原因是VS不用自己装环境。 最近很多小伙伴找我&#xff0c;说想要一些 c语言的资料&#xff0c;然后我根据自己从…

Spring的循环依赖问题

文章目录 1.什么是循环依赖2.代码演示3.分析问题4.问题解决5.Spring循环依赖6. 疑问点6.1 为什么需要三级缓存6.2 没有三级缓存能解决吗&#xff1f;6.3 三级缓存分别什么作用 1.什么是循环依赖 上图是循环依赖的三种情况&#xff0c;虽然方式有点不一样&#xff0c;但是循环依…

一个不用充钱也能让你变强的 VSCode 插件!!!

今天给大家推荐一款不用充钱也能让你变强的 vscode 插件 通义灵码&#xff08;TONGYI Lingma&#xff09;&#xff0c;可以称之为 copilot 的替代甜品 &#x1f4aa; 前言 之前一直使用的 GitHub Copilot&#xff0c;虽然功能强大&#xff0c;但是收费相对来说有点贵&#xf…

HTTParty库数据抓取代码示例

使用HTTParty库的网络爬虫程序&#xff0c; ruby require httparty # 设置服务器 proxy_host proxy_port # 使用HTTParty库发送HTTP请求获取网页内容 response HTTParty.get(/, :proxy > { :host > proxy_host, :port > proxy_port }) # 打印获取的网页内容 …

【Python深入学习】- 书籍推荐|数据结构和算法介绍|内建集合数据类型

&#x1f308;个人主页: Aileen_0v0 &#x1f525;系列专栏:PYTHON学习系列专栏 &#x1f4ab;"没有罗马,那就自己创造罗马~" 若把编写代码比作行军打仗&#xff0c;那么要想称霸沙场&#xff0c;不能仅靠手中的利刃&#xff0c;还需深谙兵法。Python是一把利刃&…

解决:AttributeError: ‘WebDriver‘ object has no attribute ‘find_element_by_id‘

解决&#xff1a;AttributeError: ‘WebDriver’ object has no attribute ‘find_element_by_id’ 背景 在使用之前的代码通过selenium定位元素时&#xff0c;报错&#xff1a;selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to loca…

无线测温系统在电厂的必要性,保障电力系统稳定运行

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;采集关键电力设备接电的实时温度&#xff0c;克服有线温度监测系统存在的诸如线路多&#xff0c;布线复杂&#xff0c;维护困难等不足&#xff0c;将无线无源传感器与Zigbee无线通信技术相结合&#xff0c;将物联网技…

如何在Visual Studio上创建项目并运行【超级详细】

工欲善其事&#xff0c;必先利其器。想要学好编程&#xff0c;首先要把手中的工具利用好&#xff0c;今天小编教一下大家如何在史上最强大的编译器--Visual Studio上创建项目。&#x1f357; 一.打开编译器&#x1f357; 双击你电脑上的vs&#xff0c;(2012,2019,2022)都行。&…