新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 2440裸機學習心得(下)

        2440裸機學習心得(下)

        作者: 時間:2016-11-29 來源:網絡 收藏
        攝像頭驅動
        一些概念:
        攝像接口的主時鐘信號由USB PLL產生,它的頻率為96MHz,再經過分頻處理后輸出給攝像頭,攝像頭再根據該時鐘信號產生三個同步時鐘信號(像素時鐘、幀同步時鐘和行同步時鐘),反過來再輸入回s3c2440。
        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相讀傳輸周期。(這些讀寫和IIC一樣~)
        OV9650有兩個只讀寄存器——0x1C和0x1D,用于存放廠家ID,數據分別為0x7F和0xA2,我們可以通過讀取它們來判斷s3c2440是否連接了OV9650。當確認連接了OV9650后,我們就可以把VGA(640×480)模式下YUV彩色空間的配置數組寫入OV9650內(二維數組:第一個表示寄存器地址,第二個表示要寫入的數據)
        注意比較三個變量的含義:
        Width = 640 //源寬度
        PrDstWidth =480 //目標寬度
        SrcWidth =640-WinHorOffset*2; //偏移后寬度
        驅動函數編寫步驟:
        外圍基礎準備硬件初始化
        IIC初始化,LCD初始化,UPLL時鐘初始化(96M,0V9650系統時鐘),
        GPIO初始化(GPJ),硬件和軟件復位攝像頭(GPJ12為CAMERARESET,rCIGCTRL)
        0V9650寄存器配置
        A、讀取OV9650廠商ID,驗證是否工作
        B、復位所有OV9650寄存器
        C、配置OV9650寄存器(用規定的二維數組直接配)
        攝像頭接口初始化
        攝像頭接口的一些寄存器初始化:rCIGCTRL,rCIWDOFSTrCISRCFMT
        rCIPRTRGFMT,rCIPRTAREA
        B、設置內存首地址為LCD緩存數組首地址:rCIPRCLRSA1~4
        C、計算水平和垂直縮放比率和位移量,以及主水平、垂直比率
        放入以下三個寄存器中rCIPRSCPRERATIO,rCIPRSCPREDSTrCIPRSCCTRL
        中斷函數開啟和指向
        控制臺菜單的編寫與實現
        顯示視頻
        rCIPRSCCTRL|=(1<<15); //預覽縮放開啟
        rCIIMGCPT =(1<<31)|(1<<29); //預覽縮放捕捉使能
        截圖,定格
        rCIPRSCCTRL &=~(1<<15); //預覽縮放關閉
        rCIIMGCPT &=~((1<<31)|(1<<29)); //預覽縮放捕捉不使能
        視頻定格后,LCD_BUFFER數組就是圖像數據
        放大,縮小
        調節偏移量HOffset,VOffset,每次改變后重新初始化攝像頭接口
        四個額外寫出需注意的函數:
        1、計算主突發長度和剩余突發長度CalculateBurstSize
        2、/計算預縮放比率及移位量CalculatePrescalerRatioShift
        3、中斷函數(只清中斷,不干別的) camera_interrupt
        4、SCCB總線函數的讀寫(像IIC)Rd_SCCB,Wr_SCCB
        網卡驅動
        DM9000的一些基本概念:
        DM9000對外來說只有兩個端口——地址口和數據口,地址口用于輸入內部寄存器的地址,而數據口則完成對某一寄存器的讀寫。DM9000的CMD引腳用來區分這兩個端口,當CMD引腳為0時,DM9000的數據線上傳輸的是寄存器地址,當CMD引腳為1時,傳輸的是讀寫數據。
        我們把DM9000的A8和A9接為高電平,把A4~A7接為低電平,并且把DM9000的AEN接到s3c2440的nGCS4引腳上,則DM9000的端口基址為0x20000300,如果再把DM9000的CMD引腳接到s3c2440的ADDR2引腳上0x20000304(怎么計算?)
        查了一下書,是和存儲控制器有關系,每個nGCSx對應128M地址空間,8個nGCSx對應1G地址。
        nGCS4剛好對應0x20000000開始的地址,但為什么是0x20000300?
        再加上IObase:300
        如果將DM9000的CMD引腳接到s3c2440的ADDR2,由于CMD引腳的高低電平決定地址口和數據口,那么,ADDR2為0時,訪問的
        就是地址口,所以地址口的起始地址為ARRD2為0的情況,即0x20000000;ADDR2為1時,(LADDR3~LADDR0 = 0100)訪問的就是數
        據口,所以數據口的地址即0x20000004。
        如果要寫入DM9000中的某個寄存器,則先把該寄存器的地址賦予DM_ADDR_PORT,然后再把要寫入的數據賦予DM_DATA_PORT即可。讀取DM9000中的某個寄存器也類似。
        DM9000寄存器介紹在數據手冊11頁開始:
        DM9000內部有0x3FF大小的SRAM用于接受和發送數據緩存。在發送或接收數據包之前,數據是暫存在這個SRAM中的。當需要連續發送或接收數據時,我們需要分別把DM9000寄存器MWCMD或MRCMD賦予數據端口,這樣就指定了SRAM中的某個地址,并且在傳輸完一個數據后,指針會指向SRAM中的下一個地址,從而完成了連續訪問數據的目的。
        基于ARP協議的DM9000編寫步驟:
        初始化EINT7中斷,設置中斷函數入口
        因為DM9000的數據中斷引腳INT是連接到s3c2440的外部中斷7引腳上的
        編寫好讀和寫DM9000寄存器函數,用其配置DM9000的寄存器
        并使其用中斷方式接收網卡數據,查詢方式發送數據
        (這步挺難的,很多寄存器要配置,對照著Datasheet和別人的程序)
        注:DM9000內的寄存器的地址宏定義時,不用管基址,直接按OFFSET定義
        編寫好DM9000發送和接受函數(位寬為16)
        分別把DM9000寄存器MWCMD或MRCMD賦予數據端口
        接受數據時要注意,按照規定的格式來編寫
        定義一個符合ARP協議格式的數組,用于數據傳輸
        將該數組作為發送函數形參發給PC機請求包
        編寫中斷函數,清屏蔽
        將接收函數中的數組內容,用串口打印出控制臺
        SD卡驅動
        SD(全名為Secure Digital Memory Card,安全數碼卡)
        s3c2440集成了SD控制器,可以方便地讀寫SD、MMC和對SDIO進行操作。
        可以用SDIO控制器來編,也可用SPI總線來編
        SDIO的應用是未來嵌入式系統最重要的接口技術之一,會取代目前GPIO式的SPI接口
        具體的CMD命令和協議內容自己看回資料了。
        我使用的SD卡為手機的內存卡(不是MMC),型號為SDHC_V20_CARD,支持PLV2.0協議
        主要講編寫簡單的SD讀寫步驟:
        準備工作,編寫要使用到一堆東西:
        檢查SDIO命令發送,接收是否結束函數Chk_CMD_End(int cmd, int be_resp)
        使用到的CMD和ACMD函數(這部分要配置寄存器,要查值,比較難,參考別人的吧)
        編寫一個要用的結構體SD_STRUCT,用于記錄cCardType和iCardRCA等
        SD卡識別模式:
        初始化:時鐘400K,Type B, clk enable,SD卡模式,FIFO reset
        CMD 0——》reset指令
        CMD 8——》工作電壓范圍,初始化SDHC卡,看是否支持PLV2.0,返回類型
        CMD 55——》RCA為0x0,使用ACMD41前必須使用
        ACMD 41——》識別卡能否在給定的VDD下工作
        CMD 2——》查卡的CID信息
        CMD 3——》要求系統給SD卡發送一個新相對地址RCA
        改時鐘頻率:25M,準備進入transfer狀態
        CMD 7——》進入transfer狀態
        ACMD 6——》設置總線寬度為4bit
        數據傳輸模式:
        若需要擦除:
        {
        CMD 32——》start address
        CMD 33——》end address
        CMD 38——》erase
        }注意:擦除后必須要進行復位,即重新初始化前面步驟,不然不能進行讀寫
        單塊寫或多塊寫
        CMD 7——》transfer模式
        單塊讀或多塊讀
        拓展:
        將攝像頭捕捉的圖像,寫進SD卡中,然后再還原顯示出來
        注意一個點:
        就是要將LCD_BUFFER[480][272]的二維數組轉化為LCD_BUFFER_SD[480*272]一維
        一個疑問?好像只需51200就可將整幅圖像都顯示出來,而不需要480*272那么多
        附加部分(有空研究):
        文件系統的構建:

        上一頁 1 2 3 下一頁

        關鍵詞: 2440v裸機學

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 泸州市| 晋中市| 偃师市| 那坡县| 沙洋县| 内丘县| 苍溪县| 大姚县| 巩义市| 金堂县| 巨鹿县| 东光县| 安平县| 临汾市| 屯留县| 大兴区| 张家口市| 内丘县| 金沙县| 永福县| 广元市| 乌拉特前旗| 阿合奇县| 巴东县| 霍州市| 开阳县| 桦南县| 武山县| 宝兴县| 高淳县| 大足县| 睢宁县| 汝城县| 华阴市| 武义县| 沙洋县| 浏阳市| 新干县| 遂平县| 新田县| 信宜市|