ov9650Preview实现流程图.doc_第1页
ov9650Preview实现流程图.doc_第2页
ov9650Preview实现流程图.doc_第3页
ov9650Preview实现流程图.doc_第4页
ov9650Preview实现流程图.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

OV9650裸机arm9实现过程具体实现的功能:通过摄像头OV9650采集视频图像,并与arm9的camera interface相连接,把采集到的数据放入内存的某段区域中,将该段区域同时设置成LCD的数据缓存区,这样采集到的数据就可以直接在LCD显示屏上显示了实现该功能主要完成的工作:设置OV9650的内部寄存器(寄存器很多,最好直接网上下载个对应功能的寄存器设置表),Camera Interface的各个寄存器配置,arm9的LCD各个寄存器配置实现流程:(1) 初始化摄像头硬件接口和时钟CamReset(); /摄像软件重启rCLKCON |= (119); / 设置时钟控制寄存器使能Camera,控制HCLK进入Camera块CamPortSet(); /配置各个引脚的功能GPJ和GPGChangeUPllValue(56, 2, 1); / UPLL clock = 96MHz, PLL input 12MHzrCLKDIVN|=(13); /根据UPLL为96MHz设置UCLK为48MHzSetCAMClockDivider(CAMCLK24000000); /设置摄像头时钟为24MHzvoid CamReset(void)rCIGCTRL |= (131); /Camera Interface全局控制寄存器Delay(10);rCIGCTRL &= (131); void CamPortSet(void)save_GPJCON = rGPJCON; /保存GPJ的初始设置save_GPJDAT = rGPJDAT;save_GPJUP = rGPJUP;rGPJCON = 0x2aaaaaa; /配置GPJ的引脚功能,使GPJ0GPJ7为CAMDATA0CAMDATA7rGPJDAT = 0; /GPJ8为CAMPCLK,GPJ9为CAMVSYNC,GPJ10为CAMHREF,GPJ11为CAMCLKOUT,GPJ12为CAMRESETrGPJUP = 0; /将管脚数据初始为0,上拉电阻使能rGPGCON &= (322); /GPG11引脚设置为input功能,而不是EINT19rGPGCON |= 122;rGPGUP |= 111;rGPGDAT &= (111);void ChangeUPllValue(int mdiv,int pdiv,int sdiv)rUPLLCON = (mdiv12) | (pdiv4) | sdiv;void SetCAMClockDivider(int divn) rCAMDIVN = (rCAMDIVN & (0xf)|(14)|(divn); / CAMCLK is divided.(2) 检测OV9650与arm9接上与否,接上则配置OV9650的寄存器Test_OV9650(void) int ret; CamModuleReset(); /重启外接CameraOV9650_init(); /本程序是模拟IIC,所以GPE14、15两个引脚根据程序情况设置为输入输出模式,而非IIC模式printk(Check camera IDn);ret = check_OV9650() ; /通过模拟IIC来读取OV9650摄像头的厂商ID和产品ID的寄存器,来判断是否检测到设备,返回0,则检测到if (ret) printk(Cant find camera!n);return ret;/Uart_Printf(nshentuhongfeng test 11n);printk(Initial Camera now, Please wait several minutes.n);OV9650_config(); /OV9650的寄存器配置,由于OV9650的寄存器很多,一般下载配置表配置就行return 0;static void CamModuleReset(void)/bit 30 is external resetrCIGCTRL |= (130); /external camera reset highDelay(30);rCIGCTRL &= (130); /external camera reset lowDelay(30);void _inline OV9650_init(void)CFG_WRITE(SIO_C); /定义SIO_C为14,SIO_C为15CFG_WRITE(SIO_D);mdelay(10);# define CFG_WRITE(_x) set_gpio_ctrl(_x | GPIO_PULLUP_DIS | GPIO_MODE_OUT) /GPIO_PULLUP_DIS为130,GPIO_MODE_OUT为1UL31static _inline void set_gpio_ctrl(unsigned int gpio)rGPECON &= (3(gpio&0xf)*2); /将GPE14或者GPE15设置为input模式if(gpio&GPIO_MODE_OUT)rGPECON |= 1(gpio&0xf)*2); /如果是GPIO_MODE_OUT,则设置为GPE14或者GPE15为output模式if(gpio&GPIO_PULLUP_DIS)rGPEUP |= 1(gpio&0xf); /应为GPE14、15为漏极开路,所以上拉电阻不用设置,这步不是必须的 elserGPEUP &= (1(gpio&0xf);int _inline check_OV9650(void)int ret = 0;int OV9650_mid = 0;int try_count =0;/2 timestry_again:OV9650_mid = (OV9650_sccb_receivebyte(0x1c) 8); /OV9650的寄存器ox1c和ox1d存放了厂商的ID信息OV9650_mid |= OV9650_sccb_receivebyte(0x1d);/OV9650的厂商ID值0x7FA2(已知的),判断上面读取的ID值是否与已知值相同if (OV9650_mid != OV9650_PRODUCT_ID) if (!try_count+) goto try_again;printk(Invalid manufacture ID (0x%04X). there is no OV9650(0x%04X)n,OV9650_mid, OV9650_PRODUCT_ID);ret = -ENODEV;else printk(OV9650 MACHINE (0x%04X) detected.n, OV9650_mid);/Uart_Printf(nshentuhongfeng test 10n);OV9650_mid=0;/读取OV9650的产品ID的寄存器0x0a和0x0b,该值读取为0x9652(本摄像头)OV9650_mid = (OV9650_sccb_receivebyte(0x0a) 8);OV9650_mid |= OV9650_sccb_receivebyte(0x0b);printk(Product ID is 0x%04xn, OV9650_mid);return ret;void _inline OV9650_config(void)int i;for (i = 0; i 0x80, 0x150x02-0x10, hzh/0x12,0x80,0x11,0x80,0x6a,0x3e,0x3b,0x09,0x13,0xe0,0x01,0x80,0x02,0x80,0x00,0x00,0x10,0x00,0x13,0xe5,0x39,0x43,0x38,0x12,0x37,0x00,0x35,0x91,0x0e,0xa0,0x1e,0x04,0xA8,0x80,0x12,0x40,0x04,0x00,0x0c,0x04,0x0d,0x80,0x18,0xc6,0x17,0x26,0x32,0xad,0x03,0x00,0x1a,0x3d,0x19,0x01,0x3f,0xa6,0x14,0x2e,0x15,0x10,0x41,0x02,0x42,0x08,0x1b,0x00,0x16,0x06,0x33,0xe2,0x34,0xbf,0x96,0x04,0x3a,0x00,0x8e,0x00,0x3c,0x77,0x8B,0x06,0x94,0x88,0x95,0x88,0x40,0xc1,0x29,0x3f,0x0f,0x42,0x3d,0x92,0x69,0x40,0x5C,0xb9,0x5D,0x96,0x5E,0x10,0x59,0xc0,0x5A,0xaf,0x5B,0x55,0x43,0xf0,0x44,0x10,0x45,0x68,0x46,0x96,0x47,0x60,0x48,0x80,0x5F,0xe0,0x60,0x8c,0x61,0x20,0xa5,0xd9,0xa4,0x74,0x8d,0x02,0x13,0xe7,0x4f,0x3a,0x50,0x3d,0x51,0x03,0x52,0x12,0x53,0x26,0x54,0x38,0x55,0x40,0x56,0x40,0x57,0x40,0x58,0x0d,0x8C,0x23,0x3E,0x02,0xa9,0xb8,0xaa,0x92,0xab,0x0a,0x8f,0xdf,0x90,0x00,0x91,0x00,0x9f,0x00,0xa0,0x00,0x3A,0x01,0x24,0x70,0x25,0x64,0x26,0xc3,0x2a,0x00,0x2b,0x00,0x6c,0x40,0x6d,0x30,0x6e,0x4b,0x6f,0x60,0x70,0x70,0x71,0x70,0x72,0x70,0x73,0x70,0x74,0x60,0x75,0x60,0x76,0x50,0x77,0x48,0x78,0x3a,0x79,0x2e,0x7a,0x28,0x7b,0x22,0x7c,0x04,0x7d,0x07,0x7e,0x10,0x7f,0x28,0x80,0x36,0x81,0x44,0x82,0x52,0x83,0x60,0x84,0x6c,0x85,0x78,0x86,0x8c,0x87,0x9e,0x88,0xbb,0x89,0xd2,0x8a,0xe6,/0x15, 0x12,/ PCLK reverse;#define OV9650_REGS (sizeof(ov9650_reg)/sizeof(ov9650_reg0)#endif /* _TQ2440_OV9650_H_ */由前面的(1)(2)两部分,我们已经把外围摄像头内部的寄存器初始化了,并设置了相应的管脚和时钟。i = Test_OV9650();if( i )Uart_Printf(nTest is failed!n);return ;Uart_Printf(Initializing end.n);(3)初始化LCD和Camera Interface的相应寄存器Test_CamPreview()Uart_Printf(nNow Start Camera Previewn);/camera global variablescamTestMode=CAM_TEST_MODE_PVIEW; /CAM_TEST_MODE_PVIEW为10 CAM_TEST_MODE_CODEC为11 camCodecCaptureCount=0;camPviewCaptureCount=0;camPviewStatus=CAM_STOPPED; /CAM_STOPPED为3camCodecStatus=CAM_STOPPED;flagCaptured_P=0;Lcd_Init();Lcd_PowerEnable(0, 1);Lcd_EnvidOnOff(1);/turn on vedioUart_Printf( preview sc control = %xn , rCIPRSCCTRL ) ;/rCIPRSCCTRL为0,因为寄存器的默认初始值为0CamInit(320, 240, 320, 240, 100, 100, CAM_FRAMEBUFFER_C, CAM_FRAMEBUFFER_P);Uart_Printf(preview sc control = %xn, rCIPRSCCTRL);rSUBSRCPND |= BIT_SUB_CAM_C|BIT_SUB_CAM_P;/中断开启ClearPending(BIT_CAM);pISR_CAM = (U32)CamIsr; /摄像接口中断服务程序 CamPreviewIntUnmask(); /未屏蔽BIT_SUB_CAM_P和BIT_CAM的中断,其他都屏蔽了,所以BIT_SUB_CAM_C中断不响应CamCaptureStart(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT); /CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT为129/CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT为130 ,开启预览视频Uart_Printf(Press ESC key to exit!n);while (1)if (flagCaptured_P)flagCaptured_P = 0;Uart_Printf(nEnter Cam A port, count = %dn,camPviewCaptureCount);if ( Uart_GetKey() = ESC_KEY ) break;CamCaptureStop();/设置标志camCodecStatus=CAM_STOP_ISSUED;camPviewStatus=CAM_STOP_ISSUEDvoid Lcd_PowerEnable(int invpwren,int pwren)/GPG4 is setted as LCD_PWRENrGPGUP=rGPGUP&(14)|(14); / Pull-up disablerGPGCON=rGPGCON&(38)|(38); /GPG4=LCD_PWRENrGPGDAT = rGPGDAT | (14) ; /开电源/invpwren=pwren;/Enable LCD POWER ENABLE FunctionrLCDCON5=rLCDCON5&(13)|(pwren3); / LCD输出信号电源使能rLCDCON5=rLCDCON5&(15)|(invpwren5); / INVPWREN(指出电源使能信号的极性)void Lcd_EnvidOnOff(int onoff)if(onoff=1)rLCDCON1|=1; / ENVID=ON 使能LCD输出和LCD控制信号elserLCDCON1 =rLCDCON1 & 0x3fffe; / ENVID Off 无效LCD输出和LCD控制信号void Lcd_Init(void)rGPCUP = 0x00000000; /上拉电阻使能rGPCCON = 0xaaaa02a9; /GPC0Output,GPC1VCLK,GPC2VLINE,GPC3input,GPC4VM,GPC5LCD_LPCOE /GPC6LCD_LPCREV,GPC7LCD_LPCREVB,GPC8-15VD0-7 rGPDUP = 0x00000000;rGPDCON=0xaaaaaaaa; /Initialize VD23:8rLCDCON1=(CLKVAL_TFT8)|(MVAL_USED7)|(35)|(121)|0; /CLKVAL_TFT为6,VCLK=HCLK/(CLKVAL*2),MVAL_USED为0即每帧触发, / TFT LCD panel,16bpp(每/像素) TFT,视频输出和信号控制无效 rLCDCON2=(VBPD24)|(LINEVAL_TFT14)|(VFPD6)|(VSPW);/*TFT:垂直后沿(VBPD)指在一帧开始时,垂直同步时期之后非活动行的数目12。LINEVAL_TFT决定LCD屏的垂直尺寸240-1。垂直前沿指在一帧结束时,垂直同步时期后非活动行的数目4。通过对非活动行的计数,垂直同步脉冲宽度5决定着VSYNC脉冲高电平宽度。*/rLCDCON3=(HBPD19)|(HOZVAL_TFT8)|(HFPD);/*TFT水平后沿(HBPD)为HSYNC下降沿后于有效数据之前VCLK的周期数目22。HOZVAL_TFT决定着LCD屏水平尺寸320-1,HOZVAL_TFT必须被指定以满足一行有4n个字节的条件。水平前言(HFPD)为有效数据之后与HSYNC上升沿前VCLK的周期数目33。*/rLCDCON4=(MVAL8)|(HSPW);/通过对VCLK的计数水平同步脉冲宽度决定着HSYNC脉高电平脉冲的宽度44rLCDCON5 = (111) | (010) | (19) | (18) | (07) | (06) | (13) |(BSWP22)1);/29:21指明在系统内存中视频缓冲区的位置A30:22/LCDBASEU 20:0指示帧缓存区的开始地址A21:1,M5D(X)为得到X的低21位(如果为双扫描,则指示上帧缓冲区的开始地址rLCDSADDR2=M5D( (U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2)1 );/对于双扫描LCD,这些位指示下帧存储器区的开始地址A21:1/对于单扫描LCD,这些位指示帧存储区的末地址A21:1/LCDBASEL=(the frame end address)1)+1=LCDBASEU+(PAGEWIDTH+OFFSIZE)*(LINEVAL+1)rLCDSADDR3=(SCR_XSIZE_TFT-LCD_XSIZE_TFT)/1)11)|(LCD_XSIZE_TFT/1);/虚拟屏地址设置/虚拟屏的偏移尺寸0(半字的整数倍)/虚拟屏的页宽320rLCDINTMSK|=(3); / 屏蔽LCD帧同步中断,屏蔽LCD FIFO中断rTCONSEL &= (7) ; / 选择sync模式,选择输出分辨率类型为320*240,LPC3600无效rTPAL=0; / Disable Temp Palette (根据手册应该是0=PrDstWidth) ScaleUp_H_Pr=0; /downelse ScaleUp_H_Pr=1;/upif(SrcHeight=PrDstHeight) ScaleUp_V_Pr=0; / edited 040225else ScaleUp_V_Pr=1;/ common control settingrCIGCTRL |= (126)|(027); / inverse PCLK, test pattern/rCIGCTRL |= (026)|(027); / dont inverse PCLK, test patternrCIWDOFST = (130)|(0xf12); / clear overflow rCIWDOFST = 0; /窗口垂直偏移为0rCIWDOFST=(WinOfsEn31)|(WinHorOffset16)|(WinVerOffset); /窗口偏移使能,水平偏移为100,垂直偏移为100rCISRCFMT=(CAM_ITU60131)|(030)|(029)|(CAM_SRC_HSIZE16)|(CAM_ORDER_YCBYCR14)|(CAM_SRC_VSIZE);/输入源格式寄存器/ITU-R BT.601YCbCr8位模式使能 Cb,Cr值移位控制 +0(正常使用) 保留位必须设置为0/源水平像素值(必须为8的整数倍)640 输入YCbCr顺序信息对于输入的8位模式 YCbYCr 源垂直像素值480/rCISRCFMT=(CAM_ITU60131)|(130)|(029)|(CAM_SRC_HSIZE16)|(CAM_ORDER_YCBYCR14)|(CAM_SRC_VSIZE);/30位设置为1后,图像颜色失真,偏彩色/ preview port settingif (CAM_PVIEW_4PP) / codec view mode CAM_PVIEW_4PP为0rCIPRCLRSA1=PrFrameBuffer; rCIPRCLRSA2=rCIPRCLRSA1+PrDstWidth*PrDstHeight*multiplier;rCIPRCLRSA3=rCIPRCLRSA2+PrDstWidth*PrDstHeight*multiplier;rCIPRCLRSA4=rCIPRCLRSA3+PrDstWidth*PrDstHeight*multiplier;else / direct preview moderCIPRCLRSA1 = (U32)LCD_BUFFER; /rCIPRCLRSA1为RGB第一帧开始地址对于预览DMArCIPRCLRSA2 = (U32)LCD_BUFFER;rCIPRCLRSA3 = (U32)LCD_BUFFER;rCIPRCLRSA4 = (U32)LCD_BUFFER;Uart_Printf(n rCIPRCLRSA1 ADDRESS is 0x%xn,rCIPRCLRSA1); /地址值位0x3006ea9c,可能每次启动会稍许变化rCIPRTRGFMT=(PrDstWidth16)|(CAM_FLIP_18014)|(PrDstHeight);/目标图像格式对于预览DMA/水平像素数对于目标图像预览DMA(偶数)320 旋转120度 垂直像素数对于目标图像预览DMAif (CAM_PVIEW_OUTPUT=CAM_RGB24B)CalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);else / RGB16BCalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);/这里乘以2,是为了和上面用同一公式,没有具体意义 rCIPRCTRL=(MainBurstSizeRGB19)|(RemainedBurstSizeRGB14);/根据计算值配置预览DMA控制相关寄存器CalculatePrescalerRatioShift(SrcWidth, PrDstWidth, &PreHorRatio, &H_Shift);CalculatePrescalerRatioShift(SrcHeight, PrDstHeight, &PreVerRatio, &V_Shift);MainHorRatio=(SrcWidth8)/(PrDstWidthH_Shift);MainVerRatio=(SrcHeight8)/(PrDstHeightV_Shift);rCIPRSCPRERATIO=(10-H_Shift-V_Shift)28)|(PreHorRatio16)|(PreVerRatio);/根据计算配置预览比例控制寄存器 rCIPRSCPREDST=(SrcWidth/PreHorRatio)16)|(SrcHeight/PreVerRatio); /预览比例的目标格式:预览比例的目标宽度和高度rCIPRSCCTRL=(131)|(CAM_PVIEW_OUTPUT30)|(ScaleUp_H_Pr29)|(ScaleUp_V_Pr28)|(MainHorRatio16)|(MainVerRatio); /预览主比例的主控制寄存器 /采样方式对于格式转换(推介为1) 16bitRGB Scale dowm flag for preview scaler /水平比率对于主预览比例 垂直比率对于主预览比例 rCIPRTAREA= PrDstWidth*PrDstHeight; /预览计数器目标区域即预览DMA的目标区域_inline void ClearPending(int bit)register i;rSRCPND = bit;rINTPND = bit;i = rINTPND;void CamPreviewIntUnmask(void) rINTSUBMSK &= (BIT_SUB_C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论