s3c2440的攝像介面應用

2021-06-21 14:43:49 字數 4287 閱讀 1905

s3c2440提供了乙個攝像介面,使開發人員很容易地實現攝像、照相等功能。攝像介面包括8位來自攝像頭的輸入資料訊號,乙個輸出主時鐘訊號,三個來自攝像頭的輸入同步時鐘訊號和乙個輸出復位訊號。攝像介面的主時鐘訊號由usb pll產生,它的頻率為96mhz,再經過分頻處理後輸出給攝像頭,攝像頭再根據該時鐘訊號產生三個同步時鐘訊號(畫素時鐘、幀同步時鐘和行同步時鐘),反過來再輸入回s3c2440。

s3c2440僅僅提供了乙個攝像介面,因此要實現其功能,還需要攝像頭。在這裡,我們使用ov9650。ov9650內部有大量的暫存器需要配置,這就需要另外的資料介面。ov9650的資料介面稱為sccb(序列攝像控制匯流排),它由兩條資料線組成:乙個是用於傳輸時鐘訊號的sio_c,另乙個是用於傳輸資料訊號的sio_d。sccb的傳輸協議與iic的極其相似,只不過iic在每傳輸完乙個位元組後,接收資料的一方要傳送一位的確認資料,而sccb一次要傳輸9位資料,前8位為有用資料,而第9位資料在寫週期中是don』t-care位(即不必關心位),在讀週期中是na位。sccb定義資料傳輸的基本單元為相(phase),即乙個相傳輸乙個位元組資料。sccb只包括三種傳輸週期,即3相寫傳輸週期(三個相依次為裝置從位址,記憶體位址,所寫資料),2相寫傳輸週期(兩個相依次為裝置從位址,記憶體位址)和2相讀傳輸週期(兩個相依次為裝置從位址,所讀資料)。當需要寫操作時,應用3相寫傳輸週期,當需要讀操作時,依次應用2相寫傳輸週期和2相讀傳輸週期。因此sccb一次只能讀或寫乙個位元組。下面我們就用s3c2440的iic匯流排介面分別與ov9650的sio_c和sio_d相連線來實現sccb的功能。具體的讀、寫函式為:

//配置iic介面

rgpeup = 0xc000;               //上拉無效

rgpecon = 0xa0000000;            //gpe15:iicsda,gpe14:iicscl 

//iic中斷

void __irq iicisr(void)

//寫操作

//輸入引數分別為要寫入的記憶體位址和資料

void wr_sccb(unsigned char wordaddr, unsigned char data)

//讀操作

//引數分別為要讀取的記憶體位址和資料

void rd_sccb (unsigned char wordaddr,unsigned char *data)

當然我們也可以用兩個通用io口來模擬sccb匯流排,下面我們給出具體的程式,其中gpe15為sio_d,gpe14為sio_c。

#define clock_low()              (rgpedat&=(~(1<<14)))           //時鐘訊號低

#define clock_high()             (rgpedat|=(1<<14))                  //時鐘訊號高

#define data_low()                 (rgpedat&=(~(1<<15)))           //資料訊號低

#define data_high()                (rgpedat|=(1<<15))                  //資料訊號高

//配置io

rgpeup = 0xc000;               //上拉無效

rgpecon = 5<<28;             //gpe15為sio_d,gpe14為sio_c,都為輸出

void delay(int a)

//啟動sccb

void __inline sccb_start(void)

//結束sccb

void __inline sccb_end(void)

//sccb傳送乙個位元組

void __inline sccb_sendbyte(unsigned char data)

//第9位,don』t care

data_high();

delay(10);

clock_high();

delay(10);

clock_low();

delay(10);

}// sccb接收乙個位元組

void __inline sccb_receivebyte(unsigned char *data)

rgpecon =5<<28;              //再把gpe15改回為輸出

//第9位,n.a.

data_high();

delay(10);

clock_high();

delay(10);

clock_low();

delay(10);

*data = pvalue &0xff;   

}//寫操作

void sccb_senddata(unsigned char subaddr, unsigned char data)

//讀操作

unsigned char sccb_receivedata(unsigned char subaddr)

ov9650的暫存器較多,要想配置好這些暫存器是需要花費一些精力的。下面陣列給出了乙個vga(640×480)模式下yuv彩色空間的配置例子,括號內第乙個元素表示暫存器位址,第二個元素表示要寫入的資料。

const unsigned char ov9650_register[ ][2] = ,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,,,,,,

,,,};

另外ov9650有兩個唯讀暫存器——0x1c和0x1d,用於存放廠家id,資料分別為0x7f和0xa2,我們可以通過讀取它們來判斷s3c2440是否連線了ov9650。當確認連線了ov9650後,我們就可以把上面的那個陣列寫入ov9650內,如下所示。在這裡我們總是認為s3c2440連線了ov9650。

void config_ov9650(void)

i=1;

while(i)

//復位所有ov9650暫存器

sccb_senddata(0x12,0x80);               //或wr_sccb (0x12,0x80);

delay(10000);

//配置ov9650暫存器

for(i=0;i<((sizeof(ov9650_register))/2);i++)

}上面程式中,我們是用迴圈語句讀取ov9650的暫存器0x1c和0x1d的,之所以這樣,是為了防止只讀取一次時,會有讀取不正確的現象發生。而一旦正確讀取了廠商id資訊,再讀寫ov9650暫存器,一般就不會發生讀寫的錯誤。

……   ……

int com;

……   ……

//計算主突發長度和剩餘突發長度,用於ciprctrl暫存器

void calculateburstsize(u32 hsize,u32 *mainburstsize,u32 *remainedburstsize)

break;

}                                        

}//計算預縮放比率及移位量,用於cicoscpreratio暫存器

void calculateprescalerratioshift(u32 srcsize, u32 dstsize, u32 *ratio,u32 *shift)

else if(srcsize>=32*dstsize)

else if(srcsize>=16*dstsize)

else if(srcsize>=8*dstsize)

else if(srcsize>=4*dstsize)

else if(srcsize>=2*dstsize)

else         

}//攝像介面初始化

//輸入引數分別為預覽目標寬和高(即lcd尺寸),以及水平和垂直偏移量

void caminit(u32 prdstwidth, u32 prdstheight, u32 winhoroffset, u32 winveroffset)

//攝像中斷,在這裡,除了清中斷標誌,沒有其他操作

void __irq camisr(void)

//uart中斷

void __irq uartisr(void)

rutxh0 = ch;

}void main(void)}}

原文出處:

s3c2440的A D轉換應用

10 地點 cmos adc 模 數字轉換器 是 8 通道模擬輸入型裝置 該模擬輸入訊號轉換 10 位二進位制數字編碼,a d變化。也被稱為模數轉換。該模擬訊號被轉換成美元 算機可以處理的數碼訊號。對於s3c2440來說。實現a d轉換比較簡單,主要做的事情就是 adc 控制暫存器 adccon 和...

求教 s3c2440問題

趙老師您好,我把您的程式新增到我的程式中去了,下面是主要 1 main函式 int main void a a b rgpbdat liushui delay 20 liushui liushui 0xffe 2 pwm初始化 void pwm init void 3 定時器中斷 static vo...

s3c2440系統時鐘

1 flck hclk和pclk的關係 一般來說,mcu的主時鐘源主要是外部晶振或外部時鐘,而用的最多的是外部晶振。在正確情況下,系統內所使用的時鐘都是外部時鐘源經過一定的處理得到的。由於外部時鐘源的頻率一般不能滿足系統所需要的高頻條件,所以往往需要pll 鎖相環 進行倍頻處理。在s3c2440中,...