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