片,单个PCF8574可扩展8个IO,一个I2C总线最多可挂载8个PCF8574,所以树莓派最多可扩展64个IO。
树莓派扩展功能的开发方法有很多,例如wiringPi和bcm2835 C library都提供I2C
API函数。如果使用python+SMBUS库开发的话,你会发现Linux应用开发原来如此简单。(注意SMBUS和I2C存在区别与联系,在本文中
两者是相等的概念)
2.相关博文
【树莓派学习笔记——I2C设备载入和速率设置】
【树莓派学习笔记——I2C Tools 学习笔记】
【树莓派学习笔记——I2C PCF8574 BCM2835 Library】使用BCM2835
Library实现本文相同的内容
【树莓派学习笔记——I2C PCF8574 SysFs方式】使用SysFS方式实现本文相同的内容
3.PCF8574使用简述
PCF8574的采用7位I2C地址,7位I2C地址中的低3位从高到低分别为A2
A1和A0,该3位为地址选择位,若地址选择全部接GND,那么PCF8574的I2C从机地址为0x20。图1为PCF8574的基本信息,左侧为芯片
内部结构示意图,其中A2
A1和A0决定从机地址而从机地址直接影响I2C总线控制器,右侧上部为PCF8574引脚图,右侧下部为I2C从机地址组成示意图,从机地址的高4位为
0100,该4位数字固定不变。
图1 PCF8574基本信息
请
注意I2C 7位从机地址和I2C
读控制字或i2C写控制器存在联系与区别,对于7位从机地址为0x20的PCF8574而言,读控制字为0x41,写控制字为0x40。若使用GPIO通
过软件法模拟I2C时序时,通常把写控制字0x40定义为I2C从机地址,软件模拟时的I2C地址(0x40)和I2C
7位从机地址(0x41)存在区别。
PCF8574内部含有8个准双向IO,对PCF8574进行一次写 *** 作可修改IO口的输出状态,对PCF8574进行一次读 *** 作可获取IO口的输入状态。I2C总线的 *** 作较为复杂,各芯片之间的差异较大,例如BH1750、AT24C04和ADXL345虽然均使用I2C接口,但是细节之处存在差异较大。
图2 PCF8574读写时序
4.代码实现——python
【安装python smbus】
sudo apt-get install python-smbus
新建一个名为pcf8574.py的文件
[python] view plain copy
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smbus
import time
# 打开 /dev/i2c-1
bus = smbus.SMBus(1)
while True:
for i in range(0,4):
# 向PCF8574写入一个字节
bus.write_byte( 0x20 , (1<<i) )
# 延时100ms
time.sleep(0.1)
【代码详解】
【1】#!/usr/bin/env python
定义python解析脚本的绝对路径。
【2】# -*- coding: utf-8 -*-
py文件为utf-8格式,否则无法写入中文注释。
【3】import smbus
导入smbus模块。
【4】bus = smbus.SMBus(1)
在树莓派版本2中,I2C设备位于I2C-1,所以此处的编号为1
【5】bus.write_byte( 0x20 , (1<<i) )
向PCF8574写入一个字节,注意PCF8574和其他I2C芯片不同,该芯片没有寄存器,发送写控制字之后可直接设置IO口输出状态。
【执行程序】
进入pcf8574.py所在目录,输入以下指令
sudo python pcf8574.py
【运行结果】
图3 运行结果
5.参考资料
【python SMBUS GitHub】python封装SMBUS *** 作函数具体代码,值得阅读。
最近在做一个产品,这个产品上面我们使用了OLED屏作为显示设备,OLED 屏是基于I2C总线与树莓派连接的,在运行过程中感觉屏幕的速度很慢,整个显示效果非常的不流畅。后来发现原来树莓派可以通过提升I2C总线的传输速度来提高OLED屏幕的显示速度。
首先,通过 raspi-config 管理工具启用树莓派上的I2C接口。
具体选项看下图:
完成后记得重启。
然后,进入命令行编辑 config.txt 文件,这是最重要的一环:
找到包含 “dtparam=i2c_arm=on” 的行,并在后面添加: i2c_arm_baudrate=400000” ,这行的意思是将i2c的传输速率设定为40KBit/s
保存并退出,重启后就大功告成了。
另外,据 BCM2835 ARM 外设说明 (第28页) 中提到 树莓派具有“快速模式(fast-mode)”的驱动, baudrate 可以在100000~400000之间取值。100000是默认值,所以我将其设置到400000就可以使树莓派启用I2C的快速模式。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)