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