MIPI(CSI-2)之从bit流中获取图像数据

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DuinoDu/article/details/48479325

MIPI(CSI-2)之从bit流中获取图像数据

Duino Studio

摘要

本文主要阐述mipi协议中的csi-2部分,从物理层的导线连接,到应用层的图像数据获取,试图向读者,包括自己,描绘出整个框架,包括细节。你可以从本文了解到:

  • mipi-csi的最底层的信号是怎样的
  • 物理层需要做哪些逻辑处理
  • bit流如何处理成字节流,进而转换成图像数据

物理层(D-PHY)

img1

这张图,从右向左看。最右边,有两条线Dp和Dn,这是mipi协议最底层的引脚,所有的数据都通过这一对引脚传输。
中间的虚线框,控制Dp-Dn的物理特性(电压特性),见下图:

img2

从这个图中可以看出,Dp-Dn有两种工作状态:低功耗(LP)高性能(HS)。LP模式下,Dp-Dn处于单端模式,传输的信号是单端信号;HS模式下,Dp-Dn传输的是差分信号。虚线框里的各种发送驱动器和接收缓冲器,就用用来控制这两种工作模式,使得HS和LP对于中间层(Lane Control & Interface Logic)的数据传输是透明的。

中间层(Lane Control & Interface Logic)需要控制发送驱动器和接收缓冲器,即EN信号。另外,中间层的主要工作是State Machine,通过State Machine来控制整个数据传输节奏。下面以一个State Machine为例子,说明它是如何工作的。

img3

每一个框框表示一种状态,对应Dp-Dn引脚上的电平状态。左边是高速信号发送,右边是高速信号接收。具体内容比较易懂,这里就不再赘述。

再往上走,就是物理层的接口PPI(PHY-Protocol Interface)。PPI是D-PHY和上层的接口,在mipi中,除了csi,还有dsi…等等,这些针对具体外设的接口协议,都是基于D-PHY的,意思是说,都是使用PPI和底层数据进行交互的。

现在,我们从底层的1010(Dp-Dn),经过虚线框、中间层和PPI,来到了一个分叉路口,这里有的通向摄像头,有的通向显示屏。我们沿着摄像头,继续往上走。

CSI)

现在我们的数据还是1010比特流,进入csi,遇到的第一层,是Lane Management Layer,这一层的功能我们后面再说明,对于单Lane,它并不影响数据的形态。

通过Lane Management Layer,迎接我们的是Low Level Protocol。

img5

在这一层,数据从1010,被处理成各种不同的形态,具有各种不同的含义。总的分三类:Short Package,Long Package和LPS。LPS即Low Power State(Dp-Dn处于低功耗工作状态),此时是不传输数据的。需要传输的数据包,以ST开头,告诉底下的,我要开始传输数据了(Dp-Dn进入HS状态),紧接着是具体的数据,最后以ET结束传输(Dp-Dn退出HS状态),回到LPS。为什么总要回到LPS,因为省电节能低功耗啊!可以看出,为啥mipi可以兼顾高速信号传输和低功耗了。

在这一层中,1010从以bit为单位,处理成以字节为单位,意思是说ST,SP,ET等等,都是一个字节一个字节。下面我们看看,Short Package和Long Package中里面,各个字节,到底代表什么含义。

img6

长包分3部分:包头+包数据+包尾。
包头分3部分:数据id+字求和+纠错码(4个字节32位)
包数据:就是需要传输的数据啦,图像数据就在这里面。
包尾:2字节16位的校验和。

img7

短包就只包含长包中的包头部分。可以看出,短包的功能不是来传递数据的,是用来保证数据可靠传输的。

好,我们已经定位图像数据的位置了,离我们的目标越来越近了。

图像数据有很多种格式,如YUV420-8bit,YUV420-10bit,YUV422-8bit,RGB888等等,mipi也支持用户自定义数据类型。下面以RGB888为例,

img8

从这张图可以看出,一个长包传递一张图片的一行数据。以这张图为例,如果需要传输一张640*480的图片,需要480个长包。
每一个长包可以用来做行同步,每一帧图像也需要同步。即需要有字节标识,帧头和帧尾。

img9

FS和FE就是帧同步字节。

到这里,我们就可以获取到摄像头采集到的图片数据,可以进行各种image processing。

阅读更多

没有更多推荐了,返回首页