前言
最近由于公司項目需要,需要做低分辨率(320 * 240 @30fps)DVP接口的特殊攝像頭晶伦,但是主機(jī)沒有DVP接口而芥,最后決定用USB口來轉(zhuǎn)接。由于攝像頭比較特殊耕姊,原始數(shù)據(jù)桶唐,需要做簡單的格式轉(zhuǎn)換和數(shù)據(jù)處理后,才能使用茉兰,不能用一些現(xiàn)成的DVP轉(zhuǎn)USB的IC尤泽,因此方案最終選定為采用STM32F2的DCMI接口(接DVP),然后通過其HS的USB接口轉(zhuǎn)到USB上面规脸。為了讓接口盡量通用坯约,軟件上,要求STM32F2虛擬出一個UVC協(xié)議的攝像頭莫鸭,并可以通過UVC協(xié)議闹丐,配置其工作模式。這樣可以免去了在電腦上開發(fā)USB驅(qū)動的麻煩被因。
資料準(zhǔn)備
由于之前從沒有接觸過STM32F2的USB卿拴,也沒有借出過DCMI接口衫仑,更沒有看過UVC協(xié)議,因此堕花,只能找些現(xiàn)成的資料看看∥挠現(xiàn)在列舉如下:
- 網(wǎng)上現(xiàn)成的別人做的STM32F4上的UVC協(xié)議。https://github.com/iliasam/STM32F4_UVC_Camera.git
- STM32F2 的Reference manual缘挽,這個可以在ST的官網(wǎng)查到如贷。
- STM32F2 的STM32CubeMX相關(guān)軟件。
PS:該軟件非常好用到踏,可以大大簡化STM32上的關(guān)于底層驅(qū)動的工作杠袱,并且提供非常全面的API,會中斷回調(diào)函數(shù)窝稿,基本上不用看寄存器楣富,也不用管中斷,時鐘什么的了伴榔,非常推薦使用N坪!
- OV7670 的DataSheet
- UVC協(xié)議相關(guān)的文檔踪少。這個可以在USB官方網(wǎng)站上下載到塘安,非常必要,且有用援奢。
這么多資料兼犯,不可能開始就全部肯了,看起來需要有技巧集漾∏星基本套路是:
- 先看看別人的例程是否可以跑起來
- 再對照協(xié)議文檔(UVC相關(guān))來理解和嘗試修改別人的代碼。
- 最后根據(jù)自己的項目需求來編寫相關(guān)數(shù)據(jù)處理程序具篇。
工作成果
實(shí)現(xiàn)了讀出OV7670攝像頭(用于測試軟件)的數(shù)據(jù)纬霞,并緩存在隊列中,在USB的DataIn里面發(fā)送出去驱显,并在電腦上诗芜,用攝像頭軟件可以看到攝像頭的內(nèi)容。
測試結(jié)果
- 用軟件模擬產(chǎn)生數(shù)據(jù)埃疫,最大幀率可以做到80fps(數(shù)據(jù)格式為320*240 YUY2伏恐,未壓縮),已經(jīng)是非常快了熔恢,速度約為(98Mbps, USB HS理論值為 480Mbps)脐湾,完全可以滿足我們項目的要求臭笆。STM32F2 USB HS的速度果然不是蓋的叙淌,非吵诱疲快。
- 用Ov7670產(chǎn)生數(shù)據(jù)(由于硬件原因鹰霍,只能獲得最大37fps的幀率闻鉴,數(shù)據(jù)格式為320*240 YUY2,未壓縮)茂洒,電腦上的程序可以正確讀出孟岛,錄像結(jié)果為37fps,和ov7670的幀率一致督勺。
需要的注意事項
- 由于攝像頭數(shù)據(jù)算是比較大了渠羞,而且是持續(xù)性的,為了確保數(shù)據(jù)不丟失智哀,STM32F2的DCMI接口采用了雙緩沖的DMA模式次询,并用軟件做了一個隊列,不停地將雙緩沖結(jié)束后的數(shù)據(jù)壓入隊列瓷叫。這樣便于中間的數(shù)據(jù)處理屯吊。
- STM32F2 的 DCMI,在設(shè)置DMA的時候摹菠,要注意:DMA的外設(shè)地址盒卸,必須為32位,盡管DVP的接口數(shù)據(jù)位寬為8位次氨。DMA的數(shù)據(jù)長度設(shè)置時蔽介,其實(shí)際長度要和位寬匹配。
- 注意UVC的協(xié)議頭煮寡,即UVC Header里面的FID和EOF兩個位屉佳。FID要每次發(fā)送新的幀的時候,進(jìn)行翻轉(zhuǎn)洲押。EOF要當(dāng)前幀的最后一次傳送時置位武花。
- 由于是非壓縮數(shù)據(jù)格式,且為固定幀率杈帐,因此其UVC的頭可以直接采用2個字節(jié)体箕。不要后面的幀時間戳相關(guān)的內(nèi)容。(一般的UVC頭為12個字節(jié))挑童。
- 在USB DATA IN里面累铅,如果DCMI的數(shù)據(jù)沒有準(zhǔn)備好(USB的數(shù)據(jù)帶寬要大于DCMI的帶寬),那么可以發(fā)送空包出去站叼。也可以只發(fā)UVC頭出去娃兽。我測試了一下,WIN10下面的默認(rèn)相機(jī)軟件是都可以正常工作的尽楔。