【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]);
}