1. 参考资料

  • 资料汇总页面

https://shumeipai.nxez.com/raspberry-pi-datasheets

  • 《bcm2711-peripherals.pdf》,下载地址

https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf

  • 《cm4io-datasheet.pdf》,下载地址

https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf

  • 《cm4-product-brief.pdf》,下载地址

https://datasheets.raspberrypi.com/cm4/cm4-product-brief.pdf

  • 《cm4-datasheet.pdf》,下载地址

https://datasheets.raspberrypi.com/cm4/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/5

    deoverlay=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 确认所有串口均已启用

  • 查看dmesgtty相关的日志,可以看到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, GPIO14Rx, GPIO15Tx

  • 波特率115200,连接的电脑后就可以通过该串口进入终端

2.6 其它串口测试

  • UART3为例,短接UART3TxRx引脚,即短接GPIO4GPIO5

  • 如下图中的黑色杜邦线所示

  • 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/6SCL0/1/2/3/4/5
  • 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
  • 显示效果

写在最后

禁止转载到CSDN !!! 其它随意,转载请注明出处

树莓派CM4(二): UART/IIC/SPI调试的更多相关文章

  1. 一从二主IIC连接调试

    最近有个项目需要实现快速开机出摄像头预览(2s内),但是我的板子linux上的qt应用起来都要10s左右了,于是在硬件上增加了一个屏驱芯片TW8836,这是一个mcu,可以直接获取摄像头数据送到lcd ...

  2. 采用FPGA实现UART转SPI

    应用笔记 V1.1 2015/2/10 采用FPGA实现UART转SPI   概述   本文提供了实现UART转SPI的Verilog代码的功能描述.这份笔记将介绍UART和SPI的基本知识,代码设计 ...

  3. [原创]树莓派CM4配置GPIO复用为i2c

    1.简介 项目中需要控制各种外设的电源,正常应该是通过GPIO进行控制,但是树莓派CM4的GPIO管脚有限,因此需要使用i2c扩展IO 查阅CM4-datesheet发现GPIO22和GPIO23可以 ...

  4. PX01关于手机屏IIC触摸调试学习笔记

    相关文件下载: 上位机工具:http://www.xk-image.com/download/blog/0002_TP调试/LcdTools20210605.rar 调试案例:http://www.x ...

  5. Uart、SPI和I2C的区别

    串口通信:UART.SPI.I2C区别[引用]   1.UART就是两线,一根发送一根接收,可以全双工通信,线数也比较少.数据是异步传输的,对双方的时序要求比较严格,通信速度也不是很快.在多机通信上面 ...

  6. 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置

    调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  7. 【转】android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...

  8. MIP开发教程(二) 使用MIP-CLI工具调试MIP网页

    初始化 MIP 配置 新建一个 MIP 网页 编写 MIP 网页代码 校验 MIP 网页 调试 MIP 网页 1. 初始化 MIP 配置 首先在html目录下进行初始化 MIP 配置: $ mip i ...

  9. 关于树莓派Pi2通过UART连接攀藤G5传感器的python

    1.准备工作:树莓派Pi2板子,攀藤G5传感器 关于树莓派40pin口网上很多,我们只了解与攀藤G5连接的问题 (1)攀藤G5pin1(VCC5v)要注意是5V,有很多板子接的是3V,而树莓派的pin ...

  10. 通信方案软件设计(环形动态申请内存,支持USART+IIC+SPI+CAN协议

    1 <STM32进阶之串口环形缓冲区实现>中讲得比较清楚(链接) 2 amobbs中讲的方法有点复杂,以下是链接和参考源码: 通信方案软件设计(环形动态申请内存,支持USART+IIC+S ...

随机推荐

  1. IT运维全面数字化|芯片设计行业领跑打造运维流程闭环

    在当今数字化转型的浪潮中,科技行业正经历着前所未有的变革.随着5G.人工智能.物联网等新兴技术的快速发展,企业对于高效.智能的运营模式的需求日益迫切. 芯片设计公司作为科技产业链中的关键一环,不仅要在 ...

  2. Python中multiprocessing.Pool进程池实现守护进程的方法

    前言 在multiprocessing.Process中可以使用p.daemon=True将子进程p设置为守护进程. 那么在multiprocessing.Pool进程池中怎么实现这个功能呢? 什么是 ...

  3. python重拾基础第一天

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  4. LLM并行训练4-megascale论文学习

    算法优化 并行注意力机制 \[串行版本: y = x + MLP(LayerNorm(x + Attention(LayerNorm(x)))) \] \[并行版本: y = x + MLP(Laye ...

  5. Excel 更改数据同步更新到Mysql数据库

    刚上班,领导给我提出一个需求,想要每天更新Mysql数据库中的原有商品订单状态,添加新的商品订单状态.因为公司目前的数据库只能添加数据,不能更改数据,想要更改原有的数据,只能将原有的数据清空,再导入新 ...

  6. 小组合作实现的基于 jsp,servlet,mysql 编写的学校管理系统

    基本完成的页面--源代码在<文件>中可下载 文件地址:https://i.cnblogs.com/Files.aspx 学生管理模块各功能已实现 百度网盘下载地址: 链接:https:// ...

  7. Node.js - fs.path模块

    首先我有话说,是谁说的学完ajax就可以去vue了,太天真了我,学会js钻出来个ajax,学完ajax钻出来个node.js这一步步的,当然node不会学到太深入把表面的认识一下就可以了,这之后可能更 ...

  8. 【Python】python笔记:时间模块/时间函数

    1.Python时间模块 import time import datetime # 一: time模块 ############## # 1.时间戳 print (time.time()) # 16 ...

  9. The Beauty of Physics

    绪言/1 学物理的人用不着对物理方程的意义操心,只要关心物理方程的美就够了. --狄拉克 此曲只应天上有--开普勒的和谐宇宙/11 天体的运动只不过是某种永恒的复调音乐而已,要用才智而不是耳朵来倾听. ...

  10. 在Winform程序中增加隐藏的按键处理,用于处理一些特殊的界面显示或者系统初始化操作

    以前,我看到一个朋友在对一个系统做初始化的时候,通过一组魔幻般的按键,调出来一个隐藏的系统设置界面,这个界面在常规的菜单或者工具栏是看不到的,因为它是一个后台设置的关键界面,不公开,同时避免常规用户的 ...