AVR單片機(學(xué)習(xí)ing)—(十)、ATMEGA16的同步串行接口—01
十、ATMEGA16的同步串行接口
十—(01)、ATMEGA16的同步串行接口的介紹
1、ATMEGA16的SPI特點
串行外設(shè)接口SPI 允許ATmega16 和外設(shè)或其他AVR 器件進行高速的同步數(shù)據(jù)傳輸。
ATmega16 SPI 的特點如下:
? 全雙工, 3 線同步數(shù)據(jù)傳輸
? 主機或從機操作
? LSB 首先發(fā)送或MSB 首先發(fā)送
? 7 種可編程的比特率
? 傳輸結(jié)束中斷標(biāo)志
? 寫碰撞標(biāo)志檢測
? 可以從閑置模式喚醒
? 作為主機時具有倍速模式(CK/2)
2、主機與從機之間的SPI連接以及原理
主機和從機之間的SPI 連接如Figure 66 所示。 系統(tǒng)包括兩個移位寄存器和一個主機時鐘
發(fā)生器。通過將需要的從機的 SS 引腳拉低,主機啟動一次通訊過程。主機和從機將需要
發(fā)送的數(shù)據(jù)放入相應(yīng)的移位寄存器。主機在SCK 引腳上產(chǎn)生時鐘脈沖以交換數(shù)據(jù)。主機
的數(shù)據(jù)從主機的MOSI 移出,從從機的MOSI 移入;從機的數(shù)據(jù)從從機的MISO 移出,從
主機的MISO 移入。主機通過將從機的SS 拉高實現(xiàn)與從機的同步。
配置為SPI 主機時, SPI 接口不自動控制 SS 引腳,必須由用戶軟件來處理。(還有~~就是主機和從機的兩個移位寄存器可以被認(rèn)定為一個公開的16位環(huán)形移位寄存器)對 SPI 數(shù)
據(jù)寄存器寫入數(shù)據(jù)即啟動SPI 時鐘,將8 比特的數(shù)據(jù)移入從機。傳輸結(jié)束后SPI 時鐘停
止,傳輸結(jié)束標(biāo)志SPIF 置位。如果此時SPCR 寄存器的SPI 中斷使能位SPIE 置位,中
斷就會發(fā)生。主機可以繼續(xù)往SPDR 寫入數(shù)據(jù)以移位到從機中去,或者是將從機的SS 拉
高以說明數(shù)據(jù)包發(fā)送完成。最后進來的數(shù)據(jù)將一直保存于緩沖寄存器里。
配置為從機時,只要SS 為高,SPI 接口將一直保持睡眠狀態(tài),并保持MISO 為三態(tài)。在
這個狀態(tài)下軟件可以更新SPI 數(shù)據(jù)寄存器SPDR 的內(nèi)容。即使此時SCK 引腳有輸入時
鐘,SPDR 的數(shù)據(jù)也不會移出,直至SS 被拉低。一個字節(jié)完全移出之后,傳輸結(jié)束標(biāo)志
SPIF置位。如果此時SPCR寄存器的SPI中斷使能位SPIE置位,就會產(chǎn)生中斷請求。在讀
取移入的數(shù)據(jù)之前從機可以繼續(xù)往SPDR 寫入數(shù)據(jù)。最后進來的數(shù)據(jù)將一直保存于緩沖
寄存器里。
SPI 系統(tǒng)的發(fā)送方向只有一個緩沖器,而在接收方向有兩個緩沖器。也就是說,在發(fā)送時
一定要等到移位過程全部結(jié)束后才能對SPI 數(shù)據(jù)寄存器執(zhí)行寫操作。而在接收數(shù)據(jù)時,需
要在下一個字符移位過程結(jié)束之前通過訪問SPI 數(shù)據(jù)寄存器讀取當(dāng)前接收到的字符。否則
第一個字節(jié)將丟失。
工作于SPI 從機模式時,控制邏輯對SCK 引腳的輸入信號進行采樣。為了保證對時鐘信
號的正確采樣, SPI 時鐘不能超過fosc/4。
下面的例程說明如何將SPI 初始化為主機,以及如何進行簡單的數(shù)據(jù)發(fā)送。例子中
DDR_SPI必須由實際的數(shù)據(jù)方向寄存器代替;DD_MOSI、DD_MISO和DD_SCK必須由
實際的數(shù)據(jù)方向代替。比如說, MOSI 為PB5 引腳,則DD_MOSI 要用DDB5 取代,
DDR_SPI 則用DDRB 取代。
void SPI_MasterInit(void)
{
DDR_SPI = (1<
SPCR = (1<
void SPI_MasterTransmit(char cData)
{
SPDR = cData;
while(!(SPSR & (1<
}
void SPI_SlaveInit(void)
{
DDR_SPI = (1<
SPCR = (1<
char SPI_SlaveReceive(void)
{
while(!(SPSR & (1<
return SPDR;
}
3、SS 引腳的功能
從機模式
當(dāng)SPI 配置為主機時,從機選擇引腳SS 總是為輸入。SS 為低將激活SPI 接口, MISO
成為輸出( 用戶必須進行相應(yīng)的端口配置) 引腳,其他引腳成為輸入引腳。當(dāng)SS 為高時
所有的引腳成為輸入, SPI 邏輯復(fù)位,不再接收數(shù)據(jù)。
SS引腳對于數(shù)據(jù)包/字節(jié)的同步非常有用,可以使從機的位計數(shù)器與主機的時鐘發(fā)生器同
步。當(dāng)SS 拉高時SPI從機立即復(fù)位接收和發(fā)送邏輯,并丟棄移位寄存器里不完整的數(shù)據(jù)。
主機模式
當(dāng)SPI 配置為主機時(MSTR 的SPCR 置位),用戶可以決定SS 引腳的方向。
若SS 配置為輸出,則此引腳可以用作普通的I/O 口而不影響SPI 系統(tǒng)。典型應(yīng)用是用來
驅(qū)動從機的SS 引腳。
如果SS 配置為輸入,必須保持為高以保證SPI 的正常工作。若系統(tǒng)配置為主機, SS 為
輸入,但被外設(shè)拉低,則SPI 系統(tǒng)會將此低電平解釋為有一個外部主機將自己選擇為從
機。為了防止總線沖突, SPI 系統(tǒng)將實現(xiàn)如下動作:
1. 清零SPCR 的MSTR 位,使SPI 成為從機,從而MOSI 和SCK 變?yōu)檩斎搿?br/>2. SPSR 的SPIF 置位。若SPI 中斷和全局中斷開放,則中斷服務(wù)程序?qū)⒌玫綀?zhí)行。
因此,使用中斷方式處理SPI 主機的數(shù)據(jù)傳輸,并且存在SS 被拉低的可能性時,中斷服
務(wù)程序應(yīng)該檢查MSTR 是否為"1”。若被清零,用戶必須將其置位,以重新使能SPI 主機
模式。
4、SPI的相關(guān)寄存器
1)SPI控制寄存器
? Bit 7 – SPIE: 使能SPI 中斷
置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中斷使能位置位,就會引發(fā)
SPI 中斷。
? Bit 6 – SPE: 使能SPI
SPE 置位將使能SPI。進行任何SPI 操作之前必須置位SPE。
? Bit 5 – DORD: 數(shù)據(jù)次序
DORD 置位時數(shù)據(jù)的LSB 首先發(fā)送;否則數(shù)據(jù)的MSB 首先發(fā)送。
? Bit 4 – MSTR: 主/ 從選擇
MSTR置位時選擇主機模式,否則為從機。如果MSTR為"1”,SS配置為輸入,但被拉低,
則MSTR 被清零,寄存器SPSR 的SPIF 置位。用戶必須重新設(shè)置MSTR 進入主機模式。
? Bit 3 – CPOL: 時鐘極性
CPOL 置位表示空閑時SCK 為高電平;否則空閑時SCK 為低電平。請參考 Figure 67 與
Figure 68。 CPOL 功能總結(jié)如下:
? Bit 2 – CPHA: 時鐘相位
CPHA 決定數(shù)據(jù)是在SCK 的起始沿采樣還是在SCK 的結(jié)束沿采樣。請參考Figure 67 與
Figure 68 。
? Bits 1, 0 – SPR1, SPR0: SPI 時鐘速率選擇1 與0
確定主機的SCK 速率。SPR1 和SPR0 對從機沒有影響。SCK 和振蕩器的時鐘頻率fosc
關(guān)系如下表所示:
2)SPI狀態(tài)寄存器
? Bit 7 – SPIF: SPI 中斷標(biāo)志
串行發(fā)送結(jié)束后,SPIF 置位。若此時寄存器SPCR 的SPIE 和全局中斷使能位置位,SPI
中斷即產(chǎn)生。如果SPI 為主機, SS 配置為輸入,且被拉低, SPIF 也將置位。進入中斷
服務(wù)程序后SPIF自動清零。或者可以通過先讀SPSR,緊接著訪問SPDR來對SPIF清零。
? Bit 6 – WCOL: 寫碰撞標(biāo)志
在發(fā)送當(dāng)中對SPI 數(shù)據(jù)寄存器SPDR寫數(shù)據(jù)將置位WCOL。WCOL可以通過先讀SPSR,
緊接著訪問SPDR 來清零。
? Bit 5..1 – Res: 保留
保留位,讀操作返回值為零。
? Bit 0 – SPI2X: SPI 倍速
置位后SPI 的速度加倍。若為主機( 見 Table 58),則SCK 頻率可達(dá)CPU 頻率的一半。
若為從機,只能保證fosc /4。
3)SPI 數(shù)據(jù)寄存器- SPDR