s3c2440的摄像接口应用

s3c2440提供了一个摄像接口,使开发人员很容易地实现摄像、照相等功能。摄像接口包括8位来自摄像头的输入数据信号,一个输出主时钟信号,三个来自摄像头的输入同步时钟信号和一个输出复位信号。摄像接口的主时钟信号由USB PLL产生,它的频率为96MHz,再经过分频处理后输出给摄像头,摄像头再根据该时钟信号产生三个同步时钟信号(像素时钟、帧同步时钟和行同步时钟),反过来再输入回s3c2440。

 

       s3c2440仅仅提供了一个摄像接口,因此要实现其功能,还需要摄像头。在这里,我们使用OV9650。OV9650内部有大量的寄存器需要配置,这就需要另外的数据接口。OV9650的数据接口称为SCCB(串行摄像控制总线),它由两条数据线组成:一个是用于传输时钟信号的SIO_C,另一个是用于传输数据信号的SIO_D。SCCB的传输协议与IIC的极其相似,只不过IIC在每传输完一个字节后,接收数据的一方要发送一位的确认数据,而SCCB一次要传输9位数据,前8位为有用数据,而第9位数据在写周期中是Don’t-Care位(即不必关心位),在读周期中是NA位。SCCB定义数据传输的基本单元为相(phase),即一个相传输一个字节数据。SCCB只包括三种传输周期,即3相写传输周期(三个相依次为设备从地址,内存地址,所写数据),2相写传输周期(两个相依次为设备从地址,内存地址)和2相读传输周期(两个相依次为设备从地址,所读数据)。当需要写操作时,应用3相写传输周期,当需要读操作时,依次应用2相写传输周期和2相读传输周期。因此SCCB一次只能读或写一个字节。下面我们就用s3c2440的IIC总线接口分别与OV9650的SIO_C和SIO_D相连接来实现SCCB的功能。具体的读、写函数为:

 

上面程序中,我们是用循环语句读取OV9650的寄存器0x1C和0x1D的,之所以这样,是为了防止只读取一次时,会有读取不正确的现象发生。而一旦正确读取了厂商ID信息,再读写OV9650寄存器,一般就不会发生读写的错误。

 

       下面就介绍s3c2440摄像接口的相关配置。摄像接口有两个相互独立的DMA通道——P通道(预览通道)和C通道(编解码通道)。P通道主要是存储用于视频显示的RGB图像数据,C通道主要是存储用于编解码的YCbCr图像数据。在这里我们主要是把OV9650采集到的视频信息实时显示在LCD上,因此只介绍P通道的用法。

 

       设置s3c2440摄像接口一个很重要的步骤就是设置视频尺寸大小。我们把由OV9650采集到的视频尺寸称为源,即源水平尺寸和源垂直尺寸,其中源水平尺寸必须是8的整数倍。这个尺寸是通过配置OV9650的相关寄存器实现的。我们把这两个值分别放入输入源格式寄存器CISRCFMT的第16位至第28位,和第0位至第12位内,例如通过OV9650,采集的到的视频尺寸为640×480,则把640和480分别放入寄存器CISRCFMT中的相应位置即可。我们把实际显示的视频尺寸称为目标,即目标水平尺寸和目标垂直尺寸,这里这个尺寸就是LCD的尺寸。我们把这两个值分别放入预览DMA目标图像格式寄存器CIPRTRGFMT的第16位至第28位,和第0位至第12位内,例如LCD的尺寸为320×240,则把320和240分别放入寄存器CIPRTRGFMT中的相应位置即可。另外还需要把这两个值的乘积放入预览缩放目标面积寄存器CIPRTAREA内。源尺寸和目标尺寸往往是不一样大小的,那么可能还需要设置偏移量,即水平偏移量和垂直偏移量,应该把这两个值分别放入窗口偏移寄存器CIWDOFST的第16位至第26位,和第0位至第10位内,其中这个寄存器的第31位用于控制是否需要设置偏移量,当偏移量为0或不需要设置偏移量时,这一位应为0,否则为1。显然,通过源尺寸、目标尺寸和偏移量的设置,可以实现被摄像物体的缩放效果。当然,要实现这种缩放效果,还需要配置预览预缩放比例控制寄存器CIPRSCPRERATIO、预览预缩放距离格式寄存器CIPRSCPREDST和预览主缩放控制寄存器CIPRSCCTRL,这些寄存器的相关参数是通过计算得到的,数据手册上有详细的说明,而且还有标准的函数可以调用,因此在这里就不过多介绍。

 

       前面已经介绍过,摄像接口都是通过DMA实现数据交换的。s3c2440能够在内存中各开辟四块乒乓存储区域,用于实现P通道和C通道的快速数据传递。在P通道中,寄存器CIPRCLRSA1、CIPRCLRSA2、CIPRCLRSA3和CIPRCLRSA4分别用于表示这四块内存的首地址。另外在DMA数据传递中,还要让DMA知道如何进行传递,即一次传输多少个字节,这需要设置预览DMA控制相关寄存器CIPRCTRL的主突发长度和剩余突发长度,这两个值也可以通过调用标准函数来求得。另外在完成每一帧视频采集后,会触发一个视频中断。

 

       下面就给出一段具体的程序,利用OV9650实时地在LCD上显示视频,并通过UART来控制视频,让视频图像放大,缩小,以及实现照相的功能(让图像定格在LCD上)。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhaocj/archive/2010/06/07/5653479.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值