【總結】SPI

概要

SPI,Serial Peripheral interface,串行外圍設備接口。是一種串行,全雙工,同步的通信總寫。
常用的SPI接口外設有,EEPROM,FLASH,RTC,ADC ,數字信號處理器,數字信號解碼器等。

SPI接口外設通信流程

這裏寫圖片描述

SPI的4根管腳定義
MISO:主設備數據輸入,從設備數據輸出
MOSI:主設備數據輸出,從設備數據輸入
SCLK:時鐘信號,主設備產生
CS:從設備片選信號由主設備控制

SPI主從設備數據的交換是同時進行的。例如,主設備一位寄存器中的數據位01010101,從設備移位寄存器中的數據位10101010,每經過一個脈衝,從設備把最低位【1】通過MISO移入主設備的移位寄存器最低位上,其他位右移,同時,主設備原移位寄存器中的最高位通過MOSI移入從設備的最高位,其他位左移。

因此,外設的寫操作和讀操作是同步完成的。如果只進行寫操作,主機只需忽略接收到的字節,同理,若主機要讀取從機的一個字節,必須向從機發送一個空字節引發從機的傳輸。

//SPI1 讀寫一個字節
//TxData:要寫入的字節
//返回值:讀取到的字節
u8 SPI1_ReadWriteByte(u8 TxData)
{                    
    while((SPI1->SR&1<<1)==0);      //等待發送區空 
    SPI1->DR=TxData;                //發送一個byte  
    while((SPI1->SR&1<<0)==0);      //等待接收完一個byte  
    return SPI1->DR;                //返回收到的數據                   
}

這裏寫圖片描述

操作方法

  1. 使能芯片
  2. 發送命令
  3. 發送地址
  4. 讀寫數據

以讀取指定地址數據爲例

void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   
{ 
    u16 i;                                              
    W25QXX_CS=0;                            //使能器件   
    SPI1_ReadWriteByte(W25X_ReadData);         //發送讀取命令   
    SPI1_ReadWriteByte((u8)((ReadAddr)>>16));  //發送24bit地址    
    SPI1_ReadWriteByte((u8)((ReadAddr)>>8));   
    SPI1_ReadWriteByte((u8)ReadAddr);   
    for(i=0;i<NumByteToRead;i++)
    { 
        pBuffer[i]=SPI1_ReadWriteByte(0XFF);   //循環讀數  
    }
    W25QXX_CS=1;                              
} 

W25X FLASH芯片的命令定義如下

這裏寫圖片描述

參考

STM32F3與 F4 系列 Cortex M4 內核編程手冊
STM32F4xxx中文參考手冊
STM32F4xxx英文參考手冊
STM32F4 開發指南(寄存器版)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章