新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM處理器的HDLC通信的DMA實現

        基于ARM處理器的HDLC通信的DMA實現

        作者: 時間:2012-11-16 來源:網絡 收藏

        Hdlc_End_Device Hdle_Dev; //全局定義

        Hdlc_End_Device *pDevice; //函數內部定義

        pDevice=(Hdlc_End_Device *)Hdlc_Dev;

        1.5 使用方式的程序設計

        (1)初始化流程

        初始化流程如圖3所示。

        void HdlcInit(void); //系統啟動HDLC主初始化函數

        Int HdlcChannelInit(Hdlc_End_Device *pDrvCtrl); //關閉中斷源、復位控制器和HDLC控制寄存器、設置相關的寄存器、時鐘源

        void TxBD_initialize(U32 channel,Hdlc_End_Device *pDrvCtrl);

        void RxBD_initialize(U32 channel,Hdlc_End_Device *pDrvCtrl);//初始化發送接收BD鏈,gpXxBDStart指針指向第1個BD,HXXPTR寄存器裝入第1個BD地址void HdlcChannelStart(U32 channel); //連接中斷服務程序,打開中斷,啟動接收

        (2)HDMA發送過程中斷服務程序

        HDMA發送過程及中斷服務程序如圖4所示。void Transmit_Frame(Hdlc_End_Device *pDrvCtrl);//準備數據調用HdlcFramsSend()

        Int HdlcFrameSend(Hdlc_End_Device *pDrvCtrl,U8 *pData,U32 len);

        在發送過程中,首先檢查gpTxBDStart指向的BD的所有權:如果為DMA所用,應當退出;如果CPU擁有,則可按照HDLC幀的格式填入gpTxBDStart指向的BD對應的緩沖數據區,然后設置BD的控制信息,設置所有權關系為DMA和LASTF指示位,啟動發送(使能Tx、TxDMA),并把gpTxBDStart移到下一個位置。

        void HdlcTx_Isr(void);//發送中斷服務程序,通常只做檢測任務,生成錯誤統計報告

        (3)HDMA接收過程及中斷服務程序

        HDMA接收過程及中斷服務程序如圖5所示。

        void HdlcRx_Isr(void); //如果接收正常完成,調用

        //HdlcFrameReceive ();

        void HdlcFrameReceive(Hdle_End_Device *pDrvCtrl,U32 IntHDLCStatus);

        void HdlcFrameDataGet(Hdlc_End_Device *pDrvCtrl,U8 *pFrameData,U32 len);

        數據到達,進入接收中斷服務程序。如果接收1幀完成標志位(RxFA)設置,可以進入數據接收程序,由HdlcFrameDataGet()負責把數據從接收緩沖數據區送用戶數據區,進行處理;如果錯誤,生成錯誤類型報告。

        數據接收完畢,應該把當前的BD交還給接收DMA控制器,設置對應的所有權為DMA,然后把gpRxBDStart移到BD鏈中的下一個位置。

        2 操作系統(OS)設備驅動接口

        雖然程序是在ARMstd251中編譯,但是整個結構基本是按照驅動程序設計思路,可以通過局部更改轉化為OS驅動程序。

        在HDLC控制中,如何生成BD鏈和相應的數據緩存區,是一個關鍵的問題。通常在無操作系統開發的環境中,這些相應的存儲器分配可以采用全局的方式,固定在相應的系統內存區域,并遇射到Noncache區,使用指針快速訪問。

        在使用OS的情況下,例如pSOS、VxWorks,相應的存儲器分配采用動態(calloc())的方式,尤其需要注意的在退出前必須回收資源。驅動程序設計的目的要為OS提供一個透明(Transparent)的接口,實現OS的I/O例程和硬件驅動無縫銜接。

        同時,構建一個良好的設備結構也是十分必要的,可以方便設置、加載和卸載處理。


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 延安市| 梁山县| 巢湖市| 越西县| 天等县| 湖州市| 富民县| 射阳县| 衡东县| 三台县| 蓬溪县| 福海县| 大埔区| 新平| 西宁市| 霍林郭勒市| 郁南县| 九寨沟县| 巫溪县| 株洲县| 漯河市| 辽阳县| 丰宁| 广宁县| 泰兴市| 连州市| 怀远县| 久治县| 竹溪县| 吴忠市| 饶河县| 保山市| 兴和县| 安溪县| 新兴县| 康定县| 静宁县| 中卫市| 曲周县| 贡山| 宣化县|