在前一教程,我们讨论了I2C协议的基础。在大多数嵌入式设备中,控制台消息要么使用UART,要么使用I2C。在本教程中,我们将讨论在树莓派中使用I2C协议的串行通信。
树莓派中的I2C
对于I2C协议的串行通信,树莓派的Broadcom处理器有Broadcom串行控制器(BSC)。这个标准模式的BSC主控制器是NXP半导体公司的I2C兼容的,支持400kbps的数据传输速率。BSC控制器支持7位和10位寻址。GPIO2 (Board Pin No. 3)和GPIO3 (Board Pin No. 5)是I2C1的串行时钟(SCL)线。这些I2C引脚内部通过1.8 kohms电阻拉至3.3V。这就是为什么这些引脚不能用于不需要上拉的通用I/O。
树莓派中还有一个I2C外设BSC2,被鉴定为I2C0。BSC2主机专用于HDMI接口,用户无法访问。这个I2C接口存在于板引脚27 (ID_SD)和28 (ID_SC)。I2C0保留用于读取树莓派的附加板,即HAT板的EEPROM。I2C0在启动时只能与地址0x50的HAT EEPROM通信。
只有摄像头接口和HDMI接口都不使用时才能访问I2C0。要使用I2C0,请在boot/config.txt中添加以下行。
dtparam = i2c_vc =
I2C0引脚不是内部上拉的,所以如果它们是通过修改树莓派配置文件使用的,外部上拉(到3.3V)必须在SDA和SCL线上使用。当使用I2C0时,引脚避免使用HAT EEPROM地址。
即使是I2C1在树莓派上也是默认禁用的。它需要从树莓派配置启用。树莓派的BSC控制器支持多主、多从I2C。因此,I2C1足以连接多个I2C从机(最多112个从机)和任意数量的主设备。
从树莓Pi GUI启用I2C1
在树莓派,导航到Pi开始菜单->首选项->树莓派配置。
在弹出窗口中,单击“Interfaces”选项卡,选择I2C的“Enable”单选按钮。其他接口也可以根据需要启用或禁用。
若要生效,请重启树莓派。重启后,GPIO3和GPIO5可以用来连接树莓Pi作为I2C主用I2C总线或任何I2C从用。
从终端启用I2C1
对于树莓派的ARM内核和Linux内核的I2C支持也可以在终端上启用(树莓派上的Bash Shell)。打开Terminal,执行如下命令:
sudo raspi-config
在树莓派软件配置工具中,导航到“接口选项”。
在旧的树莓派模型中,导航到“高级选项”,然后是“I2C”。
在弹出的窗口中,启用Arm I2C接口并选择“Yes”来加载I2C内核模块。
重启后,GPIO3和GPIO5可以用来连接树莓Pi作为I2C主用I2C总线或任何I2C从用。
测试I2C港口
在启用I2C用户端口并重启树莓派后,我们可以测试该端口是否作为Linux设备可用。在“Terminal”窗口中,执行如下命令:
ls /dev/
或
ls /dev/*i2c*
I2C1必须作为一个可用的Linux设备出现,如下图所示。
请注意,在老版本的树莓派中,I2C用户端口被标识为I2C0而不是I2C1。在所有256M Raspberry Pi型号中,I2C用户端口为0,其余都为1。
在树莓派上扫描I2C从机
使能I2C用户端口后,通过I2C -tools可以检测到连接的I2C从站。首先,在树莓派终端中运行以下命令安装i2c-tools:
Sudo apt-get install -y i2c-tools
现在执行以下命令扫描已连接的I2C从机:
Sudo i2cdetect -y
如前所述,在老版本的树莓派中,I2C用户端口为0,在老版本中,将端口号改为0,如下所示:
Sudo i2cdetect -y 0
I2C -detect是一种工具,用于扫描I2C用户端口,并返回连接的从设备的I2C地址。该工具返回一个连接的I2C从设备的地址表,如下图所示:
使用SMBus库访问I2C设备
在Raspberry Pi上,I2C总线可以通过Python脚本使用SMBus库访问。SMBus是I2C接口的一个子集。SMBus的Python库可以用于与基于I2C的设备通信。SMBus库可以通过以下命令安装到Raspberry Pi上:
安装python-smbus
在Python脚本中,SMBus库可以使用以下语句导入:
进口smbus
导入SMBus库后,必须使用SMBus()方法创建SMBus类的对象。SMBus()方法以I2C端口号为参数,必须在赋值语句中使用,以创建SMBus对象。它的语法如下:
< Object_name > = smbus.SMBus (I2C_Port_Number)
创建SMBus对象的示例如下:
i2c总线= smbus.SMBus (1)
请注意,在老版本的树莓派中,I2C用户端口为0,而在所有超过256M RPi版本的树莓派中,I2C用户端口为1。要使用最新的SMBus2库,可以使用pip安装,运行以下命令:
pip安装smbus2
在Python脚本中,SMBus2库可以使用以下语句导入:
from smbus2 import SMBus, i2c_msg
SMBus类的对象可以使用smbus2.SMBus()方法创建,如下:
i2c总线= smbus2.SMBus (1)
smBus2库有两个类——SMBus和i2c_msg。SMBus类支持以下方法:
smbus.SMBus () / smbus2.SMBus ()—用Python脚本创建SMBus对象。
打开(公共汽车)-打开给定的i2c总线。
close ()—关闭I2C连接。
从I2C从站读取的串行数据可以是字节、字或字节块。在一些I2C从设备中,主设备需要从特定的寄存器访问串行数据。SMBus2库中从从设备读取串行I2C数据的方法如下:
read_byte (i2c_addr力=没有)—从设备中读取单个字节。
read_byte_data (i2c_addr,登记,力=没有)-从指定的寄存器中读取单个字节。
read_block_data (i2c_addr,登记,力=没有)—从给定的寄存器中读取不超过32字节的块。
read_i2c_block_data (i2c_addr,注册、长度、力= None)-从给定的寄存器中读取字节数据块。
read_word_data (i2c_addr,登记,力=没有)从给定的寄存器中读取一个单词(2个字节)。
类似地,数据可以以字节、字或字节块的形式写入I2C从站。在某些I2C从设备中,数据必须写入特定的寄存器。SMBus2库中从从设备写入串行I2C数据的方法如下:
write_byte (i2c_addr,价值,力=没有)—写单个字节到设备。
write_byte_data (i2c_addr,注册,价值,力= None)-将一个字节写入给定的寄存器。
write_block_data (i2c_addr、寄存器、数据、力= None)-将一个字节数据块写入给定的寄存器。
write_i2c_block_data (i2c_addr、寄存器、数据、力= None)-将一个字节数据块写入给定的寄存器。
write_word_data (i2c_addr,注册,价值,力= None)-将一个字节写入给定的寄存器。
write_quick (i2c_addr力=没有)—快速事务。如果不成功则抛出IOError。
管理SMBus进程和合并I2C总线读写操作的方法如下:
process_call (i2c_addr,注册,价值,力= None)—执行SMBus Process Call,发送一个16位的值并接收一个16位的响应
block_process_call (i2c_addr、寄存器、数据、力= None)-发送一个可变大小的数据块并接收另一个可变大小的响应。
i2c_rdwr (* i2c_msgs)—将一系列的i2c读写操作合并到一个事务中。
在下一课中,我们将讨论通过I2C端口将ADXL345加速度计传感器与树莓Pi接口。
了下:单片机项目,188app官网
与本文相关的问题?询问并讨论EDAboard.com和Electro-Tech-Online.com论坛。
告诉我们你的想法!
你必须登录发表评论。