【朝花夕拾】RT1050 CSI OV7670摄像头eLCDIF显示
一, 文章简介
OV7670是一款CMOS VGA图像传感器,体积小,工作电压低,通过SCCB总线控制,可以输出各种分辨率的8位影像数据,帧率高达30帧/秒,成本低。
本篇文章主要是实现RT10XX上使用CSI获取OV7670摄像头数据,并且使用RT10XX自带的显示模块eLCDIF显示。摄像头和显示采用RGB565格式。摄像头分辨率配置为QVGA 320240, LCD为NXP官方EVKB配套LCD RK043FN02H,分辨率为480272,帧率为30FPS.
本文基于NXP官方RT1050 SDK:
SDK_2_14_0_EVKB-IMXRT1050\boards\evkbimxrt1050\driver_examples\csi\rgb565
移植OV7670驱动,实现CSI方式采集OV7670图像数据,并通过eLCDIF模块显示到LCD。
二, 原理讲解
这里给出简单的相关知识讲解。
2.1 RGB565彩色模式
RGB565作为图像的一个基本彩色编码格式,是指一个像素占2个字节的数据,通常用于图像和显示设备中。R红色,G绿色,B蓝色,现实显示根据三基色的配备得到不同的其他颜色,每个橡树可以显示65536(2^16)种颜色。具体分配如下:
图1
由上图,可以知道,纯红绿蓝的显示2字节数据为:
红:0xf800,绿:0X07E0,蓝:0X001F
2.2 OV7670摄像头硬件与波形情况
使用的0V7670模块如下:
图2
引脚情况:
RGB565输出数据时序:
图 3
2.2 CSI帧同步信号时序波形
图 4
2.3 LCD显示波形
图 5
所以,通过CSI获取OV7670的数据,然后存储到buffer,eLCDIF再从buffer中取数据显示到LCD屏幕上,显示摄像头数据的实时采集与现实。
三 软硬件实现
测试平台基于NXP MIMXRT1050-EVKB revA1版本:
https://www.nxp.com/design/development-boards/i-mx-evaluation-and-development-boards/i-mx-rt1050-evaluation-kit:MIMXRT1050-EVK
LCD为:https://www.nxp.com/part/RK043FN02H-CT#/
3.1 硬件连接情况
从图2可以看到购买的通用模块是2.54mm直插方式,但是MIMXRT1050-EVKB板载使用的CSI接口是FPC接口,所以需要转接板从FPC转到2.54mm直插模式,接线图下:
图 6
实际整体硬件连接情况如下图:
图 7
3.2 软件准备
关于OV7670的SDK驱动,RT SDK并没有直接给出,但是FRDM-K82 SDK里面提供了相关的驱动,可以移植到RT1050 SDK。
SDK版本:SDK_2_14_0_EVKB-IMXRT1050\boards\evkbimxrt1050\driver_examples\csi\rgb565
代码替换掉原始的OV7725代码,把相关驱动换成OV7670的驱动,修改OV7670代码,匹配到RT1050 CSI代码中,并且添加对于OV7670 RST和PWDN的IO信号控制,添加RST和PWDN控制的原因是,发现有些模块,如果不做RST引脚的关闭延迟开启,导致采集不成功的问题,但是添加了RST和PWDN控制,目前不同厂家的OV7670均能成功稳定采集显示。具体OV7670代码,可以查看附件源代码。
摄像头初始化代码如下:
static void APP_InitCamera(void)
{
const camera_config_t cameraConfig = {
.pixelFormat = kVIDEO_PixelFormatRGB565,
.bytesPerPixel = APP_BPP,
.resolution = FSL_VIDEO_RESOLUTION(320, 240),
/* Set the camera buffer stride according to panel, so that if
* camera resoution is smaller than display, it can still be shown
* correct in the screen.
*/
.frameBufferLinePitch_Bytes = DEMO_BUFFER_WIDTH * APP_BPP,
.interface = kCAMERA_InterfaceGatedClock,
.controlFlags = DEMO_CAMERA_CONTROL_FLAGS,
.framePerSec = 30,
};
memset(s_frameBuffer, 0, sizeof(s_frameBuffer));
BOARD_InitCameraResource();
CAMERA_RECEIVER_Init(&cameraReceiver, &cameraConfig, NULL, NULL);
if (kStatus_Success != CAMERA_DEVICE_Init(&cameraDevice, &cameraConfig))
{
PRINTF("Camera device initialization failed\r\n");
while (1)
{
;
}
}
CAMERA_DEVICE_Start(&cameraDevice);
/* Submit the empty frame buffers to buffer queue. */
for (uint32_t i = 0; i < APP_FRAME_BUFFER_COUNT; i++)
{
CAMERA_RECEIVER_SubmitEmptyBuffer(&cameraReceiver, (uint32_t)(s_frameBuffer[i]));
}
}
这里的分辨率为QVGA 320240,和LCD的480272不匹配,不过没有关系,实际上是在LCD 中显示320240大小,如果要显示到480272,也可以通过PXP做尺寸配置。
更多代码详情,查看附件代码包。
四,总结
本文旨在提供一个RT OV7670 CSI+eLCDIF采集与显示的demo,话不多说,直接上成品效果视频,可以看到相对显示还是比较清晰,并且刷新效果还不错。
evkbimxrt1050_csiOV7670_rgb565
代码下载链接:
https://community.nxp.com/t5/i-MX-RT-Knowledge-Base/RT1050-CSI-OV7670-camera-eLCD-display/ta-p/1752263