還是單獨(dú)一章講講SPI吧。
SPI是非常常見的嵌入式處理器接口,每一個(gè)ADI的DSP均有此接口,我們以BF533為例來進(jìn)行簡單講解,如果有嵌入式開發(fā)經(jīng)驗(yàn)者,一看便知。
BF533的SPI接口是4線串口,可以連接SPIFLASH,SPI 接口的AD,DA 等等。ADSP-BF53x 的SPI 接口支持主機(jī)模式和從機(jī)模式,它有7個(gè)SPI從機(jī)片選,在主機(jī)模式下,它同時(shí)可以掛載7個(gè)SPI 設(shè)備,還可以在主機(jī)模式或從機(jī)模式下進(jìn)行BOOT啟動(dòng)。
SPI 管腳定義:
管腳定義 功能
MOSI 主輸入從輸出接口,根據(jù)主機(jī)和設(shè)備模式確定功能
MISO 從輸入主輸出接口,根據(jù)主機(jī)和設(shè)備模式確定功能
SCK SPI時(shí)鐘
SPISELx SPI設(shè)備選則接口
SPISS SPI從機(jī)片選接口
SPI 接口時(shí)鐘最快可以到系統(tǒng)時(shí)鐘的1/4,其配置公式為:
SCK Frequency = (Peripheral clock frequency SCLK)/(2 x SPI_BAUD)
SPI的接口寄存器詳細(xì)說明:
寄存器 功能
SPI_CTL SPI 控制寄存器,配置SPI 工作模式及相位等
SPI_F/G SPI 從機(jī)選擇寄存器,用于選擇使用哪一個(gè)片選控制設(shè)備
SPI_STAT SPI 狀態(tài)寄存器,獲取SPI 當(dāng)前工作狀態(tài)
SPI_TDBR SPI 數(shù)據(jù)傳輸寄存器
SPI_RDBR SPI 數(shù)據(jù)接收寄存器
SPI_SHADOW SPI_RDBR 的影子寄存器,可用于讀取數(shù)據(jù)
讓我們來看一段SPI的代碼:
*pSPI_BAUD=2; //配置速率為1/4 系統(tǒng)時(shí)鐘 SPI 速率 = SCLK/2*SPI_BAUD
*pSPI_F/G |=FLS2; //選擇SPISEL2 接口
*pSPI_CTL = 0x1001|CPHA| CPOL; //配置模式為手動(dòng)片選模式
*pSPI_CTL = (*pSPI_CTL | SPE); //使能SPI 接口
*pSPI_F/G &= ~F/G2; //將SPISEL2 拉到0
while(!(*pSPI_STAT & SPIF)); //查看SPI 傳輸狀態(tài)是否完成
*pSPI_TDBR = 0x55; //將數(shù)據(jù)送入SPI 傳輸數(shù)據(jù)寄存器
*pSPI_F/G |= F/G2; //將SPISEL2 拉到1,完成數(shù)據(jù)傳輸
*pSPI_F/G &= ~F/G2; //將SPISEL2 拉到0
while(*pSPI_STAT & RXS)//查看SPI 傳輸狀態(tài)是否有數(shù)據(jù)需要接收
i = *pSPI_RDBR; //讀取數(shù)據(jù)
*pSPI_F/G |= F/G2; //將SPISEL2 拉到1,完成數(shù)據(jù)傳輸
ADSP-BF53x 的SPI 接口支持手動(dòng)片選和自動(dòng)片選兩種模式,通過SPI_CTL 寄存器的CPHA 和CPOL 位配置,例子代碼采用的是手動(dòng)片選模式,每次讀取數(shù)據(jù)和數(shù)據(jù)讀取結(jié)束后需要通過代碼來選通和關(guān)閉片選,自動(dòng)片選的例子可以參考我的53x開發(fā)板驅(qū)動(dòng)程序中的SD卡驅(qū)動(dòng)代碼。
上傳一個(gè)源碼供大家參考,代碼實(shí)現(xiàn)了采用 SPI 接口發(fā)送0x55 數(shù)據(jù)和讀取SPI 接口數(shù)據(jù)。由于沒有相關(guān)硬件為 SPI 發(fā)送數(shù)據(jù),所以代碼只是為了學(xué)習(xí)SPI 接口的使用,實(shí)現(xiàn)了讀取和傳輸數(shù)據(jù)的功能,并不能查看發(fā)送數(shù)據(jù)和讀取數(shù)據(jù)的結(jié)果。
SPI的部分我也錄過一個(gè)教學(xué)視頻做詳細(xì)講解,會再下一章講完Timer之后一并貼出來!下一章就會說一下Blackfin的Timer。
補(bǔ)一下上面的那段代碼的完整源碼:
鏈接: http://pan.baidu.com/s/1i3Lyxe9 密碼: opr2 |