1. 程式人生 > >stm32的SPI設定步驟,SPI配置引數

stm32的SPI設定步驟,SPI配置引數



用stm32的庫進行深入

SPI介面主要應用在EEPROM,FLASH,實時時鐘,AD轉換器,還有數字訊號處理器和數字訊號解碼器之間。
四根線
MISO 主裝置資料輸入,從裝置資料輸出。
MOSI 主裝置資料輸出,從裝置資料輸入。
SCLK時鐘訊號,由主裝置產生。
CS從裝置片選訊號,由主裝置控制。

外設的寫操作和讀操作是同步完成的。如果只進行寫操作,主機只需忽略接收到的位元組

時鐘極性CPOL對傳輸協議沒有重大的影響,代表串行同步時鐘的空閒狀態下的電平。
時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行資料傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。
SPI主模組和與之通訊的外裝置時鐘相位極性應該一致。

使用STM32的SPI讀取SPIFLASH晶片(W25Q64),
第一步  配置SPI引腳 使能引腳及SPI時鐘
第二步 配置SPI---工作模式+資料格式+時鐘頻率、極性
 設定為主機模式
 資料格式-8位
 SCK時鐘極性及取樣方式
 SPI時鐘頻率
 資料格式-MSB在前還是LSB在前

typedef struct
{
uint16_t SPI_Direction;
uint16_t SPI_Mode;
uint16_t SPI_DataSize;
uint16_t SPI_CPOL;
uint16_t SPI_CPHA;
uint16_t SPI_NSS;  
uint16_t SPI_BaudRatePrescaler; 
uint16_t SPI_FirstBit;   
uint16_t SPI_CRCPolynomial;
}SPI_InitTypeDef;
SPI_Direction;通訊方式(全雙工,半雙工,序列發序列收)
 SPI_Mode:主還是從  ,模式選擇,SPI_Mode_Master or SPI_Mode_Slave
SPI_DataSize:資料幀長度選擇,8位或16位
SPI_CPOL:時鐘極性,(空閒態的電平)
SPI_CPHA:時鐘相位,序列時鐘第一個跳變沿取樣資料,或第二個跳變沿~~SPI_CPHA_2Edge
SPI_NSS:NSS訊號由硬體控制還是軟體控制,這裡SPI_NSS_Soft
SPI_BaudRatePrescaler:設定SPI波特率預分頻值,也就是決定SPI的時鐘的引數,從不分頻道256分頻8個可選值,初始化的時候我們選擇256分頻值SPI_BaudRatePrescaler_256, 傳輸速度為36M/256=140.625KHz。
SPI_FirstBit:資料傳輸順序,MSB在前或LSB在前
SPI_CRCPolynomial:是用來設定CRC校驗多項式,提高通訊可靠性,大於1即可。

9個引數。
定義這個結構,
SPI_InitTypeDef  SPI_InitStructure;
每個引數都選合適了
呼叫SPI_Init(SPI2,&SPI_InitStructure);
根據指定的引數初始化外設SPIx暫存器,

初始化完了,還有個開關,現在我們來使能這個SPI2口通訊,
SPI_Cmd(SPI2,ENABLE);
使能這個外設

現在可以用了,發資料吧,
void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);
uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

發資料,接收資料,傳輸傳輸,我們經常要判斷這個資料是否傳輸完成了,是不是,傳送區是否為空等等,
SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE);