摘 要: 針對PowerPC在高速信號和大量數(shù)據(jù)處理中的應(yīng)用優(yōu)勢,在PowerPC860板的通信處理模塊CPM的SCC3設(shè)備上" title="設(shè)備上">設(shè)備上開發(fā)了板級支持包BSP,使串口通信" title="串口通信">串口通信通道SCC3端口實現(xiàn)了HDLC協(xié)議的自環(huán)方式通信,通過SCC3端口發(fā)送數(shù)據(jù)或文件,將接收到的數(shù)據(jù)通過串口發(fā)送到PC仿真終端顯示。
關(guān)鍵詞: BSP設(shè)計 驅(qū)動程序 緩存區(qū) 緩存區(qū)描述符
?
嵌入式系統(tǒng)是一種對可靠性和實時性要求較高的專用計算機系統(tǒng)。PowerPC860能夠提供良好的編程、編譯、系統(tǒng)配置和調(diào)試環(huán)境,同時能在底層實現(xiàn)模塊化和屏蔽化。VxWorks是32位的實時操作系統(tǒng),支持32位以上的嵌入式處理器,如MIPS、ARM、PowerPC系列等。在VxWorks的開發(fā)環(huán)境Tornado中已集成了很多基于ARM和PowerPC系列的驅(qū)動模塊,如網(wǎng)卡設(shè)備驅(qū)動、串口通信驅(qū)動、塊設(shè)備驅(qū)動等。在Tornado系統(tǒng)中,已在串口通信通道SCC3設(shè)備上開發(fā)了基于UART協(xié)議的板級支持BSP。但由于UART協(xié)議沒有數(shù)據(jù)差錯校驗處理,所以不能實現(xiàn)數(shù)據(jù)的可靠傳輸。本文基于HDLC協(xié)議,提出了通過SCC3端口發(fā)送和接收數(shù)據(jù)" title="接收數(shù)據(jù)">接收數(shù)據(jù),其中SCC3的接收緩沖區(qū)不但包括發(fā)送緩沖區(qū)的數(shù)據(jù)內(nèi)容,還包括16位或32位的CRC差錯校驗,實現(xiàn)了數(shù)據(jù)的高可靠性和實時性傳輸。PowerPC860的板級支持包BSP的設(shè)計是實現(xiàn)SCC自環(huán)通信系統(tǒng)開發(fā)及移植的重點,BSP 主要完成VxWorks 對專用目標板的支持。由于對硬件系統(tǒng)緊湊性和操作系統(tǒng)處理性能的要求,本BSP設(shè)計是在SCC3端口上采用NMSI方式實現(xiàn)的自環(huán)通信。
1 系統(tǒng)的BSP初始化方法
PowerPC860由其內(nèi)核、系統(tǒng)接口單元和通信處理模塊CPM三部分組成。其中通信處理模塊可以在不同的設(shè)備上發(fā)送和接收信息,還可以在CPM的串口通信通道SCC上實現(xiàn)不同協(xié)議的傳輸。一個BSP 包括硬件初始化、中斷處理和產(chǎn)生、硬件時鐘管理、本地和總線內(nèi)存空間映射,同時也包含定制VxWorks 映像。目標板初始化和驅(qū)動程序設(shè)計是SCC3端口實現(xiàn)HDLC協(xié)議自環(huán)方式通信的關(guān)鍵和難點。通常,BSP提供的功能有:初始化(CPU初始化、目標板初始化、內(nèi)核初始化)和驅(qū)動程序支持。驅(qū)動程序負責硬件設(shè)備的初始化,并與設(shè)備交互實現(xiàn)系統(tǒng)對設(shè)備功能的調(diào)用。本文提出的BSP設(shè)計特點是基于HDLC模式對SCC3通道初始化以及存儲區(qū)的初始化配置,并采用中斷控制提高數(shù)據(jù)傳輸效率。該BSP能夠提供標準接口,包括設(shè)備初始化、設(shè)備的啟動和停止、設(shè)備狀態(tài)查詢、中斷和查詢方式下發(fā)送和接收數(shù)據(jù),從而實現(xiàn)底層模塊化及提高數(shù)據(jù)處理效率。
1.1 對自環(huán)通信的SCC3初始化的硬件設(shè)計
配置發(fā)送與接收所用的波特率發(fā)生器,將SCC3的收發(fā)時鐘分別配置成內(nèi)部時鐘和外部時鐘;將SCC3配置成NMSI模式,初始化SDCR寄存器。在函數(shù)sccIoctl中,模式為16位CRC寄存器的設(shè)置如下:
sccIoctl(SCC_CHAN*pChan,int com,int arg)
{
if(arg==CRC16_MODE)
{ pChan->hdlc.pSccReg->psmr&=~0x0800;
pChan->hdlc.pScc->c_mask=CRC16_MASK;
pChan->hdlc.pScc->c_pres=CRC16_PRES;
}
return (status);
}
1.2 對初始化SCC3的軟件設(shè)計
SCC3的初始化包括參數(shù)RAM和收發(fā)緩沖區(qū)描述符" title="描述符">描述符BD的初始化。IMMR寄存器的值是內(nèi)存基址,其中內(nèi)存包括寄存器基址和收發(fā)緩沖區(qū)描述符BD等。設(shè)置Rx和TxBD表的基址相對于雙端口RAM的偏移量;設(shè)置Rx和Tx的函數(shù)代碼;在MRBLR中設(shè)置接收緩存的最大" title="最大">最大空間;設(shè)置收發(fā)緩沖區(qū)描述符BD表基址相對于IMMR寄存器中值的偏移量。收發(fā)緩沖區(qū)描述符BD對Buffer結(jié)構(gòu)進行描述,包括對Buffer的狀態(tài)statusMode(即是否為空)、長度dataLength和指針dataPointer的描述。收發(fā)緩沖區(qū)描述符BD初始化過程如下(其中MAX_RXBD_
NUM為最大接收緩沖區(qū)描述符BD數(shù),MAX_BUF_SIZE為最大接收Buffer數(shù)目):
static void InitBDs(void)
{
int i=0;/*pRxBuffer是Buffer的首地址*/
for (i=0;i
RecvBD[i]->statusMode=0x0000;
RecvBD[i]->statusMode|=(BD_RX_EMPTY_BIT);
RecvBD[i]->dataLength=0;
RecvBD[i]->dataPointer=(u_char*)(pRxBuffer+i*MAX_BUF_SIZE);
}
}
2 自環(huán)方式通信系統(tǒng)的驅(qū)動設(shè)計
由于系統(tǒng)在自環(huán)通信方式下工作,所以SCC3的參數(shù)RAM、收發(fā)緩存區(qū)描述符等的內(nèi)存地址設(shè)計、UART協(xié)議和HDLC協(xié)議的驅(qū)動設(shè)計方法、自環(huán)通信和多通道通信方式設(shè)計將發(fā)生根本變化。因此系統(tǒng)設(shè)備驅(qū)動程序需編寫具有相應(yīng)特點的設(shè)備函數(shù)。
(1)接收函數(shù)sccPollInput()的設(shè)計。
正式讀入數(shù)據(jù)前,必須先檢測幀開始標志,并匹配地址,然后決定是否進入接收狀態(tài)。進入接收狀態(tài)后,首先提取RxBD的狀態(tài)模式字節(jié),若接收未準備好,則繼續(xù)等待;若已準備好,則開始接收。由于一個數(shù)據(jù)包可以放置于多個緩存,所以檢測RxBD狀態(tài)模式字節(jié)的L位,以判斷是否為本幀的最后一個緩存。如果不是,則關(guān)閉這個緩存,處理下一個緩存描述字;如果是,則接收完最后一個緩存的數(shù)據(jù)后結(jié)束接收過程。對于最后一個buffer,需要檢測是否有接收錯誤。下面舉例說明SCC3的一個接收緩沖區(qū)描述符BD所描述的5個Buffer的數(shù)據(jù)接收過程,如圖1所示。該例設(shè)節(jié)點地址STADDR為0x1999,最大Buffer接收數(shù)MAX_BUF_SIZE為5,接收緩存地址pRxBuffer,連續(xù)接收發(fā)送緩存區(qū)數(shù)據(jù)66,XmitBD[0]->dataPointer為首地址pRxBuffer賦值。
接收Buffer的數(shù)據(jù)結(jié)構(gòu)和實現(xiàn)接收數(shù)據(jù)的基本過程如下:
#define MAX_BUF_SIZE 5
#define STADDR 0x1999
typedef struct
{
SCC_HDLC_BUF*pTxBuffer;
SCC_HDLC_BUF*pRxBuffer;
}SCC_HDLC_DEV
*pRxBuffer =XmitBD[0]->dataPointer;
*pRxBuffer=(STADDR%256);
*pRxBuffer=pRxBuffer +1;
*pRxBuffer=(STADDR/256);
pRxBuffer=pRxBuffer +1;
for(index=2;index
(2)發(fā)送函數(shù)sccPollInput( )的設(shè)計。
設(shè)計方法同接收函數(shù)相似,但對于最后一個Buffer,需要檢測是否有發(fā)送錯誤,并以剩下的實際數(shù)據(jù)長度作為發(fā)送幀中數(shù)據(jù)段的長度發(fā)送。
(3)設(shè)備控制函數(shù)sccIoctl()和數(shù)據(jù)發(fā)送函數(shù)sccStartup( )的設(shè)計。
sccIoctl()函數(shù)用于設(shè)備工作模式配置和參數(shù)讀取。其中包括工作模式、通信速率、節(jié)點地址、CRC模式、最長幀等。輪詢模式下的收、發(fā)消息不需外部消息激勵,減少了任務(wù)的相互調(diào)度,可以用taskDelay實現(xiàn) ,但是效率較低。sccStartup( )是中斷方式下的數(shù)據(jù)發(fā)送函數(shù),設(shè)計要求在sysHwInit2( )函數(shù)中用接口inConnect( )實現(xiàn)關(guān)聯(lián)sccStartup( )和ISR。
本文是在CS860板的SCC3設(shè)備上開發(fā)支持標準HDLC點對點通信協(xié)議的BSP,它實現(xiàn)了數(shù)據(jù)的高可靠和實時性傳輸?;赩xworks 操作系統(tǒng)的HDLC協(xié)議自環(huán)通信,按一定的步驟分階段編碼調(diào)試實現(xiàn)。開發(fā)步驟包括:建立開發(fā)環(huán)境、編寫初始化代碼驅(qū)動、調(diào)試BSP等。通過測試程序?qū)崿F(xiàn)了在查詢及中斷方式下發(fā)送和接收數(shù)據(jù),在超級終端設(shè)置和查看工作模式、通信速率、節(jié)點地址、CRC模式,最長幀等,并設(shè)有收發(fā)是否正常及錯誤類型告警提示。通過硬件配置和程序調(diào)試,本文的BSP能在PowerPC860的其他SCC上移植。
參考文獻
1 Motorola Company.The MPC860 PowerQUICC TrainingCDROM [EB/OL].America,Motorola,2004
2 李方敏.VxWorks高級程序設(shè)計[M].北京:清華大學出版社,2004
3 周啟平.VxWorks下設(shè)備驅(qū)動程序BSP及開發(fā)指南[M].北京:中國電力出版社,2004
4 張昆藏.計算機組織與結(jié)構(gòu)——性能設(shè)計(第五版)[M].北京:電子工業(yè)出版社,2004