目录
一、摄像头基础
1.1 OV2640参数
选型时我们需要关注的通用指标是焦距,视场角,拍摄分辨率等信息。另外还需根据硬件板子情况来综合考虑。一般MCU芯片不支持MIPI接口,只能并口接入视频图像,这种情况就只能选择OV2640这种并口输出的sensor。ARM芯片一般都支持MIPI接口这时可以考虑性能更高的sensor,比如OV5640,OV2710。此外还需根据嵌入式板子的硬件供电情况来综合考虑。如下是OV2710的通用技术指标:
1.2 视场角与镜头
二、OV2640驱动
如下只是实例代码,完整代码请点此处下载
#include "fsl_ov2640.h"
#include "ov2640cfg.h"
#include "ov2640_jpeg.h"
#include "fsl_common.h"
#include "board.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define OV2640_SCCB_ADDR (0x60>>1)
#define OV2640_REVISION 0x2642U
status_t OV2640_WriteReg(uint8_t reg, uint8_t val)
{
uint8_t i = 0;
status_t WriteStatus = 0;
for( i = 0 ;i < 3; i++ )
{
WriteStatus = BOARD_Camera_I2C_SendSCCB(OV2640_SCCB_ADDR, reg, kSCCB_RegAddr8Bit, &val, 1);
if( WriteStatus == kStatus_Success)
break;
else
rt_kprintf("WriteStatus = %d\r\n",WriteStatus);
}
return WriteStatus;
}
status_t OV2640_ReadReg(uint8_t reg, uint8_t *val)
{
return BOARD_Camera_I2C_ReceiveSCCB(OV2640_SCCB_ADDR, reg, kSCCB_RegAddr8Bit, val, 1);
}
typedef struct _ov2640_reg
{
uint8_t reg;
uint8_t val;
} ov2640_reg_t;
/*******************************************************************************
* Prototypes
******************************************************************************/
//OV2640切换为JPEG模式
void OV2640_JPEG_Mode( void);
//OV2640切换为RGB565模式
void OV2640_RGB565_Mode( void);
void OV2640_RegSet( uint8_t mode);
/*******************************************************************************
* Variables
******************************************************************************/
static const ov2640_reg_t ov2640_RA_DLMT_Regs[] = {
{OV2640_DSP_RA_DLMT, 0x01},
{OV2640_COM7_REG, 0x80}
};
/*******************************************************************************
* Code
******************************************************************************/
static void OV2640_DelayMs(uint32_t ms)
{
VIDEO_DelayMs(ms);
}
static status_t OV2640_WriteRegs(const ov2640_reg_t regs[], uint32_t num)
{
status_t status = kStatus_Success;
for (uint32_t i = 0; i < num; i++)
{
status = OV2640_WriteReg(regs[i].reg, regs[i].val);
if (kStatus_Success != status)
{
break;
}
}
return status;
}
static status_t OV2640_SoftwareReset(void)
{
return OV2640_WriteReg(OV2640_COM7_REG, 0x80);
}
void ov2640_jpg_rgb565_set(void);
void ov2640_jpg_photo_set(void);
status_t OV2640_Reg_Init(uint8_t mode)//0--rgb565 1--photo
{
status_t status;
uint8_t pid = 0U, ver = 0U;
status = OV2640_WriteRegs(ov2640_RA_DLMT_Regs, ARRAY_SIZE(ov2640_RA_DLMT_Regs));
if (kStatus_Success != status)
{
return status;
}
/* Identify the device. */
status = OV2640_ReadReg(OV2640_PID_REG, &pid);//0x0A
if (kStatus_Success != status)
{
return status;
}
status = OV2640_ReadReg(OV2640_VER_REG, &ver);//0x0BU
if (kStatus_Success != status)
{
return status;
}
if (OV2640_REVISION != (((uint32_t)pid << 8U) | (uint32_t)ver))
{
return kStatus_Fail;
}
rt_kprintf("----camera id read ok %d %d\n", ver,rt_tick_get());
rt_kprintf("----camera id read : 0x%x %d\n", (((uint32_t)pid << 8U) | (uint32_t)ver),rt_tick_get());
OV2640_RegSet(mode);//0--rgb565 1--photo
rt_kprintf("----OV2640_Reg_Init ok %d\r\n",rt_tick_get());
return 0;
}
void OV2640_svga_15fps(void)
{
OV2640_WriteReg( 0XFF,0X01);
OV2640_WriteReg( 0X11,0X01);
OV2640_WriteReg(0x12, 0x40);
OV2640_Wr