树莓派CM4(二): UART/IIC/SPI调试
1. 参考资料
- 资料汇总页面
- 《bcm2711-peripherals.pdf》,下载地址
https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf
- 《cm4io-datasheet.pdf》,下载地址
- 《cm4-product-brief.pdf》,下载地址
https://datasheets.raspberrypi.com/cm4/cm4-product-brief.pdf
- 《cm4-datasheet.pdf》,下载地址
2. 串口配置
2.1 概述
- 树莓派
CM4
共有六路UART,均由GPIO复用而来 - 一个
mini UART(UART1)
用作调试串口 + 五个PL011
串口(UART0/2/3/4/5
) - 如下图中白框所示,详情见
《bcm2711-peripherals.pdf》
的5.3. Alternative Function Assignments
章节
2.2 调试串口mini UART
mini UART
- 为控制台预留,见《bcm2711-peripherals.pdf》
的2.2
章节- 需要修改
/boot/config.txt
或/boot/firmware/config.txt
,在其末尾添加如下内容以启用调试串口enable_uart=1
2.3 其它五路串口
-
修改
/boot/config.txt
,添加如下内容,表示启用UART0/2/3/4/5deoverlay=uart0,txd0_pin=14,rxd0_pin=15 dtoverlay=uart2,txd2_pin=0,rxd2_pin=1 dtoverlay=uart3,txd3_pin=4,rxd3_pin=5 dtoverlay=uart4,txd4_pin=8,rxd4_pin=9 dtoverlay=uart5,txd5_pin_12,rxd5_pin=13
-
如下图
-
修改完成后重启生效
2.4 确认所有串口均已启用
-
查看
dmesg
中tty
相关的日志,可以看到ttyS0
+ttyAMA0 ~ ttyAMA4
六路串口均已启用 -
因为这六路串口都是通过GPIO复用而来的,进一步查看GPIO复用关系,如下图
-
查看
/dev
目录下的ttyAMA
节点 -
GPIO
对应关系
-
结合
dmesg
中的日志和上面的GPIO复用关系,可以知道/dev/ttyAMA*
和uart
的对应关系ttyAMA0 对应 UART0 ttyAMA1 对应 UART2,Tx = GPIO0, Rx = GPIO1 ttyAMA2 对应 UART3,Tx = GPIO4, Rx = GPIO5 ttyAMA3 对应 UART4,Tx = GPIO8, Rx = GPIO9 ttyAMA4 对应 UART5,Tx = GPIO12, Rx = GPIO13
2.5 调试串口测试
-
调试串口
UART1
,GPIO14
接Rx
,GPIO15
接Tx
-
波特率
115200
,连接的电脑后就可以通过该串口进入终端
2.6 其它串口测试
-
以
UART3
为例,短接UART3
的Tx
和Rx
引脚,即短接GPIO4
和GPIO5
-
如下图中的黑色杜邦线所示
-
UART3
对应/dev/ttyAMA2
,使用minicom
打开/dev/ttyAMA2
节点
-
打开
minicom
的回显功能,CTRL-A Z
打开配置菜单,如下,输入E
打开回显
-
因为我们将UART3的Tx和Rx短接在一起,所以无论输入什么字符,都会看到显示了两次,一次是发送的数据,一次是接收的数据
-
其它
UART
的测试方法同理
3. IIC配置
3.1 参考资料
-
《bcm2711-peripherals.pdf》的
Chapter 3.BSC
章节 -
《cm4io-datasheet.pdf》的
2.9. Fan connector
章节 -
《cm4io-datasheet.pdf》的
2.13. Real time clock (RTC)
章节 -
《cm4-datasheet.pdf》的
2.9. I2C (SDA0 SCL0)
章节 -
《cm4-datasheet.pdf》的
2.5.1. Alternative function assignments
章节
3.2 硬件资源
- 树莓派CM4最多可启用5路
i2c
- 其中内部的
i2c0
使用两个GPIO管脚:SDA0
连接在GPIO44
上,SCL0
连接在GPIO45上
; 需要注意的使这两个管脚默认被分配给
CSI1/DIS1
使用,只有当CSI1/DSI1
未启用时,这两个管脚才能用作通用的i2c接口 CSI/DSI
默认是关闭的,使用摄像头和DSI的时候会占用I2C-10/I2C-11/I2C-0
三个I2C设备- 关于i2c这一部分有一个疑问:为什么没有
SDA2/SCL2
呢?只有SDA0/1/3/4/5/6
和SCL0/1/3/3/4/5/6
? - i2c和GPIO的复用关系如下图中绿色框标出来的部分
3.3 启用i2c0
-
最简单的方法是通过
raspi-config
来启用i2c,这种方法已经有不少相关文章了,在此不在赘述,接下来要说的是另一种方式 -
修改
/boot/config.txt
或/boot/firmware/config.txt
,向其中添加如下内容dtparam=i2c_vc=on
-
向
/etc/modules
中添加i2c-dev
$ sudo echo "i2c-dev" >> /etc/modules $ sudo echo " " >> /etc/modules # 追加一个空行
-
重启生效
3.4 检查i2c0
是否启用成功
- 查看GPIO复用关系表可知,
i2c0
的时钟线和数据线由GPIO44/45
复用而来 - 查看GPIO复用关系,如下图,可以看到
GPIO44/45
被复用为function alt1
,正式i2c0的两个管脚sudo cat /sys/kernel/debug/pinctrl/fe200000.gpio-pinctrl-bcm2711/pinmux-pins
3.5 使用i2c-tools
进行调试
-
安装i2c调试工具
i2c-tools
sudo apt-get install -y i2c-tools
-
查看所有的
i2c
总线sudo i2cdetect -l
-
注意:硬件上
i2c0 SDA0/SCL0
对应的是这里的i2c-10
, 参考《cm4io-datasheet.pdf》的2.9. Fan connector
章节 -
我在
i2c0
上接了一个数字温度传感器,地址0x49
-
查看
i2c-10
上有哪些设备,只需要关注0x49
即可$ sudo i2cdetect -y 10 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- 49 -- -- -- -- -- -- 50: -- 51 -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: 70 71 72 73 -- -- -- --
-
尝试读取一下温度,0x29换算一下正好是41℃
$ sudo i2cget -f -y 10 0x49 0x29
4. SPI配置
4.1 参考资料
- 《bcm2711-peripherals.pdf》的
2.3. Universal SPI Master (2x)
章节
4.2 硬件资源
- 树莓派CM4最多可启用五路SPI,
SPI0/1/3/4/5/6
,问题:和i2c一样,为什么没有SPI2 ? - 另外,虽然从GPIO复用表中能够找到六路SPI的管脚定义,但是有些SPI的管脚是冲突的,最多只能启用五路SPI
4.3 使能SPI
- 在
SPI0
上连接一个2 inch
的显示屏,分辨率240 * 320
,官方资料如下
https://www.waveshare.net/wiki/2inch_LCD_Module#.E4.B8.8A.E5.B1.82.E5.BA.94.E7.94.A8
-
原理图如下
-
使能SPI,使用
raspi-config
可以很方便地开启SPI;这里选择使用另一种方式:修改config.txt
的方式来使用SPI -
修改
/boot/firmware/config.txt
,取消#dtparam=spi=on
这一行的注释,如果没有相关内容,手动添加之
-
重启生效,重启后就能够看到SPI对应的设备节点
/dev/spidev0.0
和/dev/spidev0.1
4.4 SPI屏幕输出
- 安装
libraspberrypi-dev
$ sudo apt-get install libraspberrypi-dev
FBCP
移植-
FBCP (Framebuffer Copy)
用于将帧缓冲中的内容复制到一个显示设备上 -
直接在树莓派中进行编译,避免交叉编译
-
获取源码,安装相关依赖
$ wget https://www.waveshare.net/w/upload/1/18/Waveshare_fbcp.zip $ unzip Waveshare_fbcp.zip $ cd Waveshare_fbcp/ $ sudo chmod +x ./shell/* $ sudo apt-get install -y cmake unzip
-
修改编译脚本
./shell/waveshare-2inch
,修改如下#!/bin/bash # 清空编译输出目录 sudo rm -rf $(dirname "$0")/../build mkdir $(dirname "$0")/../build # 进入编译输出目录 cd $(dirname "$0")/../build # cmake构建Makefile sudo cmake -DSPI_BUS_CLOCK_DIVISOR=20 -DWAVESHARE_2INCH_LCD=ON -DBACKLIGHT_CONTROL=ON -DSTATISTICS=0 .. # 开始编译 sudo make -j$(nproc)
-
开始编译
Waveshare_fbcp$ sudo ./shell/waveshare-2inch
-
编译得到的
fbcp
就是所需的驱动程序
-
安装fbcp到/usr/local/bin/目录下,注意检查是否有可执行权限
Waveshare_fbcp$ sudo cp ./build/fbcp /usr/local/bin/
-
在
/etc/rc.local
中添加如下内容,实现fbcp
开机自启sudo fbcp &
-
修改
/boot/firmware/config.txt
,注释掉DRM VC4 V3D
相关内容,添加屏幕信息# 注释以下内容 # Enable DRM VC4 V3D driver # dtoverlay=vc4-kms-v3d # max_framebuffers=2 hdmi_force_hotplug=1 max_usb_current=1 hdmi_group=2 hdmi_mode=1 hdmi_mode=87 hdmi_cvt 320 240 60 6 0 0 0 hdmi_drive=2 display_rotate=90 # 我是将屏幕横过来使用的,故需要旋转90°
-
重启,正常情况下就能够看到屏幕显示了,并且会产生一个新的设备节点
/dev/fb0
-
4.5 使用FFmpeg
在屏幕上播放视频
-
安装
ffmpeg
$ sudo apt-get install -y ffmpeg
-
由于屏幕的分辨率是
320 * 240
,需要将视频转成相应的分辨率后才能完美播放,可以参考下面的命令$ ffmpeg -i input.mp4 -vf "scale=320:-1" output.mp4
-
播放视频,循环播放;注意:必须要指定使用
/dev/fb0
播放$ sudo ffmpeg -re -stream_loop -1 -i /home/jun/output.mp4 -vf "setpts=1.0*PTS" -pix_fmt bgra -f fbdev /dev/fb0
-
显示效果