天天看點

對51系列單片機SPI總線的認識

* 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的下降沿開始,上升沿結束。

繼續閱讀