<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM處理器的HDLC通信的DMA實(shí)現(xiàn)

          基于ARM處理器的HDLC通信的DMA實(shí)現(xiàn)

          作者: 時(shí)間:2012-11-16 來源:網(wǎng)絡(luò) 收藏

          Hdlc_End_Device Hdle_Dev; //全局定義

          Hdlc_End_Device *pDevice; //函數(shù)內(nèi)部定義

          pDevice=(Hdlc_End_Device *)Hdlc_Dev;

          1.5 使用方式的程序設(shè)計(jì)

          (1)初始化流程

          初始化流程如圖3所示。

          void HdlcInit(void); //系統(tǒng)啟動(dòng)HDLC主初始化函數(shù)

          Int HdlcChannelInit(Hdlc_End_Device *pDrvCtrl); //關(guān)閉中斷源、復(fù)位控制器和HDLC控制寄存器、設(shè)置相關(guān)的寄存器、時(shí)鐘源

          void TxBD_initialize(U32 channel,Hdlc_End_Device *pDrvCtrl);

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

          (2)HDMA發(fā)送過程中斷服務(wù)程序

          HDMA發(fā)送過程及中斷服務(wù)程序如圖4所示。void Transmit_Frame(Hdlc_End_Device *pDrvCtrl);//準(zhǔn)備數(shù)據(jù)調(diào)用HdlcFramsSend()

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

          在發(fā)送過程中,首先檢查gpTxBDStart指向的BD的所有權(quán):如果為DMA所用,應(yīng)當(dāng)退出;如果CPU擁有,則可按照HDLC幀的格式填入gpTxBDStart指向的BD對(duì)應(yīng)的緩沖數(shù)據(jù)區(qū),然后設(shè)置BD的控制信息,設(shè)置所有權(quán)關(guān)系為DMA和LASTF指示位,啟動(dòng)發(fā)送(使能Tx、TxDMA),并把gpTxBDStart移到下一個(gè)位置。

          void HdlcTx_Isr(void);//發(fā)送中斷服務(wù)程序,通常只做檢測(cè)任務(wù),生成錯(cuò)誤統(tǒng)計(jì)報(bào)告

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

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

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

          //HdlcFrameReceive ();

          void HdlcFrameReceive(Hdle_End_Device *pDrvCtrl,U32 IntHDLCStatus);

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

          數(shù)據(jù)到達(dá),進(jìn)入接收中斷服務(wù)程序。如果接收1幀完成標(biāo)志位(RxFA)設(shè)置,可以進(jìn)入數(shù)據(jù)接收程序,由HdlcFrameDataGet()負(fù)責(zé)把數(shù)據(jù)從接收緩沖數(shù)據(jù)區(qū)送用戶數(shù)據(jù)區(qū),進(jìn)行處理;如果錯(cuò)誤,生成錯(cuò)誤類型報(bào)告。

          數(shù)據(jù)接收完畢,應(yīng)該把當(dāng)前的BD交還給接收DMA控制器,設(shè)置對(duì)應(yīng)的所有權(quán)為DMA,然后把gpRxBDStart移到BD鏈中的下一個(gè)位置。

          2 操作系統(tǒng)(OS)設(shè)備驅(qū)動(dòng)接口

          雖然程序是在ARMstd251中編譯,但是整個(gè)結(jié)構(gòu)基本是按照驅(qū)動(dòng)程序設(shè)計(jì)思路,可以通過局部更改轉(zhuǎn)化為OS驅(qū)動(dòng)程序。

          在HDLC控制中,如何生成BD鏈和相應(yīng)的數(shù)據(jù)緩存區(qū),是一個(gè)關(guān)鍵的問題。通常在無操作系統(tǒng)開發(fā)的環(huán)境中,這些相應(yīng)的存儲(chǔ)器分配可以采用全局的方式,固定在相應(yīng)的系統(tǒng)內(nèi)存區(qū)域,并遇射到Noncache區(qū),使用指針快速訪問。

          在使用OS的情況下,例如pSOS、VxWorks,相應(yīng)的存儲(chǔ)器分配采用動(dòng)態(tài)(calloc())的方式,尤其需要注意的在退出前必須回收資源。驅(qū)動(dòng)程序設(shè)計(jì)的目的要為OS提供一個(gè)透明(Transparent)的接口,實(shí)現(xiàn)OS的I/O例程和硬件驅(qū)動(dòng)無縫銜接。

          同時(shí),構(gòu)建一個(gè)良好的設(shè)備結(jié)構(gòu)也是十分必要的,可以方便設(shè)置、加載和卸載處理。


          上一頁 1 2 3 下一頁

          關(guān)鍵詞: ARM處理器 HDLC通信 DMA

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();