概要
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; //返回收到的數據
}
操作方法
- 使能芯片
- 發送命令
- 發送地址
- 讀寫數據
以讀取指定地址數據爲例
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 開發指南(寄存器版)