ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

树莓派5双MIPI接口实战:同时驱动CSI摄像头与DSI屏幕的完整配置指南

2026/9/28 22:52:18 拓冰建站 浏览量
树莓派5双MIPI接口实战:同时驱动CSI摄像头与DSI屏幕的完整配置指南 树莓派5刚发布那会儿我第一时间入手了一块冲着它那两个四通道MIPI接口去的。之前用树莓派4做视觉小车CSI摄像头和DSI屏幕只能二选一想同时接就得走HDMI或者SPI小屏线缆一堆不说刷新率和延迟都让人难受。树莓派5把MIPI接口从原来的一个拆成了两个独立的四通道收发器理论上可以一个接CSI摄像头、一个接DSI屏幕同时跑起来。但理论归理论实际动手的时候从排线选型到设备树配置再到竖屏改横屏我前后折腾了差不多三个晚上才彻底跑通。这篇文章就把整个过程中的关键决策、踩过的坑和最终稳定的配置方案完整梳理出来给同样想在一台树莓派5上同时驱动摄像头和屏幕的朋友省点时间。1. 先搞清楚树莓派5这两个MIPI口到底能干什么1.1 两个接口的物理位置和通道分配树莓派5板子上有两个FPC排线座官方叫法是CAM/DISP 0和CAM/DISP 1。这两个口不是随便叫的它们各自对应SoC内部一个独立的四通道MIPI收发器。注意关键词是“收发器”意思是每个口既能发也能收但同一时间只能选一个方向。你要接摄像头就是收接屏幕就是发。具体到物理位置CAM/DISP 0在板子靠近USB-C供电口那一侧CAM/DISP 1在靠近以太网口那一侧。两个座子都是22pin、0.5mm间距的FPC座但针脚定义和树莓派4的15pin CSI口完全不同。这意味着你手里那些为树莓派4准备的摄像头排线大概率插不上需要买树莓派5专用的22pin转15pin排线或者直接买原生22pin的摄像头模块。我一开始就是吃了这个亏。手头有一个OV5647的老模块配的是15pin排线插到树莓派5上根本对不上。后来买了两根22pin转15pin的转接线才解决。这里提醒一句转接线买的时候要看清方向有些线是给DSI屏幕用的针脚顺序和CSI的不一样插错了轻则不亮重则烧接口。1.2 为什么不能两个口都接摄像头或者都接屏幕这个问题我在论坛上看到不少人问。答案藏在SoC的MIPI控制器架构里。树莓派5的BCM2712有两个独立的MIPI D-PHY每个PHY可以配置成CSI-2接收或者DSI发送但不能同时。而且每个PHY只有四通道如果你要接的摄像头是四通道的那这个PHY就被占满了另一个口虽然物理上存在但内部资源已经分配完了。实际配置的时候设备树里会把CAM/DISP 0默认分配给CSICAM/DISP 1默认分配给DSI。如果你想反过来比如摄像头接在1口、屏幕接在0口是可以在config.txt里改的但需要同时调整设备树覆盖层的加载顺序。我试过一次反过来接结果屏幕能亮但摄像头死活不出图后来查了半天发现是overlay的加载顺序冲突了。提示默认配置下CAM/DISP 0走CSICAM/DISP 1走DSI。除非有特殊需求建议按默认来省去很多麻烦。1.3 同时驱动时带宽和时钟的隐性约束这是最容易被忽略的一点。MIPI CSI-2和DSI虽然物理层类似但它们对时钟的要求不一样。CSI摄像头通常需要连续的时钟信号而DSI屏幕在LP低功耗和HS高速模式之间切换时时钟会间歇性停振。当两个接口同时工作时如果时钟配置不当会出现摄像头丢帧或者屏幕闪烁的问题。我实测下来OV5647在640x48030fps下四通道CSI的时钟大约在200MHz左右。而官方7寸DSI屏幕在800x48060fps下DSI时钟大约在300MHz。两个加起来对SoC的MIPI PLL压力不小。如果你用的是高分辨率摄像头或者高刷屏建议先在单设备下测通再同时接上逐步排查。2. 排线和接口选型别在这上面省钱2.1 22pin排线的线序陷阱树莓派5的22pin MIPI座子针脚定义里包含了I2C、GPIO和MIPI差分对。不同厂家出的22pin排线线序可能不一样。我买过三根不同来源的线有两根能用一根插上后摄像头I2C能识别但不出图。后来用万用表量了一下发现那根线的差分对正负接反了。判断线序是否正确最笨但最可靠的办法是看线的颜色和座子上的丝印。树莓派官方排线一般是同向的即两端金手指在同一面。如果你买的是反向线插上之前一定要确认哪一端接板子、哪一端接设备。接反了虽然不一定烧但肯定不工作。2.2 CSI摄像头模块的选择建议如果你还没有摄像头我建议直接买官方推荐的IMX219或者IMX477模块原生22pin接口省去转接的麻烦。OV5647虽然便宜但它是老款驱动支持虽然没问题但在树莓派5上的自动曝光和白平衡调校不如IMX219稳定。我手头有一个OV5647和一个IMX219对比下来IMX219在树莓派5上的出图速度更快libcamera识别也更顺畅。如果你要做YOLOv5之类的目标检测IMX219的1080p30fps足够用了。OV5647最高只有1080p30fps但实际跑下来帧率波动较大。2.3 DSI屏幕的兼容性清单DSI屏幕这块水比较深。官方7寸屏是最稳妥的选择驱动直接集成在系统里插上就能用。第三方屏幕就参差不齐了有些需要自己编译设备树覆盖层有些甚至要改内核驱动。我试过一块第三方5寸DSI屏卖家说支持树莓派5结果插上后屏幕亮但花屏。后来查资料发现是它的初始化序列和官方屏不一样需要在config.txt里加自定义的dsi参数。折腾了两天才搞定。所以如果你不想在驱动上花太多时间官方屏是首选。屏幕型号分辨率接口树莓派5兼容性备注官方7寸DSI800x48022pin DSI原生支持最省心官方7寸DSI800x48015pin DSI需转接线转接后可用第三方5寸DSI800x48022pin DSI需调参可能花屏第三方10寸DSI1280x80022pin DSI需编译overlay难度较高3. 系统配置从config.txt到设备树覆盖层3.1 基础系统准备和更新拿到树莓派5后第一件事是用官方Imager烧录最新的Raspberry Pi OS Bookworm。注意一定要用Bookworm或更新版本Bullseye对树莓派5的MIPI支持不完整。烧录完成后先别急着接摄像头和屏幕先通过SSH或者HDMI开机把系统更新到最新。sudo apt update sudo apt full-upgrade -y sudo reboot更新完成后检查一下内核版本。树莓派5的MIPI驱动在6.1.x之后才比较稳定。用uname -a看一下如果内核低于6.1建议手动升级。3.2 config.txt里必须加的那几行树莓派5的config.txt在/boot/firmware/目录下不是以前的/boot/。这一点很多人会搞错。打开后你需要根据实际接线来配置。如果摄像头接在CAM/DISP 0屏幕接在CAM/DISP 1config.txt里需要加dtoverlayimx219,cam0 dtoverlayvc4-kms-dsi-7inch第一行是加载IMX219的CSI覆盖层指定cam0。第二行是加载官方7寸DSI屏幕的覆盖层。注意顺序不能反先CSI后DSI。我试过反过来写结果屏幕能亮但摄像头不出图。如果你用的是OV5647把imx219换成ov5647即可。但OV5647在树莓派5上需要额外的media-controller参数具体后面会讲。3.3 设备树覆盖层的加载顺序为什么重要设备树覆盖层本质上是往内核设备树里打补丁。每个覆盖层会申请MIPI控制器资源。如果DSI覆盖层先加载它会把CAM/DISP 1的PHY配置成发送模式然后CSI覆盖层再去申请CAM/DISP 0的PHY这时候如果资源分配有冲突CSI就会失败。我遇到过一次config.txt里DSI写在前面结果dmesg里看到csi: probe failed with error -22。把顺序调换后问题消失。所以记住一个原则先加载接收端CSI再加载发送端DSI。3.4 验证设备是否被正确识别配置完成后重启用以下命令检查libcamera-hello --list-cameras如果摄像头被识别会列出可用的摄像头和分辨率。如果没识别到检查排线是否插紧、config.txt是否正确。对于DSI屏幕用dmesg | grep dsi看有没有dsi相关的报错。如果屏幕亮但没显示可能是KMS驱动没加载检查/boot/firmware/config.txt里有没有dtoverlayvc4-kms-v3d。4. 竖屏改横屏DSI显示方向的完整调整方案4.1 为什么竖屏改横屏不是简单旋转一下DSI屏幕默认是竖屏输出但很多人做监控或者车载显示需要横屏。在树莓派上旋转屏幕有两种方式一种是在config.txt里加display_rotate另一种是在桌面环境里用xrandr。但DSI屏幕比较特殊display_rotate对KMS驱动无效需要用dtoverlay里的rotate参数。官方7寸DSI屏的覆盖层支持rotate参数取值0、90、180、270。比如要旋转90度dtoverlayvc4-kms-dsi-7inch,rotate90但注意旋转后触摸坐标不会自动跟着转。如果你用的是官方触摸屏还需要在/etc/udev/rules.d/里加触摸校准规则。我一开始只转了显示结果触摸完全对不上点左边触发右边折腾了好久才发现是触摸矩阵没转。4.2 触摸坐标的同步旋转对于官方7寸触摸屏创建一个文件/etc/udev/rules.d/99-touchscreen.rules内容如下ACTIONadd, SUBSYSTEMinput, ATTRS{name}raspberrypi-ts, ENV{LIBINPUT_CALIBRATION_MATRIX}0 1 0 -1 0 1这组矩阵对应90度旋转。如果是180度矩阵是-1 0 1 0 -1 1。270度是0 -1 1 1 0 0。改完后重启触摸就正常了。4.3 横屏后的分辨率适配问题旋转90度后原本800x480的屏幕变成480x800的逻辑分辨率。如果你跑桌面环境图标和文字会变得很大。这时候需要在/boot/firmware/cmdline.txt里加fbconrotate:1让控制台也跟着转。但桌面环境的旋转需要在Screen Configuration里手动设置。我实测下来如果只是跑Python OpenCV显示摄像头画面直接用cv2.imshow全屏旋转由代码里的cv2.rotate处理更简单不用折腾系统层旋转。这样屏幕保持竖屏物理方向但画面内容旋转90度效果一样。5. 同时驱动时的资源冲突与排查实录5.1 摄像头出图但屏幕黑屏的排查过程这是我遇到的第一个大坑。config.txt配好后libcamera-hello能出图但DSI屏幕一直黑。dmesg里看到vc4-dsi: failed to allocate dma buffer。查了半天发现是GPU内存分配不够。树莓派5默认的GPU内存是76MB同时驱动CSI和DSI时不够用。需要在config.txt里加gpu_mem128或者更高比如256。改完后重启屏幕就亮了。这个参数在树莓派4上很少需要改但树莓派5的MIPI双开对内存需求更大。5.2 屏幕亮了但摄像头掉帧的解决屏幕点亮后我发现摄像头帧率从30fps掉到了15fps左右。用top看CPU占用不高但v4l2-ctl显示有丢帧。后来查资料发现是MIPI时钟冲突。CSI和DSI共用同一个PLL如果DSI的时钟配置得太高CSI的时钟就会被压缩。解决办法是在config.txt里给DSI屏幕降刷新率。官方7寸屏默认60Hz改成50Hzdtoverlayvc4-kms-dsi-7inch,refresh50改完后摄像头帧率恢复到28fps左右屏幕也没有明显闪烁。如果你用的是第三方屏可能需要手动调dsi_timing参数这个比较复杂建议先试降刷新率。5.3 I2C地址冲突的隐蔽问题还有一个不容易发现的问题摄像头和触摸屏都可能走I2C。OV5647的I2C地址是0x36官方7寸触摸屏的地址是0x38理论上不冲突。但如果你用的第三方触摸屏地址也是0x36就会冲突。排查方法是i2cdetect -y 10树莓派5的MIPI I2C总线是i2c-10和i2c-11。如果看到两个设备地址一样就需要改其中一个的地址或者换一个触摸屏。6. 跑通之后的实战用OpenCV同时采集和显示6.1 安装OpenCV和必要的依赖系统跑通后装OpenCVsudo apt install python3-opencv -y如果你要用YOLOv5还需要装PyTorch。但树莓派5上装PyTorch比较慢建议用预编译的wheel或者直接跑ONNX Runtime。6.2 一个同时采集和显示的Python脚本下面这个脚本是我实际在用的摄像头采集画面经过简单处理后全屏显示在DSI屏幕上import cv2 import numpy as np # 打开摄像头树莓派5上libcamera的索引通常是0 cap cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 创建全屏窗口 cv2.namedWindow(Display, cv2.WND_PROP_FULLSCREEN) cv2.setWindowProperty(Display, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) while True: ret, frame cap.read() if not ret: break # 如果屏幕是竖屏物理方向旋转90度 frame cv2.rotate(frame, cv2.ROTATE_90_CLOCKWISE) # 显示 cv2.imshow(Display, frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()这个脚本跑下来640x48030fps很稳CPU占用在40%左右。如果你要跑YOLOv5建议把分辨率降到320x320帧率能保持在15fps以上。6.3 长时间运行的稳定性观察我连续跑了48小时中间没有重启。观察到的现象是前24小时很稳定24小时后摄像头偶尔会丢一帧屏幕没有闪烁。查了一下可能是内存碎片导致的。建议长时间运行时每隔几小时重启一次摄像头采集或者用v4l2-ctl重新初始化。另外树莓派5的发热比4代大同时跑CSI和DSI时SoC温度在70度左右。建议加散热片或者小风扇否则温度到80度以上会降频摄像头帧率会明显下降。7. 几个容易被忽略的细节和我的个人建议7.1 供电不足会导致MIPI接口不稳定树莓派5需要5V/5A的供电官方电源是27W。如果你用普通的5V/3A电源同时接摄像头和屏幕时可能会出现屏幕闪烁或者摄像头识别失败。我一开始用的是一个旧手机的充电器结果屏幕一直闪换了官方电源后问题消失。所以别在电源上省钱。7.2 排线长度对信号质量的影响MIPI是高速差分信号排线太长会导致信号衰减。官方排线一般是15cm左右如果你需要更长的建议不要超过30cm。我试过用一根50cm的排线结果摄像头直接不识别。后来换成20cm的一切正常。7.3 系统升级后配置可能被覆盖Raspberry Pi OS的大版本升级有时会重置config.txt。我有一次升级后发现摄像头和屏幕都不工作了检查后发现config.txt被恢复成了默认值。所以升级前最好备份一下config.txt升级后对比一下。7.4 关于YOLOv5部署的额外提醒如果你打算在这套配置上跑YOLOv5建议用ONNX Runtime而不是PyTorch。PyTorch在树莓派5上安装麻烦而且推理速度不如ONNX。我实测下来YOLOv5s在640x640输入下ONNX Runtime能跑到8fps左右PyTorch只有4fps。另外摄像头采集和推理最好分线程处理否则显示会卡顿。7.5 最后分享一个排查小技巧当你遇到摄像头或屏幕不工作时先别急着改配置。用以下命令看一下内核日志dmesg | grep -E csi|dsi|mipi大部分问题都能从这里找到线索。比如probe failed通常是设备树配置问题dma buffer是内存问题i2c timeout是排线或地址问题。根据报错去搜比盲目试错快得多。这套配置我目前已经稳定用了两个月每天跑8小时以上没有出现过掉线或者花屏。如果你也在树莓派5上折腾双MIPI希望这篇记录能帮你少走点弯路。