PCF8574扩展树莓派io口


由于树莓派GPIO数量有限,可以通过i2c总线io扩展芯片增加io口数量。

PCF8574零售5块钱左右,可以扩展出8个io口,挺划算的。

PCF8574引脚:

连接到树莓派:

PCF8574的15脚SDA连接到树莓派3脚

PCF8574的14脚SCL链接到树莓派5脚

PCF8574的8脚VSS、16脚VDD可根据实际连接

注意:A0 A1 A2
是地址选择引脚,三个脚都接GND时芯片地址是0x20,如果使用多片PCF8574拓展时,可通过控制这三个脚电平高低决定芯片的地址。

树莓派操作:

通过i2cdetect查看i2c设备


sudo i2cdetect -y 1

回车后显示:


  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

注意:0x20即当前PCF8574芯片地址。

 C语言实现流水灯:


//demo.c
#include <stdio.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <errno.h>
#define I2C_ADDR 0x20
int main (void) {
int i,value;
int fd;

// 打开设备
fd = open("/dev/i2c-1", O_RDWR);
if (fd < 0) {
printf("Error opening file: %s\n", strerror(errno));
return 1;
}
// 设置I2C从设备地址
if (ioctl(fd, I2C_SLAVE, I2C_ADDR) < 0) {
printf("ioctl error: %s\n", strerror(errno));
return 1;
}
while(1){
for( i = 0 ; i < 8 ; i++ ){

value = (1<<i);
if( write( fd , &value, 1 ) != 1) {
printf("Error writing file: %s\n", strerror(errno));
}

// 延时500ms
usleep(500000);
}
}

return 0;
}

编译:


gcc -o demo demo.c

执行:

sudo ./demo

可将二极管接在PCF8574 io脚的任意两脚验证。

使用wiringPi库实现流水灯:

(wiringPi库安装:http://www.cnblogs.com/wjne/p/3748735.html)


//test.c
#include <stdio.h>
#include <wiringPi.h>
#include <pcf8574.h>
//起始PIN地址,占用 100-107
#define EXTEND_BASE 100
int main (void)
{
// wiringPi初始化
wiringPiSetup( );

// pcf8574初始化,pcf8574的I2C地址为0x20
pcf8574Setup( EXTEND_BASE, 0x20 );

int i;

//设置为输出状态
for ( i = 0 ; i < 8 ; i++ )
{
pinMode( EXTEND_BASE + i, OUTPUT );
}

//流水灯
for (;;)
{
for( i = 0 ; i < 8; i++)
{
digitalWrite ( EXTEND_BASE + i, HIGH);
delay (500);
digitalWrite ( EXTEND_BASE + i, LOW);
delay (500);
}
}
return 0 ;
}

编译:


gcc -o test test.c -l wiringPi

执行:

sudo ./test

时间: 2024-10-09 10:50:59

PCF8574扩展树莓派io口的相关文章

多片PCF8574扩展树莓派IO

这里选择了使用3片PCF8574扩展,可以拓展出24个双向IO口. 如果有不了解,可参考我前边的几篇文章: 树莓派i2c配置 树莓派安装WiringPi库 PCF8574扩展树莓派io口 正面接线图: 反面焊点图: (注意:PCF8574芯片的A0 A1 A2引脚电平状态,这里的接法三片PCF8574的地址分别为 0x20 0x21 0x22 ,实际可根据自己的需要进行调整.) 连接好芯片后,用 i2cdetect  工具查看芯片识别状态 sudo i2cdetect -y 1 如果按我的地址选

51单片机:IO口扩展芯片用法(74HC165,74HC595)

IO口扩展芯片,主要是解决单片机IO口太少. 74HC165:数据从并转串 74HC595:数据从串转并 两种芯片,都是通过时序电路,加上移位功能,进行数据传输 74HC165:数据从并转串.以下实例,实现8个独立按键,控制数码管的8段 #include <reg52.h> #include <intrins.h> typedef unsigned char u8; typedef unsigned int u16; void delay( u16 i ){ while( i--

单片机小白学步系列(二十) IO口原理

IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比较长的篇幅介绍IO口的原理.也是查阅了不少资料,确保内容正确无误,花了很长时间写的.IO口原理原本需要涉及很多深入的知识,而这里尽最大可能做了简化方便理解.这样对于以后解决各种IO口相关的问题会有很大的帮助. IO口等效模型是本人独创的方法,通过此模型,能有效的降低对IO口内部结构理解的难度.并且经查阅资料确认,这种模型和实际工作原理基本一致. ========================================== 前面说了

掌握所有IO口的外部中断

外部中断配置流程 1.初始化IO口工作在普通IO.上拉输入状态. 2.首先开IO口组中断(P0IE=1.P1IE=1.P2IE=1): 3.开组内对应的具体某IO口中断(P0IEM.P1IEM.P2IEM该寄存器里面的对应位对应相应的IO口): 4.上升沿还是下降沿触发(PICTL寄存器): 5.开CPU总中断EA=1; #include <cc2530.h> void main() { //步骤1 P0SEL &=0xDF;//P05口表示为普通IO口 P0DIR &=0xD

STM32的IO口

STM32 的 IO 口 可以由软件配置成如下 8 种模式: 1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽输出 7.推挽式复用功能 8.开漏复用功能 每个 IO 口可以自由编程,但 IO 口寄存器必须要按 32 位字被访问.STM32 的很多 IO 口都是 5V 兼容的,这些 IO 口在与 5V 电平的外设连接的时候很有优势,具体哪些 IO 口是 5V 兼容的,可以从该芯片的数据手册管脚描述章节查到(I/O Level 标 FT 的就是 5V 电平兼容的). S

单片机IO口标准双向,推挽,高阻,开漏模式 ,LED感应亮灭实验【原创!】

单片机IO口标准双向,推挽,高阻,开漏模式 ,LED感应亮灭实验  十一长假在家快烂了,没事儿做,DIY技术搞起来!  [关于12C增强型单片机I/O口的工作类型实验研究] 文中动画视频效果下载: STC单片机头文件[51CTO-->单片机-->LED感应亮灭实验] 下载链接 链接:http://pan.baidu.com/s/1pJKK4w7   密码:a0re  1.用强推模式,点亮一个LED  /* 工程创建MCU选取,Atmel 89C55 单片机:STC12C4052AD 晶振:无要

巧妙的IO口按键扫描方法

在做项目的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键.一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一: 对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方

【STM】IO口配置库函数、寄存器、位操作方式

库函数函数: 一个初始化函数:初始化一个或者多个IO口(同一组)的工作模式.输出类型.速度以及上下拉方式 1 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 2 typedef struct 3 { 4 uint32_t GPIO_Pin//指定要初始化的端口 5 GPIOMode_TypeDef GPIO_Mode;//端口模式 6 GPIOSpeed_TypeDef GPIO_Speed;//速度

FPGA静态时序分析——IO口时序(Input Delay /output Delay)(转载)

转载地址:http://www.cnblogs.com/linjie-swust/archive/2012/03/01/FPGA.html 1.1  概述 在高速系统中FPGA时序约束不止包括内部时钟约束,还应包括完整的IO时序约束和时序例外约束才能实现PCB板级的时序收敛.因此,FPGA时序约束中IO口时序约束也是一个重点.只有约束正确才能在高速情况下保证FPGA和外部器件通信正确. 1.2  FPGA整体概念 由于IO口时序约束分析是针对于电路板整个系统进行时序分析,所以FPGA需要作为一个