* UART、 I2C 和 SPI 是單片機系統中最常用的三種通信協定。*
1、SPI簡介:
SPI 是一種高速的、全雙工、同步通信總線,标準的 SPI 也僅僅使用 4 個引腳,常用于單片機和 EEPROM、FLASH、實時時鐘、數字信号處理器等器件的通信。 SPI 通信原理比 I2C要簡單,它主要是主從方式通信,這種模式通常隻有一個主機和一個或者多個從機,标準的 SPI 是 4 根線,分别是 SSEL( 片選,也寫作 SCS)、 SCLK( 時鐘,也寫作 SCK)、 MOSI( 主機輸出從機輸入Master Output/Slave Input) 和 MISO( 主機輸入從機輸出 Master Input/Slave Output)。
SSEL:從裝置片選使能信号。如果從裝置是低電平使能的話,當拉低這個引腳後,從裝置就會被選中,主機和這個被選中的從機進行通信。
SCLK:時鐘信号,由主機産生,和 I2C通信的 SCL 有點類似。
MOSI:主機給從機發送指令或者資料的通道。
MISO:主機讀取從機的狀态或者資料的通道。
2、程式設計
- 發送一個位元組
void SPISendByte(unsigned char ch)
{
unsigned char idata n = ; //向SDA上發送一位資料位元組,共八位
SCLK = ; //時鐘置高
SSEL = ; //選擇從機
while(n--)
{
delayNOP();
SCLK = ; //時鐘置低
if((ch & ) == ) //若要發送的資料最高位為1則發送位1
{
MOSI = ; //傳送位1
}
else
{
MOSI = ; //否則傳送位0
}
delayNOP();
ch = ch << ; //資料左移一位
SCLK = ; //時鐘置高
}
}
- 接收一個位元組
unsigned char SPIreceiveByte()
{
unsigned char idata n = ; // 從MISO線上讀取一上資料位元組,共八位
unsigned char tdata;
SCLK = ; //時鐘為高
SSEL = ; //選擇從機
while(n--)
{
delayNOP();
SCLK = ; //時鐘為低
delayNOP();
tdata = tdata << ; // 左移一位,或_crol_(temp,1)
if(MISO == )
{
tdata = tdata | ;
}// 若接收到的位為1,則資料的最後一位置1
else
{
tdata = tdata & ;
}// 否則資料的最後一位置0
SCLK = ;
}
return(tdata);
}
每次開始,時鐘線SCLK都為高電平,MISO是資料接收位,先接受最高位,通過左移8次,得到資料,MOSI是資料發送位,先發送資料最高位。
資料的發送和接收都是在SCLK=0;與SCLK=1;語句之間執行,即:
SCLK = 0;
資料的收發與移位
SCLK = 1;
即資料的收發都是以SCLK的下降沿開始,上升沿結束。