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