驱动、bootloader、文件系统

嵌入式 SoC 与接口 40:CSI-2:数据类型、虚拟通道与带宽预算

展开合集目录
  1. 嵌入式 SoC 与接口 01:从摄像头框图认识 SoC
  2. 嵌入式 SoC 与接口 02:电平、地与逻辑阈值
  3. 嵌入式 SoC 与接口 03:差分、阻抗、端接与信号完整性
  4. 嵌入式 SoC 与接口 04:PMIC、供电时序与掉电行为
  5. 嵌入式 SoC 与接口 05:晶振、PLL、时钟树与跨时钟域
  6. 嵌入式 SoC 与接口 06:复位域、看门狗与故障恢复
  7. 嵌入式 SoC 与接口 07:ADC、DAC、参考电压与采样
  8. 嵌入式 SoC 与接口 08:MCU、MPU、SoC 与操作系统
  9. 嵌入式 SoC 与接口 09:CPU、异常、中断与多核
  10. 嵌入式 SoC 与接口 10:GPU:并行计算、图形与数据搬运
  11. 嵌入式 SoC 与接口 11:DSP:滤波、FFT、定点数与饱和
  12. 嵌入式 SoC 与接口 12:NPU:张量计算、片上存储与 TOPS
  13. 嵌入式 SoC 与接口 13:ISP:从传感器 RAW 到可用图像
  14. 嵌入式 SoC 与接口 14:视频编解码器与图像加速器
  15. 嵌入式 SoC 与接口 15:Boot ROM、Bootloader 与系统启动
  16. 嵌入式 SoC 与接口 16:NOR、NAND、擦写与 ECC
  17. 嵌入式 SoC 与接口 17:eMMC:总线模式、内部管理与分区
  18. 嵌入式 SoC 与接口 18:安全启动、固件签名与 A/B 升级
  19. 嵌入式 SoC 与接口 19:寄存器、地址空间与 MMIO
  20. 嵌入式 SoC 与接口 20:SRAM、DDR、带宽与延迟
  21. 嵌入式 SoC 与接口 21:Cache、一致性与可见性
  22. 嵌入式 SoC 与接口 22:DMA、描述符与环形缓冲
  23. 嵌入式 SoC 与接口 23:MMU、IOMMU 与三种地址
  24. 嵌入式 SoC 与接口 24:AXI、AHB、APB 与片内互连
  25. 嵌入式 SoC 与接口 25:零拷贝、dma-buf 与缓冲生命周期
  26. 嵌入式 SoC 与接口 26:共享内存、Mailbox 与核间通信
  27. 嵌入式 SoC 与接口 27:GPIO、Pinmux、上下拉与引脚状态
  28. 嵌入式 SoC 与接口 28:UART、RS-232 与 RS-485
  29. 嵌入式 SoC 与接口 29:I²C:地址、ACK、重复起始与上拉
  30. 嵌入式 SoC 与接口 30:SPI、QSPI 与 Flash 访问
  31. 嵌入式 SoC 与接口 31:定时器、PWM、输入捕获与编码器
  32. 嵌入式 SoC 与接口 32:I²S、PCM、TDM 与音频时钟
  33. 嵌入式 SoC 与接口 33:CAN 与 CAN FD:仲裁、帧和错误状态
  34. 嵌入式 SoC 与接口 34:USB:角色、端点、传输类型与 UVC
  35. 嵌入式 SoC 与接口 35:SD 与 SDIO:存储卡和外设功能
  36. 嵌入式 SoC 与接口 36:Ethernet:MAC、PHY、MDIO 与吞吐
  37. 嵌入式 SoC 与接口 37:PCIe:链路、枚举、BAR、中断与 DMA
  38. 嵌入式 SoC 与接口 38:MIPI 全景:CSI、DSI 与 PHY
  39. 嵌入式 SoC 与接口 39:摄像头接入:供电、复位、MCLK 与配置
  40. 嵌入式 SoC 与接口 40:CSI-2:数据类型、虚拟通道与带宽预算
  41. 嵌入式 SoC 与接口 41:显示链路:DSI、RGB、LVDS 与 HDMI
  42. 嵌入式 SoC 与接口 42:设备树、probe、IRQ 与资源生命周期
  43. 嵌入式 SoC 与接口 43:实时性、中断延迟与优先级反转
  44. 嵌入式 SoC 与接口 44:万用表、示波器、逻辑分析仪与 JTAG
  45. 嵌入式 SoC 与接口 45:综合排障:无图、花屏、丢帧与 NPU 慢
  46. 嵌入式 SoC 与接口 46:选修:Wi-Fi、Bluetooth 与蜂窝通信
  47. 嵌入式 SoC 与接口 47:选修:工业以太网、EtherCAT 与 TSN
  48. 嵌入式 SoC 与接口 48:选修:FPGA、流水线与时序约束
  49. 嵌入式 SoC 与接口 49:选修:长距离视频 SerDes 与 A-PHY
  50. 嵌入式 SoC 与接口 50:选修:温度、功耗、EMC 与长期可靠性
嵌入式 SoC 与接口 40:CSI-2:数据类型、虚拟通道与带宽预算的封面

第 40 / 50 课 · 核心课程。返回课程合集。

帧内容由模式和包信息共同解释

CSI-2 传输使用包及数据标识等机制表达内容,数据类型帮助区分 RAW 位深等负载,虚拟通道用于区分逻辑流。实际支持的通道数量和扩展取决于版本与实现,不能认为配置一个 VC 就能凭空增加物理带宽。

RAW10 的有效像素为每像素十位,但接收后内存可能按更宽容器保存。线上打包字节与 DDR 中的 stride、平面布局应分别核对,不能用一个文件大小同时解释两者。

有效像素速率只是下界

1920×1080、30fps、RAW10 的有效数据速率为 622.08Mbit/s。理想平均分到两条数据 lane 是 311.04Mbit/s/lane,但还未包含包开销、传输调度和模式要求。

空白时间未必等同于传输同尺寸的空白像素包,不能简单把所有视频接口的 blanking 公式套过来。最终使用 sensor 模式给定的链路频率、时序和接收端限制,再检查余量。

错误计数提供方向而非唯一答案

CRC、头部纠错相关计数、同步错误和帧尺寸异常对应不同检查点,但不能仅凭一个计数器就断言 PCB 有问题。lane 映射、速率、时序窗口、格式配置和信号质量都需要核对。

CSI-2:数据类型、虚拟通道与带宽预算:包类型与 VC、像素有效负载、lane 与模式预算

练习与参考结论

代码计算有效负载和一个明确标注为假设的 20% 预算余量。该余量不是 MIPI 标准规定,也不替代实际 mode 参数。

把位深从 10 改成 12,帧率从 30 改为 60,观察预算如何增长;然后分别计算接收后 16 位容器的 DDR 写入量,解释为什么两个速率不同。

配套代码

下载包包含独立运行所需文件,使用 Python 标准库;这里验证机制和计算,不代表开发板测量结果。

运行本课机制与计算示例

查看完整代码:main.py
def main():
    width, height, fps, depth, lanes = 1920, 1080, 30, 10, 2
    payload = width * height * fps * depth
    ideal_lane = payload / lanes
    illustrative_budget = ideal_lane * 1.2
    ddr = width * height * fps * 2
    assert payload == 622080000 and ideal_lane == 311040000
    print("payload Mbit/s", payload / 1e6, "ideal per-lane Mbit/s", ideal_lane / 1e6)
    print("ASSUMED 20% budget per-lane Mbit/s", illustrative_budget / 1e6)
    print("unpacked 16-bit DDR write MB/s", ddr / 1e6)
    print("20% 不是规范值;最终按 sensor mode 与接收端能力配置")


if __name__ == "__main__":
    main()
下载代码

在项目根目录执行;下载包解压后,在解压目录执行 python3 main.py。

cd 'content/posts/驱动、bootloader、文件系统/嵌入式SoC与接口/40-CSI-2:数据类型、虚拟通道与带宽预算/code' && python3 main.py

延伸阅读

上一课:摄像头接入:供电、复位、MCLK 与配置 · 下一课:显示链路:DSI、RGB、LVDS 与 HDMI