将 ov5642
摄像头添加到 sensor
中
通讯接口
sccb
接口,该接口与i2c
相差不大,用于配置摄像头寄存器。dvp
接口,该接口用于传输图像数据。
需要创建的文件
参考其他摄像头,一般为 ov5642.c
(提供 sensor 所需要的接口), ov5642.h
, ov5642_regs.h
(提供 ov5642 的寄存器配置表)
需要准备的资料
- OV5642-DS.pdf(数据手册)
- OV5642_camera_new-module_software_application_notes_1.3_MESADA.pdf(软件应用笔记)
这些资料都可以从官网自行下载
需要实现的方法
- 初始化函数
ov5642_init()
该函数将 sensor
所有方法指向 ov5642
对应方法,用户只需要调用 sensor
即可,实现该函数就是也是最终目标
int ov5642_init(sensor_t *sensor)
{
// Initialize sensor structure.
sensor->gs_bpp = 1;
sensor->reset = reset;
sensor->sleep = sleep;
sensor->read_reg = read_reg;
sensor->write_reg = write_reg;
sensor->set_pixformat = set_pixformat;
// ..............
return 0;
}
- 重置
reset()
该函数在 sensor 初始化后将会调用,此时会配置大量寄存器,用于初始化 ov5642
,寄存器配置具体值可参考应用手册的默认配置。
for (int i=0; OV5642_ovga_30fps_regs[i][0]; i++) {
cambus_writeb(sensor->slv_addr, OV5642_ovga_30fps_regs[i][0], OV5642_ovga_30fps_regs[i][1]); // sccb write
}
-
其他函数均可参考寄存器手册实现
-
向
sensor
中添加ov5642
检测即可完成
// sensor.h
#define OV5640_ID (0x5640)
// sensor.c
int sensro_ov_detect(sensor_t *sensor){
// .............
case OV5642_ID:
mp_printf(&mp_plat_print, "[MAIXPY]: find ov5642\n");
init_ret = ov5642_init(sensor);
break;
// .............
}
遇到的问题
- 图像中间泛绿, 边缘泛红
使能 RawGamma
后解决

cambus_writeb(sensor->slv_addr, 0x5000, 0x6f); //RAW Gamma enable
- 帧率较低
配置以下寄存器,调高时钟速率,时钟速率公式可从 datasheet 中得到:
System clock frequency = PLL input clock x PLL DIVP / PLL DIVS / 4
PLL VCO frequency = PLL input clock x PLL DIVP x PLL SELD5
{0x3011, 0x0e},/*pll divp*/ {0x3012, 0x03},/*pll div*/
- 切换到
RGB565
拍摄一张照片后卡住, 未开启YUVtoRGB
和Dither
, 关于Dither
cambus_writeb(sensor->slv_addr, 0x5002, 0xf8);//R
ov5642
qqvga 格式会出现一小根彩色条纹: 未解决
顺便提一下 ov2640 出现的问题
-
ov2640 边缘暗,中间亮:
lenc
未开启, 开启之后便显示正常, 关于lenc
-
ov2640
图像有噪点: 降低时钟速率后并没有改善, 可能是供电问题