avr單片機SPI串行外設接口初始化配置及說明
/*
PB7 SCK (SPI 總線的串行時鐘 )
PB6 MISO (SPI 總線的主機輸入 / 從機輸出信號 )
PB5 MOSI (SPI 總線的主機輸出 / 從機輸入信號 )
PB4 SS (SPI 從機選擇引腳 )
SCK – 端口 B, Bit 7 SCK :SPI 通道的主機時鐘輸出,從機時鐘輸入端口。工作于從機模式時,不論 DDB7 設
置如何,這個引腳都將設置為輸入。工作于主機模式時,這個引腳的數據方向由 DDB7 控
制。設置為輸入后,上拉電阻由 PORTB7 控制。
MISO – 端口 B, Bit 6 MISO :SPI 通道的主機數據輸入,從機數據輸出端口。工作于主機模式時,不論 DDB6 設
置如何,這個引腳都將設置為輸入。工作于從機模式時,這個引腳的數據方向由 DDB6 控
制。設置為輸入后,上拉電阻由 PORTB6 控制。
MOSI – 端口 B, Bit 5 MOSI : SPI 通道的主機數據輸出,從機數據輸入端口。工作于從機模式時,不論 DDB5 設
置如何,這個引腳都將設置為輸入。當工作于主機模式時,這個引腳的數據方向由 DDB5
控制。設置為輸入后,上拉電阻由 PORTB5 控制。
SS – 端口 B, Bit 4 SS: 從機選擇輸入。工作于從機模式時,不論 DDB4設置如何,這個引腳都將設置為輸入。
當此引腳為低時 SPI 被激活。工作于主機模式時,這個引腳的數據方向由 DDB4 控制。設
置為輸入后,上拉電阻由 PORTB4 控制。
簡單定義:
引腳 方向SPI主機 方向SPI從機
MOSI 用戶定義 輸入
MISO 輸入 用戶定義
SCK 用戶定義 輸入
SS 用戶定義 輸入
//*************************************SPI 控制寄存器SPCR***************************************
SPI 控制寄存器SPCR
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
SPIE: 使能SPI 中斷
置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中斷使能位置位,就會引發
SPI 中斷
SPE: 使能SPI
SPE 置位將使能SPI。進行任何SPI 操作之前必須置位SPE
DORD: 數據次序
DORD 置位時數據的LSB 首先發送;否則數據的MSB 首先發送
MSTR: 主/ 從選擇
MSTR置位時選擇主機模式,否則為從機。如果MSTR為"1”,SS配置為輸入,但被拉
低,則MSTR 被清零,寄存器SPSR 的SPIF 置位。用戶必須重新設置MSTR 進入主機
模式。
CPOL: 時鐘極性
CPOL 置位表示空閑時SCK 為高電平;否則空閑時SCK 為低電平。
CPOL 功能
CPOL 起始沿結束沿 CPOL
0 上升沿下降沿 0
1 下降沿上升沿 1
SPR1, SPR0: SPI 時鐘速率選擇1 與0
確定主機的SCK 速率。SPR1 和SPR0 對從機沒有影響。SCK 和振蕩器的時鐘頻率fosc
關系如下表所示:
SCK 和振蕩器頻率的關系
SPI2X SPR1 SPR0 SCK
0 0 0 fosc/4
0 0 1 fosc/16
0 1 0 fosc/64
0 1 1 fosc/128
1 0 0 fosc/2
1 0 1 fosc/8
1 1 0 fosc/32
1 1 1 fosc/64
CPHA :數據模式
決定數據是在 SCK 的起始沿采樣還是在 SCK 的結束沿采樣
相對于串行數據, SCK 的相位和極性有4 種組合。CPHA 和CPOL 控制組合的方式。SPI
數據傳輸格式。每一位數據的移出和移入發生于SCK不同的信號跳變沿,以保證有足夠的時
間使數據穩定。
CPOL 與CPHA 功能
模式 起始沿 結束沿 SPI
CPOL 0 CPHA=0 采樣(上升沿) 采樣(下降沿) 0
CPOL 0 CPHA=1 設置(上升沿) 采樣(下降沿) 1
CPOL 1 CPHA=0 采樣(下降沿) 采樣(上升沿) 2
CPOL 1 CPHA=1 采樣(下降沿) 采樣(上升沿) 3
///****************************SPI 狀態寄存器SPSR*********************************************
SPI 狀態寄存器SPSR
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
SPIF WCOL – – – – – SPI2X
SPIF: SPI 中斷標志
串行發送結束后,SPIF 置位。若此時寄存器SPCR 的SPIE 和全局中斷使能位置位
SPI中斷即產生。如果SPI 為主機, SS 配置為輸入,且被拉低, SPIF 也將置位
進入中斷服務程序后SPIF自動清零?;蛘呖梢酝ㄟ^先讀SPSR,緊接著訪問SPDR來對
SPIF清零。
WCOL: 寫碰撞標志
在發送當中對SPI 數據寄存器SPDR寫數據將置位WCOL。WCOL可以通過先讀SPSR,緊接
著訪問SPDR 來清零。
Bit 5..1 – Res: 保留
保留位,讀操作返回值為零。
SPI2X: SPI 倍速
置位后SPI 的速度加倍。若為主機,則SCK 頻率可達CPU 頻率的一半。若為從機,
只能保證fosc /4。
ATmega16的SPI接口同時還用來實現程序和EEPROM的下載和上載。
//********************************SPI 數據寄存器SPDR**************************************
SPI 數據寄存器SPDR
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
MSB LSB
SPI 數據寄存器為讀/寫寄存器,用來在寄存器文件和SPI移位寄存器之間傳輸數據。寫
寄存器將啟動數據傳輸,讀寄存器將讀取寄存器的接收緩沖器。
*/
#include
#include
#pragma interrupt_handler SPI_END: iv_SPI_STC
void SPI_MasterInit(void)// 初始化為主機
{
DDRB = (1<
void SPI_MasterTransmit(char cData) //主機數據發送
{
SPDR = cData; // 啟動數據傳輸
while(!(SPSR & (1<
void SPI_SlaveInit(void)// 將SPI初始化為從機
{
DDRB = (1<
char SPI_SlaveReceive(void)//從機數據接收
{
while(!(SPSR & (1<
}
void SPI_END()
{
//add your code here!
}
評論