1.OV2640 简介
OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图像 传感器。该传感器体积小、工作电压低,提供单片 UXGA 摄像头和影像处理器的所有功能。通 过 SCCB 总线控制,可以输出整帧、子采样、缩放和取窗口等方式的各种分辨率 8/10 位影像 数据。
OV2640 的特点有:
⚫ 高灵敏度、低电压适合嵌入式应用
⚫ 标准的 SCCB 接口,兼容 IIC 接口
⚫ 支持 RawRGB、RGB(RGB565/RGB555)、GRB422、YUV(422/420)和 YCbCr(422) 输出格式
⚫ 支持 UXGA、SXGA、SVGA 以及按比例缩小到从 SXGA 到 40*30 的任何尺寸
⚫ 支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹、自动黑电平校 准等自动控制功能。同时支持色饱和度、色相、伽马、锐度等设置。
⚫ 支持闪光灯
⚫ 支持图像缩放、平移和窗口设置
⚫ 支持图像压缩,即可输出 JPEG 图像数据
⚫ 自带嵌入式微处理器
OV2640 的功能框图图如图
最后,我们介绍一下 OV2640 的图像数据输出格式。首先我们简单介绍一些定义:
UXGA ,即分辨率位 1600*1200 的输出格式,类似的还有: SXGA(1280*1024) 、 WXGA+(1440*900)、XVGA(1280*960)、WXGA(1280*800)、XGA(1024*768)、SVGA(800*600)、 VGA(640*480)、CIF(352*288)、WQVGA(400*240)、QCIF(176*144)和 QQVGA(160*120)等。
PCLK,即像素时钟,一个 PCLK 时钟,输出一个像素(或半个像素)。
VSYNC,即帧同步信号。
HREF /HSYNC,即行同步信号。
OV2640 的图像数据输出(通过 Y[9:0])就是在 PCLK,VSYNC 和 HREF/ HSYNC 的控制 下进行的。
首先看看行输出时序,如图 40.1.1.5 所示:
从上图可以看出,图像数据在 HREF 为高的时候输出,当 HREF 变高后,每一个 PCLK 时 钟,输出一个 8 位/10 位数据。我们采用 8 位接口,所以每个 PCLK 输出 1 个字节,且在 RGB/YUV 输出格式下,每个 tp=2 个 Tpclk,如果是 Raw 格式,则一个 tp=1 个 Tpclk。比如我们采用 UXGA 时序,RGB565 格式输出,每 2 个字节组成一个像素的颜色(高低字节顺序可通过 0XDA 寄存 器设置),这样每行输出总共有 1600*2 个 PCLK 周期,输出 1600*2 个字节。
再来看看帧时序(UXGA 模式),如图 40.1.1.6 所示:
上图清楚的表示了OV2640在UXGA模式下的数据输出。我们按照这个时序去读取OV2640 的数据,就可以得到图像数据。
最后说一下 OV2640 的图像数据格式,我们一般用 2 种输出方式:RGB565 和 JPEG。当输 出 RGB565 格式数据的时候,时序完全就是上面两幅图介绍的关系。以满足不同需要。而当输 出数据是 JPEG 数据的时候,同样也是这种方式输出(所以数据读取方法一模一样),不过 PCLK 数目大大减少了,且不连续,输出的数据是压缩后的 JPEG 数据,输出的 JPEG 数据以: 0XFF,0XD8 开头,以 0XFF,0XD9 结尾,且在 0XFF,0XD8 之前,或者 0XFF,0XD9 之后,会有 不 定 数 量 的 其 他 数 据 存 在 ( 一 般 是 0 ), 这 些 数 据 我 们 直 接 忽 略 即 可 , 将 得 到 的 0XFF,0XD8~0XFF,0XD9 之间的数据,保存为.jpg/.jpeg 文件,就可以直接在电脑上打开看到图 像了。
数字摄像头接口 (DCMI)
DCMI 简介
数字摄像头接口是一个同步并行接口,能够接收外部 8 位、10 位、12 位或 14 位 CMOS 摄 像头模块发出的高速数据流。可支持不同的数据格式:YCbCr4:2:2/RGB565 逐行视频和压 缩数据 (JPEG)。
DCMI 主要特性
● 8 位、10 位、12 位或 14 位并行接口
● 内嵌码/外部行同步和帧同步
● 连续模式或快照模式
● 裁剪功能
● 支持以下数据格式: — 8/10/12/14 位逐行视频:单色或原始拜尔格式 — YCbCr 4:2:2 逐行视频 — RGB 565 逐行视频 — 压缩数据:JPEG
DCMI 功能概述
数字摄像头接口是一个同步并行接口,可接收高速(可达 54 MB/s)数据流。该接口包含多 达 14 条数据线 (D13-D0) 和一条像素时钟线 (PIXCLK)。像素时钟的极性可以编程,因此可 以在像素时钟的上升沿或下降沿捕获数据。
这些数据被放到 32 位数据寄存器 (DCMI_DR) 中,然后通过通用 DMA 进行传输。图像缓冲 区由 DMA 管理,而不是由摄像头接口管理。
从摄像头接收的数据可以按行/帧来组织(原始 YUB/RGB/拜尔模式),也可以是一系列 JPEG 图像。要使能 JPEG 图像接收,必须将 JPEG 位(DCMI_CR 寄存器的位 3)置 1。
数据流可由可选的 HSYNC(水平同步)信号和 VSYNC(垂直同步)信号硬件同步,或者通 过数据流中嵌入的同步码同步。
捕获模式
此接口支持两种类型的捕获:快照(单帧)和连续采集。
void lwip_demo(void){struct netconn *conn;static ip_addr_t ipaddr;uint8_t remot_addr[4];static u16_t port;uint32_t *jpeg_buf;uint32_t jpeg_len;conn = netconn_new(NETCONN_TCP); /* 创建一个 TCP 链接 */netconn_bind(conn,IP_ADDR_ANY,8088); /* 绑定端口 8088 号端口 */netconn_listen(conn); /* 进入监听模式 */while (1){err = netconn_accept(conn,&g_newconn); /* 接收连接请求 */if (err == ERR_OK){/* 初始化 ATK-MC2640 模块 */lwip_camera_init();/* 为 JPEG 缓存空间申请内存 */jpeg_buf = mymalloc(SRAMIN, DEMO_JPEG_BUF_SIZE);delay_ms(1000);while (1) {jpeg_len = DEMO_JPEG_BUF_SIZE / (sizeof(uint32_t));memset((void *)jpeg_buf, 0, DEMO_JPEG_BUF_SIZE);/* 获取 ATK-MC2640 模块输出的一帧 JPEG 图像数据 */atk_mc2640_get_frame((uint32_t)jpeg_buf,ATK_MC2640_GET_TYPE_DTS_32B_INC, NULL);/* 获取 JPEG 图像数据的长度 */while (jpeg_len > 0){if (jpeg_buf[jpeg_len - 1] != 0){break;}jpeg_len--;}jpeg_len *= sizeof(uint32_t);/* 发送 JPEG 图像数据 */err = netconn_write(g_newconn,jpeg_buf,jpeg_len,NETCONN_COPY); if ((err == ERR_CLSD) || (err == ERR_RST)){myfree(SRAMIN,(void *)jpeg_buf);netconn_close(g_newconn);netconn_delete(g_newconn);break;}