LISA Camera 摄像头捕获示例

功能说明

本示例演示如何使用 LISA Camera 驱动接口,实现连续捕获图像并通过串口高速发送的功能。主要包括:

  1. 设备初始化:初始化摄像头、DVP、I2C、UART等设备。

  2. 参数配置:配置摄像头的分辨率、像素格式等参数。

  3. 连续捕获:在主循环中连续捕获图像帧。

  4. 串口发送:将捕获到的图像数据通过串口(DMA模式,3Mbps)发送出去,可用于上位机显示或分析。

本示例展示了摄像头驱动在实际应用场景中的数据流处理,需要连接摄像头硬件才能正常运行。

硬件连接

摄像头连接

摄像头通过 DVP (Digital Video Port) 接口连接到主控芯片:

信号

说明

连接

XCLK

主时钟输出(24MHz)

主控→摄像头

PCLK

像素时钟输入

摄像头→主控

VSYNC

垂直同步信号

摄像头→主控

HSYNC

水平同步信号

摄像头→主控

D0-D7

8位数据总线

摄像头→主控

SDA

I2C数据线(传感器配置)

双向

SCL

I2C时钟线(传感器配置)

主控→摄像头

VCC

电源(通常3.3V或2.8V)

-

GND

-

示例步骤

  1. 初始化 uart1 设备,配置为 3Mbps 波特率,DMA 传输模式。

  2. 获取 camera 设备句柄并检查设备是否就绪。

  3. 配置摄像头硬件参数,包括 MCLK、PWDN、I2C 等。

  4. 查询并打印摄像头的能力信息(最大分辨率、支持格式等)。

  5. 配置并挂载 DVP 总线接口。

  6. 启动摄像头。

  7. 进入主循环,连续调用 lisa_camera_capture() 捕获图像帧。

  8. 将捕获到的图像帧数据通过 uart1 异步发送。

  9. 释放帧缓冲区,准备下一次捕获。

编译

重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:

  • arcs_evb - ARCS EVB 评估板

  • arcs_mini - ARCS Mini 开发板

根据您的开发板型号,选择对应的编译命令:

在示例目录下执行编译:

# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini

Note

如果在 SDK 根目录执行,需要指定示例路径:

# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini

Note

确保已安装对应的工具链。

烧录

编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Note

烧录参数说明

  • -s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

预期输出

=== LISA Camera Driver Sample ===
Serial initialized (3Mbps)
camera device ready
Setting up camera...
Camera capabilities: max_width=1600, max_height=1200, supported_formats=0x... 
Starting camera...
Captured frame: 640x480, len=614400, ts=123
Send frame: .. .. .. ... .. .. .., len=614400
Frame 1 sending...
Captured frame: 640x480, len=614400, ts=156
Send frame: .. .. .. ... .. .. .., len=614400
Frame 2 sending...
...

核心 API

API

说明

lisa_device_get()

获取设备对象

lisa_device_ready()

检查设备是否就绪

lisa_camera_attach_bus()

附加 DVP/SPI 总线接口

lisa_camera_setup()

配置摄像头参数(分辨率、格式等)

lisa_camera_get_capabilities()

查询摄像头能力

lisa_camera_start()

启动摄像头

lisa_camera_stop()

停止摄像头

lisa_camera_capture()

捕获一帧图像

lisa_camera_release_fb()

释放帧缓冲区

关键代码

1. 配置DVP总线

lisa_camera_bus_config_t bus_config = {
    .bus_type = LISA_CAMERA_BUS_DVP,
    .config.dvp = {
        .dvp_dev = dvp_dev,
        .pixel_offset = 0,
        .line_offset = 0,
        .pclk_polarity = 1,   /* 上升沿采样 */
        .vsync_polarity = 0,  /* 低电平有效 */
        .hsync_polarity = 0,  /* 低电平有效 */
        .data_width = 8,      /* 8位数据总线 */
        .dma_dev = dma_dev,
        .dma_channel = 0,
    }
};

lisa_camera_attach_bus(camera_dev, &bus_config);

2. 配置并启动摄像头

lisa_camera_config_t config = {
    .pixel_format = LISA_CAMERA_PIXFMT_RGB565,
    .framesize = LISA_CAMERA_FRAMESIZE_QVGA,  /* 320x240 */
    .xclk_freq_hz = 24000000,  /* 24MHz */
    .fb_count = 2,             /* 2个帧缓冲区 */
    .enable_hmirror = false,
    .enable_vflip = false,
};

lisa_camera_setup(camera_dev, &config);
lisa_camera_start(camera_dev);

3. 捕获并发送图像

/* 主循环:捕获图像并通过串口发送 */
int send_cnt = 0;
while (1) {
    lisa_camera_fb_t *fb = NULL;

    /* 捕获一帧图像 */
    ret = lisa_camera_capture(camera_dev, &fb);
    if (ret != LISA_DEVICE_OK || fb == NULL) {
        LOGE("Capture failed: %d", ret);
        continue;
    }

    /* 通过串口发送图像数据 */
    if (serial_tx_ready()) {
        memcpy(uart_buf, fb->buf, fb->len);
        serial_send(uart_buf, fb->len);
        send_cnt++;
    }

    /* 立即释放帧缓冲区 */
    lisa_camera_release_fb(camera_dev, fb);
}

配置说明

示例需要在 prj.conf 中配置:

CONFIG_LISA_DEVICE=y      # 使能 LISA 设备框架
CONFIG_LISA_I2C=y         # 使能 I2C 驱动(传感器配置)
CONFIG_LISA_I2C0=y        # 使能 I2C0 控制器
CONFIG_LISA_CAMERA=y      # 使能 Camera 驱动
CONFIG_LOG=y              # 使能日志功能

像素格式说明

格式

说明

字节/像素

用途

RGB565

16位RGB

2

显示、预览

RGB888

24位RGB

3

高质量图像

YUV422

YUV 4:2:2

2

视频编码

YUV420

YUV 4:2:0

1.5

视频压缩

GRAY

灰度

1

图像处理

JPEG

JPEG压缩

可变

存储、传输

分辨率说明

名称

分辨率

像素数

用途

QQVGA

160x120

19K

低功耗预览

QVGA

320x240

77K

预览、识别

VGA

640x480

307K

标准图像

SVGA

800x600

480K

高清预览

HD

1280x720

922K

高清视频

UXGA

1600x1200

1.92M

高分辨率照片

注意事项

  1. 内存需求

    • QVGA RGB565: ~154KB/帧

    • VGA RGB565: ~614KB/帧

    • 需要预留足够的内存用于帧缓冲区

  2. 帧率

    • 帧率取决于分辨率、像素格式和系统负载

    • 典型值:QVGA 30fps, VGA 15fps

  3. 时钟配置

    • 摄像头通常需要24MHz外部时钟(XCLK)

    • 确保时钟配置正确

  4. I2C通信

    • 传感器通过I2C配置寄存器

    • 确保I2C引脚和上拉电阻正确

  5. DMA传输

    • 建议使用DMA提高传输效率

    • 注意DMA缓冲区对齐要求

  6. 回调函数

    • 回调在中断上下文执行

    • 不要在回调中执行耗时操作

    • 不要在回调中阻塞

故障排查

1. 设备初始化失败

现象lisa_device_get() 返回 NULL 或不就绪

可能原因

  • 设备未在设备树中配置

  • 驱动未使能

  • 引脚配置错误

解决方法

  • 检查 prj.conf 中的配置项

  • 确认设备树配置正确

  • 使用示波器检查XCLK信号

2. 捕获失败

现象lisa_camera_capture() 返回错误

可能原因

  • 摄像头未正确初始化

  • DVP信号连接错误

  • DMA配置问题

解决方法

  • 检查PCLK、VSYNC、HSYNC信号

  • 确认数据线D0-D7连接正确

  • 验证DMA通道配置

3. 图像异常

现象:图像花屏、偏色、条纹

可能原因

  • 时钟极性配置错误

  • 数据对齐问题

  • 内存不足

解决方法

  • 调整 pclk_polarityvsync_polarityhsync_polarity

  • 检查帧缓冲区大小

  • 确保DMA缓冲区地址对齐

参考资料