【STM32】OV2640攝像頭學習筆記 轉

【STM32】OV2640攝像頭學習筆記

2019年03月03日 13:01:35 淹死的大白鯊 閱讀數 4736更多

分類專欄: 【STM32】

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/qq_39492932/article/details/88087010

 

目錄:

 

一、OV2640 Camera

  •  OV2640是OmniVision公司生產的一顆1/4寸的CMOS UXGA(1632*1232)圖像傳感器;
  •  支持自動曝光控制、自動增益控制、自動白平衡、自動消除燈光條紋等自動控制功能。
  •  UXGA最高15幀/秒,SVGA可達30幀,CIF可達60幀;
  •  支持圖像壓縮,即可輸出JPEG圖像數據.

基本概念:

  • UXGA,即分辨率位16001200的輸出格式,SXGA(12801024)、XVGA(1280960)、WXGA(1280800)、XGA(1024768)、SVGA(800600)、VGA(640480)、CIF(352288)和QQVGA(160*120);
  • VSYNC,即幀同步信號;
  • HREF /HSYNC,即行同步信號;
  • PCLK,即像素時鐘,一個PCLK時鐘,輸出一個(或半個)像素.
  •  PCLK高達36MHz
    在這裏插入圖片描述
  • 圖像數據在HREF爲高的時候輸出,
  • 當HREF變高後,每一個PCLK時鐘,輸出一個字節數據。
比如我們採用UXGA時序,RGB565格式輸出,每2個字節組成一個像素的顏色(低字節在前,高字節在後)
這樣每行輸出總共有1600*2個PCLK週期,輸出1600*2個字節
  • 1
  • 2

二、讀取OV2640模塊圖像數據過程:

  • 低字節在前,高字節在後

開始等待幀同步信號(VSYNC)HREF是否爲高電平等待第一個PCLK上升沿讀取第一個像素低字節等待第二個PCLK上升沿讀取第一個像素高字節等待第三個PCLK上升沿讀取第二個像素低字節以此循環讀取...............結束yes

三、DCMI(Digital camera interface)接口

  •  DCMI是STM32F4芯片自帶的一個數字攝像頭接口,該接口是一個同步並行接口
  •  支持8位、10位、12位或 14位 CMOS 攝像頭模塊發出的高速數據流;
  •  可支持不同的數據格式:YCbCr4:2:2/RGB565逐行視頻和壓縮數據 (JPEG);
  •  可接收高速(可達 54 MB/s)數據流.

在這裏插入圖片描述

DCMI接口簡介- 初始化流程:

①配置相關引腳的複用功能,使能DCMI時鐘

  • 使能DCMI的時鐘,其次要設置DCMI的相關引腳爲複用

②設置DCMI工作模式及PCLK/HSYNC/VSYNC

  • DCMI接口,使用8位接口,連續模式,設置:PCLK爲上升沿有效, HSYNC和VSYNC爲低電平有效,設置幀中斷(jpeg數據採集用)等參數。

③設置DMA

  • 採用DMA來搬運,設置好DCMI相關參數後,還需要設置DMA,以便採集數據。

④啓動DCMI傳輸

  • 設置DCMI->CR的最低位爲1,即可啓動DCMI捕獲圖像數據

四、SCCB協議

  • SCCB(Serial Camera Control Bus) 串行攝像機控制總線協議
  • 一個基本傳輸單元稱作一個相
    一個相包含總共9比特,前8比特爲數據,第9比特爲 Don’t-Care bit 不關心比特,該第9比特的數據取決於
    傳輸任務是讀還是寫(0代表寫,1代表讀)(可以類比I2C通信協議)
  • 一個傳輸任務的最大相個數是3

在這裏插入圖片描述

1.起始信號

在這裏插入圖片描述

//SCCB起始信號
//當時鍾爲高的時候,數據線的高到低,爲SCCB起始信號
//在激活狀態下,SDA和SCL均爲低電平
void SCCB_Start(void)
{
    SCCB_SDA=1;     //數據線高電平	   
    SCCB_SCL=1;	    //在時鐘線高的時候數據線由高至低
    rt_hw_us_delay(50);  
    SCCB_SDA=0;
    rt_hw_us_delay(50);	 
    SCCB_SCL=0;	    //數據線恢復低電平,單操作函數必要	  
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.停止信號

在這裏插入圖片描述

//SCCB停止信號
//當時鍾爲高的時候,數據線的低到高,爲SCCB停止信號
//空閒狀況下,SDA,SCL均爲高電平
void SCCB_Stop(void)
{
    SCCB_SDA=0;
    rt_hw_us_delay(50);	 
    SCCB_SCL=1;	
    rt_hw_us_delay(50); 
    SCCB_SDA=1;	
    rt_hw_us_delay(50);
} 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

五、OV_Camera 配置

1.復位攝像頭

OV2640_PWDN=0;	//POWER ON
rt_hw_ms_delay(1);
OV2640_RST=0;	//復位OV2640
rt_hw_ms_delay(1);
OV2640_RST=1;	//結束復位 
SCCB_Init();        		//初始化SCCB 的IO口	 
SCCB_WR_Reg(OV2640_DSP_RA_DLMT, 0x01);	//操作sensor寄存器
SCCB_WR_Reg(OV2640_SENSOR_COM7, 0x80);	//軟復位OV2640
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2.讀取攝像頭ID

reg=SCCB_RD_Reg(OV2640_SENSOR_MIDH);	//讀取廠家ID 高八位
reg<<=8;
reg|=SCCB_RD_Reg(OV2640_SENSOR_MIDL);	//讀取廠家ID 低八位
res = reg;
if(reg!=OV2640_MID)
{
		rt_kprintf("MID:%d\r\n",reg);
		return 1;
}
reg=SCCB_RD_Reg(OV2640_SENSOR_PIDH);	//讀取廠家ID 高八位
reg<<=8;
reg|=SCCB_RD_Reg(OV2640_SENSOR_PIDL);	//讀取廠家ID 低八位
if(reg!=OV2640_PID)
{
		rt_kprintf("HID:%d\r\n",reg);
		return 2;
}  
log_i("OV2640 Camera ID:%x %x ",reg,res);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.配置幀率

  •  UXGA最高15幀/秒,SVGA可達30幀,CIF可達60幀;
//這裏採用SVGA
//初始化 OV2640,採用SVGA分辨率(800*600)  fps:30
for(i = 0;i < sizeof(ov2640_sxga_init_reg_tbl)/2;i++)
{
		SCCB_WR_Reg(ov2640_svga_init_reg_tbl[i][0],ov2640_svga_init_reg_tbl[i][1]);
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章