ZigBee是以IEEE 802.15.4标准为基础的一种低成本、低功耗的无线网络技术,通过ZigBee协议栈,可将各ZigBee节点形成一个节点容量大、通信范围广的ZigBee网络。而H.264是当今最好的视频压缩标准,具有码流率低、图像质量高、容错能力强等优点。使用ZigBee网络来传输H.264视频码流,是实现无线视频传输系统的一种好方案。通过具体开发实例,从硬件和软件两个方面讨论了该方案的设计与实现。
0 引言
ZigBee是以IEEE 802.15.4标准为基础的一种低成本、低功耗、网络容量大、通信范围广的无线网络技术,可支持多达65 000个节点。ZigBee的工作频段有3个,分别是868 MHz、915 MHz、2.4 GHz,当工作于2.4 GHz时,其拥有最高的传输速率250 KB/s。在存储量尽可能小的情况下获得好的图像质量和低带宽图像快速传输已成为视频压缩的两大难题。为此ISO/IEC和ITUT两大国际标准化组织联手制定了新一代视频压缩标准H.264[3]。H264具有图像质量好、连续性强、动态图像质量高、压缩比高、码流速率可调等优点。本文从硬件和软件两个方面讨论使用带H.264硬件编解码器、ARM9 CPU核的i.MX27和带ZigBee协议栈的微处理器CC2430来共同组建无线视频传输系统。
1 系统总体设计
系统总体设计如图1所示,整个ZigBee网络由一个ZigBee协调器、多个 ZigBee路由器和ZigBee无线视频终端组成[4]。由于CC2430集成了2.4 GHz DSSS射频收发器和单片机控制器,因此ZigBee设备可以使用CC2430单芯片来实现。ZigBee协调器用于组建最初的ZigBee网络,并为加入网络的每个ZigBee路由器和ZigBee无线视频终端分配16位网络短地址。ZigBee路由器在ZigBee网络中扮演路由和中继的角色,为各ZigBee无线视频终端传输数据并扩大无线数据传输的范围。ZigBee无线视频终端根据分配得到的16位网络短地址可以相互之间进行双向无线数据通信[5]。i.MX27上采用Linux操作系统,在Linux下通过对采集的图像进行硬件压缩编码,各ZigBee无线视频终端之间的数据以H.264码流的形式进行无线传输。
2 ZigBee无线视频终端的硬件设计
考虑到H.264软件编解码需要消耗大量的CPU资源,故本方案中选择了具有H.264硬件编解码器及ARM9 CPU核的Freescale微处理器i.MX27。ARM9 CPU核一方面负责将摄像头采集到的YUV图像数据送入H.264硬件编码器,并将硬件编码器输出的H.264码流通过ZigBee微处理器CC2430无线发送出去。另一方面通过CC2430接收H.264码流并送入H.264硬件解码器,然后将硬件解码器输出的YUV图像数据显示到液晶屏上。ZigBee微处理器CC2430负责H.264码流的收发工作,并通过SPI接口与i.MX27进行通信。 ZigBee无线视频终端的硬件组成如图2所示。
为了实现图像的采集,本方案采用含有OV9650芯片的CMOS摄像头,采集到的图像通过i.MX27的CSI接口传输到H.264硬件编码器中。对于图像的显示,则选择群创AT070TN83V.1(16∶9,800×480)7英寸TFT液晶屏。该屏支持18位数字RGB接口,格式为RGB666,即每个像素由6 bit红、6 bit绿、6 bit蓝构成18 bit数据。该屏与i.MX27的LCDC控制器主要通过18根数据线(LD[17:0])、帧同步(VSYNC)、行同步(HSYSNC)、时钟(LSCLK)进行连接。采用一片三星的K9F2G08R0A NAND Flash芯片(256 M×8 bit)来储存系统的Bootloader(RedBoot),Linux内核,文件系统和视频程序。由两片Infineon Technologies的HYB18M512160AF7.5芯片(4 Bank×8 M×16 bit)构成128 MB的DDR,主要用于加载Linux操作系统和运行视频编解码程序。
设计一个10针的JTAG接口,用来烧写系统的Bootloader、Linux内核和文件系统。使用MAX3232构成UART接口,用来将调试信息返回到MiniCom上显示。因处理器内核需要1.8 V、1.5 V电压,而存储器和外部I/O需要3.3 V电压,故把整个系统的输入电压设为5 V,经过DCDC转换器可完成到3.3 V、1.8 V、1.5 V的电压转换。采用26 MHz的有源晶振,晶振经过i.MX27片内的PLL电路倍频后最高可达到400 MHz。
ZigBee通信模块以CHIPCON公司的CC2430微处理器为核心。将CC2430的SPI接口与i.MX27的SPI接口连接,H.264码流通过SPI接口进行传输。
3 ZigBee无线视频终端的软件设计
3.1图像采集
CSI(CMOS Sensor Interface)是i.MX27中的CMOS图像传感器接口。图像的采集可通过CSI接口、图像传感器芯片OV9650和Linux下视频设备的内核驱动V4L2来实现,所以需要加载CSI驱动mx27_csi.ko、ov9650驱动ov9650_cam.ko和V4L2驱动mx27_v4l2_capture.ko。这样应用程序在打开V4L2后,就可以进行图像数据采集了。
3.2图像显示
LCDC(Liquid Crystal Display Controller)是i.MX27中的液晶显示控制器。可通过LCDC接口来控制图像的显示,故需要加载LCDC驱动mxcfb_modedb.ko和mxcfb.ko及帧缓冲驱动。使用帧缓冲设备时,可将显示缓冲区直接映射到Linux用户空间。这样在Linux用户空间,应用程序可按照预先设置好的R、G、B位数和偏移量,将图像数据直接写到经过mmap()映射后的显示缓冲区,进而实现图像的显示。
3.3 H.264编解码
VPU(Video Processing Unit)是i.MX27中的视频处理单元,主要用于H.264 BP、MPEG-4 SP、H.263 P3格式的硬件编解码[6]。为了用户能够使用VPU的硬件编解码器,Freescale提供了一套Linux下的基于i.MX27 VPU的库文件。不论是编码还是解码,首先都必须调用vpu_Init()函数对VPU硬件进行初始化。
对于H.264编码,需要执行以下步骤:
(1)调用vpu_EncOpen()函数对VPU编码器初始化;
(2)调用vpu_EncGetInitialInfo()函数获取编码初始化信息;
(3)调用vpu_EncRegisterFrameBuffer()函数注册编码帧缓冲;
(4)调用vpu_EncStartOneFrame()函数,将编码帧缓冲中的每一帧图像数据送入VPU编码器编码,并将编码得到的H.264码流存放到指定的位流缓冲区中;
(5)当需要结束编码操作时,只需调用vpu_EncClose()函数。H.264编码的执行流程如图3所示。
对于H.264解码,需要执行以下步骤:
(1)调用vpu_DecOpen()函数对VPU解码器初始化;
(2)调用vpu_DecGetInitialInfo()函数获取解码初始化信息;
(3)调用vpu_DecRegisterFrameBuffer()函数注册解码帧缓冲;
(4)为了获取需解码的H.264码流,可调用vpu_DecGetBitstreamBuffer()函数;
(5)调用vpu_DecStartOneFrame()函数,将H.264码流送入VPU解码器进行解码,并将得到的图像数据存放到解码帧缓冲中;
(6)当需要结束解码操作时,只需调用vpu_DecClose()函数。H.264解码的执行流程如图4所示。
3.4H.264无线传输
要进行H.264码流无线接收和发送,首先需要加载i.MX27的SPI接口驱动mx27_spi.ko。通过SPI接口,i.MX27可以将H.264码流[7]传输到CC2430中并无线发送出去,也可以将CC2430无线接收的H.264码流输入到i.MX27中。
由于ZigBee在2.4 GHz工作频段和250 KB/s的传输速度下,物理层每次最多只能传输127 B的数据包。除去物理层和MAC层的网络包头,ZigBee每次传输的实际数据最多只有89 B[8]。由于ZigBee网络层不能对H.264码流进行分割和重组,而传输的H.264码流远多于89 B,因此必须在ZigBee协议的应用层将H.264码流分割为等于或小于89 B的数据包进行传输。在接收端需要对这些分解的数据包进行重组,以形成正确的H.264码流。由于在无线数据传输过程中被分割的数据包可能会丢失,这将直接影响接收端的数据重组,因此需要建立一个重传机制来重传数据传输过程中丢失的数据包。下面给出分组传输的数据包的格式。
数据发送之前,先执行握手协议[9]。ZigBee发送端先发送请求包,告诉ZigBee接收端即将发送的一帧H.264数据将被分割为几个数据包以及第一个数据包的编号。编号字段定义为4 B,能对4 GB的数据进行编号,这样可以保证当编号重复时,旧编号的数据包早已在网络中消失。
ZigBee接收端接收到请求包后,将返回一个确认包,表示ZigBee接收端接受ZigBee发送端的请求。ZigBee发送端接收到确认包后,同样也返回一个确认包,这样握手协议完成。接下来就是实际的数据通信了。握手协议的执行流程如图5所示。
握手协议完成后,ZigBee接收端将根据分割数据包的数量来分配接收缓冲区大小。将接收到的每个数据包按照数据包的编号依次存放到接收缓冲区对应的位置处,并将该位置的标志置1,表示接收到了对应的数据包。如果接收缓冲区中某些位置的标志为0并且对应的定时器超时,则表示该位置没有接收到对应的数据包,数据包在无线传输的过程中丢失。ZigBee接收端需要向ZigBee发送端发送一个重传包,请求将丢失的数据包重新传递过来。本传输协议规定,若针对某位置连续3次发送重传包后,定时器连续4次超时,则表示传输失败。ZigBee接收端将发送重新开始包,命令ZigBee发送端对下一帧H.264数据进行传输。协议重传的执行流程如图6所示。
评论
查看更多