ov9650Preview實(shí)現(xiàn)流程圖.doc_第1頁(yè)
ov9650Preview實(shí)現(xiàn)流程圖.doc_第2頁(yè)
ov9650Preview實(shí)現(xiàn)流程圖.doc_第3頁(yè)
ov9650Preview實(shí)現(xiàn)流程圖.doc_第4頁(yè)
ov9650Preview實(shí)現(xiàn)流程圖.doc_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

OV9650裸機(jī)arm9實(shí)現(xiàn)過程具體實(shí)現(xiàn)的功能:通過攝像頭OV9650采集視頻圖像,并與arm9的camera interface相連接,把采集到的數(shù)據(jù)放入內(nèi)存的某段區(qū)域中,將該段區(qū)域同時(shí)設(shè)置成LCD的數(shù)據(jù)緩存區(qū),這樣采集到的數(shù)據(jù)就可以直接在LCD顯示屏上顯示了實(shí)現(xiàn)該功能主要完成的工作:設(shè)置OV9650的內(nèi)部寄存器(寄存器很多,最好直接網(wǎng)上下載個(gè)對(duì)應(yīng)功能的寄存器設(shè)置表),Camera Interface的各個(gè)寄存器配置,arm9的LCD各個(gè)寄存器配置實(shí)現(xiàn)流程:(1) 初始化攝像頭硬件接口和時(shí)鐘CamReset(); /攝像軟件重啟rCLKCON |= (119); / 設(shè)置時(shí)鐘控制寄存器使能Camera,控制HCLK進(jìn)入Camera塊CamPortSet(); /配置各個(gè)引腳的功能GPJ和GPGChangeUPllValue(56, 2, 1); / UPLL clock = 96MHz, PLL input 12MHzrCLKDIVN|=(13); /根據(jù)UPLL為96MHz設(shè)置UCLK為48MHzSetCAMClockDivider(CAMCLK24000000); /設(shè)置攝像頭時(shí)鐘為24MHzvoid CamReset(void)rCIGCTRL |= (131); /Camera Interface全局控制寄存器Delay(10);rCIGCTRL &= (131); void CamPortSet(void)save_GPJCON = rGPJCON; /保存GPJ的初始設(shè)置save_GPJDAT = rGPJDAT;save_GPJUP = rGPJUP;rGPJCON = 0x2aaaaaa; /配置GPJ的引腳功能,使GPJ0GPJ7為CAMDATA0CAMDATA7rGPJDAT = 0; /GPJ8為CAMPCLK,GPJ9為CAMVSYNC,GPJ10為CAMHREF,GPJ11為CAMCLKOUT,GPJ12為CAMRESETrGPJUP = 0; /將管腳數(shù)據(jù)初始為0,上拉電阻使能rGPGCON &= (322); /GPG11引腳設(shè)置為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) 檢測(cè)OV9650與arm9接上與否,接上則配置OV9650的寄存器Test_OV9650(void) int ret; CamModuleReset(); /重啟外接CameraOV9650_init(); /本程序是模擬IIC,所以GPE14、15兩個(gè)引腳根據(jù)程序情況設(shè)置為輸入輸出模式,而非IIC模式printk(Check camera IDn);ret = check_OV9650() ; /通過模擬IIC來讀取OV9650攝像頭的廠商ID和產(chǎn)品ID的寄存器,來判斷是否檢測(cè)到設(shè)備,返回0,則檢測(cè)到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設(shè)置為input模式if(gpio&GPIO_MODE_OUT)rGPECON |= 1(gpio&0xf)*2); /如果是GPIO_MODE_OUT,則設(shè)置為GPE14或者GPE15為output模式if(gpio&GPIO_PULLUP_DIS)rGPEUP |= 1(gpio&0xf); /應(yīng)為GPE14、15為漏極開路,所以上拉電阻不用設(shè)置,這步不是必須的 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的產(chǎn)品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)兩部分,我們已經(jīng)把外圍攝像頭內(nèi)部的寄存器初始化了,并設(shè)置了相應(yīng)的管腳和時(shí)鐘。i = Test_OV9650();if( i )Uart_Printf(nTest is failed!n);return ;Uart_Printf(Initializing end.n);(3)初始化LCD和Camera Interface的相應(yīng)寄存器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,因?yàn)榧拇嫫鞯哪J(rèn)初始值為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; /攝像接口中斷服務(wù)程序 CamPreviewIntUnmask(); /未屏蔽BIT_SUB_CAM_P和BIT_CAM的中斷,其他都屏蔽了,所以BIT_SUB_CAM_C中斷不響應(yīng)CamCaptureStart(CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT); /CAM_PVIEW_SCALER_CAPTURE_ENABLE_BIT為129/CAM_CODEC_SCALER_CAPTURE_ENABLE_BIT為130 ,開啟預(yù)覽視頻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();/設(shè)置標(biāo)志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輸出信號(hào)電源使能rLCDCON5=rLCDCON5&(15)|(invpwren5); / INVPWREN(指出電源使能信號(hào)的極性)void Lcd_EnvidOnOff(int onoff)if(onoff=1)rLCDCON1|=1; / ENVID=ON 使能LCD輸出和LCD控制信號(hào)elserLCDCON1 =rLCDCON1 & 0x3fffe; / ENVID Off 無(wú)效LCD輸出和LCD控制信號(hào)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即每幀觸發(fā), / TFT LCD panel,16bpp(每/像素) TFT,視頻輸出和信號(hào)控制無(wú)效 rLCDCON2=(VBPD24)|(LINEVAL_TFT14)|(VFPD6)|(VSPW);/*TFT:垂直后沿(VBPD)指在一幀開始時(shí),垂直同步時(shí)期之后非活動(dòng)行的數(shù)目12。LINEVAL_TFT決定LCD屏的垂直尺寸240-1。垂直前沿指在一幀結(jié)束時(shí),垂直同步時(shí)期后非活動(dòng)行的數(shù)目4。通過對(duì)非活動(dòng)行的計(jì)數(shù),垂直同步脈沖寬度5決定著VSYNC脈沖高電平寬度。*/rLCDCON3=(HBPD19)|(HOZVAL_TFT8)|(HFPD);/*TFT水平后沿(HBPD)為HSYNC下降沿后于有效數(shù)據(jù)之前VCLK的周期數(shù)目22。HOZVAL_TFT決定著LCD屏水平尺寸320-1,HOZVAL_TFT必須被指定以滿足一行有4n個(gè)字節(jié)的條件。水平前言(HFPD)為有效數(shù)據(jù)之后與HSYNC上升沿前VCLK的周期數(shù)目33。*/rLCDCON4=(MVAL8)|(HSPW);/通過對(duì)VCLK的計(jì)數(shù)水平同步脈沖寬度決定著HSYNC脈高電平脈沖的寬度44rLCDCON5 = (111) | (010) | (19) | (18) | (07) | (06) | (13) |(BSWP22)1);/29:21指明在系統(tǒng)內(nèi)存中視頻緩沖區(qū)的位置A30:22/LCDBASEU 20:0指示幀緩存區(qū)的開始地址A21:1,M5D(X)為得到X的低21位(如果為雙掃描,則指示上幀緩沖區(qū)的開始地址rLCDSADDR2=M5D( (U32)LCD_BUFFER+(SCR_XSIZE_TFT*LCD_YSIZE_TFT*2)1 );/對(duì)于雙掃描LCD,這些位指示下幀存儲(chǔ)器區(qū)的開始地址A21:1/對(duì)于單掃描LCD,這些位指示幀存儲(chǔ)區(qū)的末地址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);/虛擬屏地址設(shè)置/虛擬屏的偏移尺寸0(半字的整數(shù)倍)/虛擬屏的頁(yè)寬320rLCDINTMSK|=(3); / 屏蔽LCD幀同步中斷,屏蔽LCD FIFO中斷rTCONSEL &= (7) ; / 選擇sync模式,選擇輸出分辨率類型為320*240,LPC3600無(wú)效rTPAL=0; / Disable Temp Palette (根據(jù)手冊(cè)應(yīng)該是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(正常使用) 保留位必須設(shè)置為0/源水平像素值(必須為8的整數(shù)倍)640 輸入YCbCr順序信息對(duì)于輸入的8位模式 YCbYCr 源垂直像素值480/rCISRCFMT=(CAM_ITU60131)|(130)|(029)|(CAM_SRC_HSIZE16)|(CAM_ORDER_YCBYCR14)|(CAM_SRC_VSIZE);/30位設(shè)置為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第一幀開始地址對(duì)于預(yù)覽DMArCIPRCLRSA2 = (U32)LCD_BUFFER;rCIPRCLRSA3 = (U32)LCD_BUFFER;rCIPRCLRSA4 = (U32)LCD_BUFFER;Uart_Printf(n rCIPRCLRSA1 ADDRESS is 0x%xn,rCIPRCLRSA1); /地址值位0x3006ea9c,可能每次啟動(dòng)會(huì)稍許變化rCIPRTRGFMT=(PrDstWidth16)|(CAM_FLIP_18014)|(PrDstHeight);/目標(biāo)圖像格式對(duì)于預(yù)覽DMA/水平像素?cái)?shù)對(duì)于目標(biāo)圖像預(yù)覽DMA(偶數(shù))320 旋轉(zhuǎn)120度 垂直像素?cái)?shù)對(duì)于目標(biāo)圖像預(yù)覽DMAif (CAM_PVIEW_OUTPUT=CAM_RGB24B)CalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);else / RGB16BCalculateBurstSize(PrDstWidth*2, &MainBurstSizeRGB, &RemainedBurstSizeRGB);/這里乘以2,是為了和上面用同一公式,沒有具體意義 rCIPRCTRL=(MainBurstSizeRGB19)|(RemainedBurstSizeRGB14);/根據(jù)計(jì)算值配置預(yù)覽DMA控制相關(guān)寄存器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);/根據(jù)計(jì)算配置預(yù)覽比例控制寄存器 rCIPRSCPREDST=(SrcWidth/PreHorRatio)16)|(SrcHeight/PreVerRatio); /預(yù)覽比例的目標(biāo)格式:預(yù)覽比例的目標(biāo)寬度和高度rCIPRSCCTRL=(131

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論