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