LISA Camera 摄像头捕获示例
源码位置: samples/drivers/devices/lisa_camera 查看源码
功能说明
本示例演示如何使用 LISA Camera 驱动接口,实现连续捕获图像并通过串口高速发送的功能。主要包括:
设备初始化:初始化摄像头、DVP、I2C、UART等设备。
参数配置:配置摄像头的分辨率、像素格式等参数。
连续捕获:在主循环中连续捕获图像帧。
串口发送:将捕获到的图像数据通过串口(DMA模式,3Mbps)发送出去,可用于上位机显示或分析。
本示例展示了摄像头驱动在实际应用场景中的数据流处理,需要连接摄像头硬件才能正常运行。
硬件连接
摄像头连接
摄像头通过 DVP (Digital Video Port) 接口连接到主控芯片:
信号 |
说明 |
连接 |
|---|---|---|
XCLK |
主时钟输出(24MHz) |
主控→摄像头 |
PCLK |
像素时钟输入 |
摄像头→主控 |
VSYNC |
垂直同步信号 |
摄像头→主控 |
HSYNC |
水平同步信号 |
摄像头→主控 |
D0-D7 |
8位数据总线 |
摄像头→主控 |
SDA |
I2C数据线(传感器配置) |
双向 |
SCL |
I2C时钟线(传感器配置) |
主控→摄像头 |
VCC |
电源(通常3.3V或2.8V) |
- |
GND |
地 |
- |
示例步骤
初始化
uart1设备,配置为 3Mbps 波特率,DMA 传输模式。获取
camera设备句柄并检查设备是否就绪。配置摄像头硬件参数,包括 MCLK、PWDN、I2C 等。
查询并打印摄像头的能力信息(最大分辨率、支持格式等)。
配置并挂载 DVP 总线接口。
启动摄像头。
进入主循环,连续调用
lisa_camera_capture()捕获图像帧。将捕获到的图像帧数据通过
uart1异步发送。释放帧缓冲区,准备下一次捕获。
编译
重要提示:在编译前,请先确认您使用的开发板型号。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 |
说明 |
|---|---|
|
获取设备对象 |
|
检查设备是否就绪 |
|
附加 DVP/SPI 总线接口 |
|
配置摄像头参数(分辨率、格式等) |
|
查询摄像头能力 |
|
启动摄像头 |
|
停止摄像头 |
|
捕获一帧图像 |
|
释放帧缓冲区 |
关键代码
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 |
高分辨率照片 |
注意事项
内存需求:
QVGA RGB565: ~154KB/帧
VGA RGB565: ~614KB/帧
需要预留足够的内存用于帧缓冲区
帧率:
帧率取决于分辨率、像素格式和系统负载
典型值:QVGA 30fps, VGA 15fps
时钟配置:
摄像头通常需要24MHz外部时钟(XCLK)
确保时钟配置正确
I2C通信:
传感器通过I2C配置寄存器
确保I2C引脚和上拉电阻正确
DMA传输:
建议使用DMA提高传输效率
注意DMA缓冲区对齐要求
回调函数:
回调在中断上下文执行
不要在回调中执行耗时操作
不要在回调中阻塞
故障排查
1. 设备初始化失败
现象:lisa_device_get() 返回 NULL 或不就绪
可能原因:
设备未在设备树中配置
驱动未使能
引脚配置错误
解决方法:
检查
prj.conf中的配置项确认设备树配置正确
使用示波器检查XCLK信号
2. 捕获失败
现象:lisa_camera_capture() 返回错误
可能原因:
摄像头未正确初始化
DVP信号连接错误
DMA配置问题
解决方法:
检查PCLK、VSYNC、HSYNC信号
确认数据线D0-D7连接正确
验证DMA通道配置
3. 图像异常
现象:图像花屏、偏色、条纹
可能原因:
时钟极性配置错误
数据对齐问题
内存不足
解决方法:
调整
pclk_polarity、vsync_polarity、hsync_polarity检查帧缓冲区大小
确保DMA缓冲区地址对齐