【朝花夕拾】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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值