ADSP—BF561 的SPORT口是全雙工的,可以同時發(fā)送和接收數(shù)據(jù)。本驅動主要通過軟件設置和處理,利用SPORT口的發(fā)送功能,發(fā)送16位的串行數(shù)據(jù)字。其中有效數(shù)據(jù)位8位,最低位在前,擁有與 UART異步數(shù)據(jù)相同的數(shù)據(jù)格式,在主機端可用超級終端等軟件接收。
驅動中需在file_operations結構里實現(xiàn)的主要接口函數(shù)有open(),write()和ioetl()。
(1)open() 函數(shù)
在open()函數(shù)中,需初始化SPORTl口相應的寄存器。以下是幾個重要的寄存器設置。
?、賁PORTl_TCLKDIV:SPORTl口發(fā)送時鐘頻率設置。
SPORTl_TCLKDIV=(SYS_CLOCK_FREQUENCY/2*MO—DEM_BAUD_RATE))一 1;/*SYS_CLOCK_FREQUENCY為系統(tǒng)時鐘頻率,通過測試,此處應取值為98 390 000。MODEM_BAUD_RATE為波特率,用戶可通過調(diào)用iootl()進行設置*/
?、赟PORTl_TFSDIV:SPORTl口的發(fā)送幀同步頻率設置,確定在TFS脈沖前要計數(shù)的發(fā)送時鐘周期數(shù)。 SPORTl_TFSDIV=0x000f;
?、跾PORTl_TCR2:設置串行通信字長。SPORTl_TCR2=0x000f; //設置串行通信字長為16位
?、躍PORTl_TCRl:SPORTl口的主要控制寄存器。SPORTl_TCRl=0x0613; /*傳輸使能。發(fā)送數(shù)據(jù)時,設置低位優(yōu)先,設置串口為內(nèi)部時鐘,內(nèi)部產(chǎn)生幀同步信號,傳送時可按照實際的波特率發(fā)送數(shù)據(jù)*/
(2)write() 函數(shù)
write()函數(shù)的主要功能是將應用程序中寫入SPORT口的數(shù)據(jù)轉換成UART的數(shù)據(jù)格式輸出,主要實現(xiàn)流程如下:
?、俜峙渚彌_區(qū)以存放轉換后的數(shù)據(jù)(用kmalloc實現(xiàn))。
?、跀?shù)據(jù)格式的轉換。要用SPORT口模擬UART口,就要使從SPORT口發(fā)出的數(shù)據(jù)與從UART口發(fā)出的數(shù)據(jù)具有相同的數(shù)據(jù)格式。在驅動中將從 SPORT口發(fā)出的數(shù)據(jù)設置為1位起始位、8位數(shù)據(jù)位、1位停止位,即“O DO D1 D2 D3 D4 D5 D6 D7 l”。停止位與起始位之間可有多個1,但一旦停止位后有O,便認為是下一個字符的開始。應用程序中傳入的數(shù)據(jù)要經(jīng)過相應轉換才能寫入SPORT的發(fā)送寄存器。具體轉換過程為:
[!--empirenews.page--]
?、蹟?shù)據(jù)的發(fā)送。SPORT1_STAT中的TXF位指示發(fā)送FIFO中是否有空位,其值為1表示FIFO已滿,為0表示FIFO中仍有空位。
(3)ioctl() 函數(shù)
ioctl()是設備驅動程序中對設備I/O通道進行管理的函數(shù)。所謂對I/O通道進行管理,就是對設備的一些特性進行控制,例如串口傳輸波特率的選擇。驅動程序中ioctl()通過傳入的參數(shù)cmd設置SPORTl口的發(fā)送時鐘頻率。cmd在用戶程序端由一些宏進行定義,該整數(shù)通過系統(tǒng)調(diào)用傳遞到內(nèi)核中的驅動程序,再由驅動程序利用解碼宏從這個整數(shù)中得到用戶要設置的波特率,然后通過switch{case)結構進行相應的操作。
主要實現(xiàn)流程如下:
只要保證應用程序中由locil()的參數(shù)cmd的宏定義值與核心驅動中相應的解碼宏定義相符,便可在應用程序中通過ioctl()函數(shù)實現(xiàn)任意有效波特率的設置。
結語
在SPORT口驅動程序中,通過對數(shù)據(jù)幀結構進行轉換,輸出與UART異步數(shù)據(jù)相同的幀格式,用軟件實現(xiàn)UART,有效地解決了DSP的異步串口擴展問題。