BSP包中有两个CAP相关的例程,两个例程的区别为获取的图像数据的存储格式不同,planar例程是先存储所有像素点的Y,再存U,再存V。packed例程是每个像素的YVU连续存储。
一、硬件电路
处理器为NUC980DR61Y,封装为64pin,只有CAP0接口,所以Sensor接在处理器的CAP0接口:
硬件连接如下:
CMOS的所需的24MHz工作时钟由处理器PC.3输出。
二、例程修改
1、添加void CAP0_IRQHandler(void)函数
/*------------------------------------------------------------------------------------------*/
/* CAP_IRQHandler */
/*------------------------------------------------------------------------------------------*/
void CAP0_IRQHandler(void)
{uint32_t u32CapInt;u32CapInt = CAP0->INT;if( (u32CapInt & (CAP_INT_VIEN_Msk | CAP_INT_VINTF_Msk )) == (CAP_INT_VIEN_Msk | CAP_INT_VINTF_Msk)){CAP_InterruptHandler();CAP0->INT |= CAP_INT_VINTF_Msk; /* Clear Frame end interrupt */u32EscapeFrame = u32EscapeFrame+1;}if((u32CapInt & (CAP_INT_ADDRMIEN_Msk|CAP_INT_ADDRMINTF_Msk)) == (CAP_INT_ADDRMIEN_Msk|CAP_INT_ADDRMINTF_Msk)){CAP0->INT |= CAP_INT_ADDRMINTF_Msk; /* Clear Address match interrupt */}if ((u32CapInt & (CAP_INT_MEIEN_Msk|CAP_INT_MEINTF_Msk)) == (CAP_INT_MEIEN_Msk|CAP_INT_MEINTF_Msk)){CAP0->INT |= CAP_INT_MEINTF_Msk; /* Clear Memory error interrupt */}if ((u32CapInt & (CAP_INT_MDIEN_Msk|CAP_INT_MDINTF_Msk)) == (CAP_INT_MDIEN_Msk|CAP_INT_MDINTF_Msk)){CAP0->INT |= CAP_INT_MDINTF_Msk; /* Clear Motion Detection interrupt */}CAP0->CTL = CAP0->CTL | CAP_CTL_UPDATE;
}
2、注册IRQ_CAP0中断
sysInstallISR(IRQ_LEVEL_1, IRQ_CAP0, (PVOID)CAP0_IRQHandler);sysSetLocalInterrupt(ENABLE_IRQ);sysEnableInterrupt(IRQ_CAP0);
3、使能时钟
/* Init Engine clock and Sensor clock */CAP_SetFreq(CAP0,48000000,24000000);
4、添加Sensor
例程中包含了三款Sensor的初始化代码,而我们项目中用到的sensor型号没在例程中,所以需要编写Sensor的初始化代码。
修改XXX_SnrReset()函数:
static void XXX_SnrReset(void)
{/* PB4 reset: H->L->H */outpw(REG_SYS_GPB_MFPL,(inpw(REG_SYS_GPB_MFPL) & ~0x000F0000));GPIO_SetMode(PB,1<<4,GPIO_MODE_OUTPUT);PB4=1;Delay(100);PB4=0;Delay(100);PB4=1;
}
例程中所用RESET管脚为PE10,改为PB4。关于GPIO相关的寄存器,参看文档<DS_NUC980_Series_EN_Rev1.24.pdf>。
修改XXX_SnrPowerDown()函数:
static void MT9V024_SnrPowerDown(BOOL bIsEnable)
{/* PB6 power down, HIGH for power down */outpw( REG_SYS_GPB_MFPL,(inpw(REG_SYS_GPB_MFPL) & ~0x0F000000));GPIO_SetMode(PB,1<<6,GPIO_MODE_OUTPUT);PB6=0;if(bIsEnable)PB6=1;elsePB6=0;
}
例程中所用power down管脚为PC0,改为PB6。高电平进入power down模式。
修改I2C SCL和SDA管脚,SCL改为PA1,SDA改为PA0:
SWI2C_Open(eDRVGPIO_GPIOA,eDRVGPIO_PIN1,eDRVGPIO_GPIOA,eDRVGPIO_PIN0,Delay);
根据Sensor的手册修改g_XXX_VGA_RegValue[]寄存器列表。