由于树莓派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