本教程是关于“Rpi SenseHAT 与 AMD-Xilinx Kria KR260 和 Petalinux 的接口”。
本教程中使用的工具有:
Rpi-SenseHAT 的 VIVADO/Petalinux 项目源码、BSP、Kria 固件可在 Github 获取:https://github.com/LogicTronix/KR260-SenseHAT-Petalinux [ Git Branch: SenseHAT-Sensors ]
Raspberry Pi Sense HAT是一个附加板,可提供一系列传感功能。机载传感器使我们能够监控压力、湿度、温度、颜色、方向和运动。8x8 RGB LED 矩阵让我们能够可视化来自传感器的数据,五键操纵杆可以充当输入设备。
板上的所有传感器都连接到单个 I2C 总线。所有的传感器都充当从机,并使用 I2C 协议与主机进行通信。
Sense Hat 上使用的 IC:
以下是 Vivado 设计中使用的 IP 内核,用于创建在 Kria KR260 上运行的“Sense HAT-I2C 接口”。
Zynq® Ultrascale+™ MPSoC 充当 PS 和 PL 之间的逻辑连接,同时协助使用 Vivado® IP 集成器将定制和嵌入式 IP 与处理系统集成。
AXI 中断控制器 (AXI INTC) 内核将来自外围设备的多个中断输入集中到系统处理器的单个中断输出。
Clocking Wizard IP 简化了为根据用户时钟要求定制的时钟威廉希尔官方网站 创建 HDL 源代码包装器的过程。该向导指导用户为您的时钟原语设置适当的属性,并允许覆盖任何向导计算的参数。
AXI IIC 总线接口连接到 AMBA® AXI 规范,并为大量流行设备提供低速、双线、串行总线接口。本产品规范定义了 AXI IIC 总线接口模块的架构、硬件(信号)接口、软件(寄存器)接口和参数化选项。
处理系统复位是一个软 IP,它提供了一种机制来处理给定系统的复位条件。内核在输入端处理多种复位条件,并在输出端生成适当的复位。该内核根据外部或内部复位条件生成复位。
AXI 互连 IP 将一个或多个 AXI 内存映射主设备连接到一个或多个内存映射从设备。AXI 互连内核允许 AXI 主设备和从设备的任意组合连接到它,这些设备在数据宽度、时钟域和 AXI 子协议(AXI4、AXI3 或 AXI4-Lite)方面可能各不相同。
如上图所示,Sense HAT 位于 KR260 上的 RPi 接头上方。此对齐显示了 40 个引脚的描述。传感器通过使用引脚 3 和 5 的 I2C 进行通信。
KR260 上只有 2 个引脚(AE14 和 AE15)需要约束 I2C 才能工作。AE15 用于 SDA,AE14 用于 SCL。
set_property PACKAGE_PIN AE15 [get_ports {iic_sda_io}]
set_property IOSTANDARD LVCMOS33 [get_ports {iic_sda_io}]
set_property PULLUP true [get_ports {iic_sda_io}]
set_property PACKAGE_PIN AE14 [get_ports {iic_scl_io}]
set_property IOSTANDARD LVCMOS33 [get_ports {iic_scl_io}]
set_property PULLUP true [get_ports {iic_scl_io}]
但是,下图可用作映射和约束所有其他引脚的参考。
为了集成 SenseHAT 传感器,我们必须拥有这些传感器的 Petalinux 驱动程序或 linux 驱动程序。对于 SenseHAT,大多数传感器的 C/C++ 驱动程序都可以从供应商那里获得。一些驱动程序也是由独立开发人员编写的。
湿度/温度
加速度计/陀螺仪和磁力计
压力/温度
LED驱动器
创建 petalinux 项目需要支持的 BSP,可从以下链接下载。也可以在没有 BSP 的情况下创建项目,但不太方便。
下面列出了创建 petalinux 项目的步骤。
● 创建一个文件夹并复制从Vivado 导出的平台(XSA)。
● 同时复制 Vivado 生成的 BIN 文件,位于 /.runs/impl_1/.bin
● 在目录中打开终端并获取petalinux 脚本。
● 运行以下命令创建名为 的petalinux 项目。
petalinux-create --type project -s to-bsp> --name name>
● 运行以下命令配置项目。
petalinux-config --get-hw-description
● 在项目配置窗口中,
○ 在 FPGA 管理器下启用 FPGA 管理器。
petalinux-config -c kernel
petalinux-config -c rootfs
petalinux-package --wic --images-dir images/linux/ --bootfiles "ramdisk.cpio.gz.u-boot, boot.scr, Image, system.dtb, system-zynqmp-sck-kr-g-revB.dtb" --disk-name "sda"
生成设备树覆盖
PATH="${XSCT_TOOLCHAIN}/bin:${PATH}"
hsi::open_hw_design ./.xsa
createdts -hw ./name>.xsa -zocl -platform-name platform-name> -git-branch -overlay -compile -out ./name-is-better>
注意:以下命令可以在没有 Petalinux 脚本源的常规终端中运行。
dtc -@ -O dtb -o ./kr260.dtbo ./kr260_dt/kr260_dt/kr260/psu_cortexa53_0/device_tree_domain/bsp/pl.dtsi
编译故障码
git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git
cd dtc
make
make install
重试编译设备树
将文件传输到设备
echo '{ "shell_type" : "XRT_FLAT", "num_slots": "1" }' > shell.json
mkdir ~/<any-directory-name>
scp ./kr260.bit.bin ./kr260.dtbo ./shell.json petalinux@:~/
sudo mv ./ /lib/firmware/xilinx/
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp kr260
i2cdetect -l
I2cdetect -y -r <i2c-bus-number>
要使用 python 与连接到总线的传感器进行通信,需要安装 python 包。
要安装所需的包,需要 pip。由于 petalinux 没有启用 pip 的选项,因此应手动安装。
值得庆幸的是,安装 pip 非常容易。按照以下步骤操作。
wget https://bootstrap.pypa.io/get-pip.py
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
要安装 SMBus,请运行pip install smbus。SMBus 通过 i2c-dev 为 Linux SMBus 访问提供 python 绑定。
为了与传感器通信,我们需要一个 SMBus 类的对象,它为我们提供了使通信更容易的各种功能。我们通过传递传感器所连接的 I2C 总线编号来创建 SMBus 类的新实例。
bus = smbus.SMBus(<i2c-bus-number>)
使用总线对象,我们可以访问以下功能,帮助我们从/向传感器寄存器读取/写入数据。
为了从传感器获取数据,我们将特定字节数据写入控制寄存器,以启用/禁用设备中的某些功能。最重要的一步是将传感器置于活动模式,这将开始感应并将结果存储在其内部寄存器中。然后我们可以读取这些寄存器并使用也存储在其他寄存器中的校准数据进行计算。
校准数据存储在内部非易失性存储器中,并在开机时写入校准寄存器。
有关寄存器及其描述的详细信息,请查看传感器的数据表。
设备上的所有传感器都遵循类似的配置和校准方法。
# HTS221 Sensor Initialization
def HTS221_Init():
temp = bus.read_byte_data(HTS221_ADDRESS, HTS221_CTRL1)
temp |= HTS221_CTRL1_MASK
bus.write_byte_data(HTS221_ADDRESS, HTS221_CTRL1, temp)
# Reading Temperature from Sensor
def HTS221_T_ReadTemp():
buffer = bus.read_i2c_block_data(HTS221_ADDRESS, HTS221_T0_C_8 | 0x80, 2)
tmp = bus.read_byte_data(HTS221_ADDRESS, HTS221_T1_T0)
T0_degC_x8_u16 = ((tmp & 0x03) << 8) | buffer[0]
T1_degC_x8_u16 = ((tmp & 0x0C) << 6) | buffer[1]
T0_degC = twos_complement(bin_str((T0_degC_x8_u16 >> 3), 16), 16)
T1_degC = twos_complement(bin_str((T1_degC_x8_u16 >> 3), 16), 16)
buffer = bus.read_i2c_block_data(HTS221_ADDRESS, HTS221_T0_OUT | 0x80, 4)
T0_out = twos_complement(bin_str(((buffer[1] << 8) | buffer[0]), 16), 16)
T1_out = twos_complement(bin_str(((buffer[3] << 8) | buffer[2]), 16), 16)
buffer = bus.read_i2c_block_data(
HTS221_ADDRESS, HTS221_TEMP_OUT_L | 0x80, 2)
T_out = twos_complement(bin_str(((buffer[1] << 8) | buffer[0]), 16), 16)
temperature = (T_out - T0_out) * (T1_degC - T0_degC) / \
(T1_out - T0_out) + T0_degC
return temperature
HTS221 传感器的温度和湿度读数
LPS25H 传感器的温度和压力读数
LSM9DS1 传感器的加速度、磁力计和陀螺仪读数
本教程的VIVADO、Petalinux工程源码和Python源码查看:Github【Git分支:SenseHAT-Sensors】
您可以在您的 PC 上通过以下命令克隆 Git Branch:
git clone -b SenseHAT-Sensors https://github.com/logictronix/kr260-sensehat-petalinux
感谢 Frank Shrestha [frank_shrestha@logictronix.com] 创建了这个“深入”教程!
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !