MPC860的HDLC通道驅動(dòng)程序的設計與實(shí)現
每個(gè)SCC有四個(gè)地址存儲器HADDR1~HADDR4,所以每個(gè)SCC可識別四個(gè)地址,包括廣播地址。接收時(shí),通過(guò)與HDLC幀的目的地址進(jìn)行比較,確定接收該幀還是丟棄。
3.3 初始化收發(fā)緩存區描述符
(1)在初始化緩存區描述符的過(guò)程中,收發(fā)都必須停止。通過(guò)將GSMR_L2的ENT和ENR置零,然后配置CPCR中的CP命令就可以禁止收發(fā)。
(2)配置收發(fā)緩存區描述符:
?、倥渲卯斍敖邮站彺鎱^描述符表的基地址,即IMMR的基地址再加上收發(fā)緩存區描述符表相對于IMMR的偏移地址。由于發(fā)送緩存區描述符表緊跟在接收緩存區描述符表的后面,因此發(fā)送緩存區描述符表的基地址為接收緩存區描述符表的基地址加上整個(gè)接收緩存區描述符表的長(cháng)度。
?、诔跏蓟l(fā)送緩存區描述符表和接收緩存區描述符表。如果收發(fā)緩存區都為空,分別將每一個(gè)發(fā)送緩存區描述符表和接收緩存區描述符表的狀態(tài)模式參數中的狀態(tài)位E置1、數據長(cháng)度置0,
并將它們的地址設置成相應的值。如果收緩存區或發(fā)緩存區不為空,則應該先將這些緩存區清零。值得注意的是,最后一個(gè)收發(fā)緩存區描述符表的W位必須置1。
(3)初始化完成后,應該將ENT和ENR位置
3.4 收發(fā)功能的實(shí)現
3.4.1 接收函數
SMR_L2寄存器的ENR位置1的前提下,HDLC控制器進(jìn)入接收允許狀態(tài)。在正式讀入數據前,必須先檢測幀開(kāi)始標志,并匹配地址,然后決定是否進(jìn)入接收狀態(tài)。進(jìn)入接收狀態(tài)后,首先提取RxBD的狀態(tài)模式字節,若接收未準備好,則繼續等待,若準備好了,則開(kāi)始接收。由于一個(gè)數據包可以放置于多個(gè)緩存,所以檢測RxBD狀態(tài)模式字節的L位,以判斷是否為本幀的最后一個(gè)緩存:如果不是,則關(guān)閉這個(gè)緩存,處理下一個(gè)緩存描述字;如果是,接收完最后一個(gè)緩存的數據后結束接收過(guò)程。對于最后一個(gè)buffer,需要檢測是否有接收錯誤。
3.4.2 發(fā)送函數
發(fā)送函數流程圖如圖4所示。
在GSMR_L2寄存器的ENT位置1的前提下,HDLC控制器進(jìn)入發(fā)送允許狀態(tài)。首先提取TxBD的狀態(tài)模式字節,若發(fā)送未準備好,則繼續等待,若準備好了,則進(jìn)入發(fā)送狀態(tài),在發(fā)送數據中間插入適當的標志位后就可以發(fā)送。由于一個(gè)發(fā)送數據包可以包含多個(gè)緩存,所以檢測TxBD狀態(tài)模式字節的L位,以判斷是否為最后一個(gè)緩存:如果不是,則關(guān)閉這個(gè)緩存,處理下一個(gè)緩存描述字;如果是,控制器進(jìn)入關(guān)閉發(fā)送狀態(tài)。對于最后一個(gè)buffer,需要做兩件事情:(1)檢測是否有發(fā)送錯誤。(2)以剩下的實(shí)際數據長(cháng)度作為發(fā)送幀中數據段的長(cháng)度發(fā)送出去。
3.5 中斷處理
在這個(gè)驅動(dòng)程序中,只處理SCC2產(chǎn)生的中斷。首先確定是否是CPM產(chǎn)生的中斷,然后讀取寄存器CPM中斷向量寄存器(CIVR)的VN字段判斷是否為SCC2產(chǎn)生的中斷。如果是的話(huà),就讀取SCEE確定中斷類(lèi)型,然后做出相應的處理。
本程序通過(guò)在MPC860上做環(huán)回測試,情況良好。但在程序實(shí)現過(guò)程中,中斷的控制還有待于進(jìn)一步完善。
評論