SPI介面原理與配置(轉)
本實驗採用W25Q64晶片
W25Q64是華邦公司推出的大容量SPI FLASH產品,其容量為64Mb。該25Q系列的器件在靈活性和效能方面遠遠超過普通的序列快閃記憶體器件。W25Q64將8M位元組的容量分為128個塊,每個塊大小為64K位元組,每個塊又分為16個扇區,每個扇區4K個位元組。W25Q64的最小擦除單位為一個扇區,也就是每次必須擦除4K個位元組。所以,這需要給W25Q64開闢一個至少4K的快取區,這樣必須要求晶片有4K以上的SRAM才能有很好的操作。
W25Q64的擦寫週期多達10W次,可將資料儲存達20年之久,支援2。7~3。6V的電壓,支援標準的SPI,還支援雙輸出/四輸出的SPI,最大SPI時鐘可達80Mhz。
一。SPI介面原理
(一)概述
高速,全雙工,同步的通訊匯流排。
全雙工:可以同時傳送和接收,需要2條引腳
同步: 需要時鐘引腳
片選引腳:方便一個SPI介面上可以掛多個裝置。
總共四根引腳。
(二)SPI內部結構簡明圖
MISO: 做主機的時候輸入,做從機的時候輸出
MOSI:做主機的時候輸出,做從機的時候輸入
主機和從機都有一個移位暫存器,在同一個時鐘的控制下主機的最高位移到從機的最高位,同時從機的最高位往前移一位,移到主機的最低位。在一個時鐘的控制下主機和從機進行了一個位的交換,那麼在8個時鐘的控制下就交換了8位,最後的結果就是兩個移位暫存器的資料完全交換。
在8個時鐘的控制下,主機和從機的兩個位元組進行了交換,也就是說主機給從機發送一個位元組8個位的同時,從機也給主機傳回來了8個位,也就是一個位元組。
(三)SPI介面框圖
上面左邊部分就是在時鐘控制下怎麼傳輸資料,右邊是控制單元,還包括左下的波特率發生器。
(四)SPI工作原理總結
(五)SPI的特徵
(六)從選擇(NSS)腳管理
兩個SPI通訊首先有2個數據線,一個時鐘線,還有一個片選線,只有把片選拉低,SPI晶片才工作,片選引腳可以是SPI規定的片選引腳,還可以透過軟體的方式選擇任意一個IO口作為片選引腳,這樣做的好處是:比如一個SPI介面上掛多個裝置,比如掛了4個裝置,第二個用PA2,第三個用PA3,第四個用PA4作為片選,我們 跟第二個裝置進行通訊的時候,只需要把第二個片選選中,比如拉低,其他裝置的片選都拉高,這樣就實現了一個SPI介面可以連線個SPI裝置,戰艦開發板上就是透過這種方法來實現的。
(七)時鐘訊號的相位和極性
時鐘訊號的相位和極性是透過CR暫存器的 CPOL 和 CPHA兩個位確定的。
CPOL:時鐘極性,設定在沒有資料傳輸時時鐘的空閒狀態電平。CPOL置0,SCK引腳在空閒時為低電平,CPOL置1,SCK引腳在空閒時保持高電平。
CPHA:時鐘相位 設定時鐘訊號在第幾個邊沿資料被採集
CPHA=1時:在時鐘訊號的第二個邊沿
CPOL=1,CPHA=1, CPOL=1表示時鐘訊號在沒有資料傳輸時即空閒時的狀態為高電平。如果CPHA=1,那麼資料就在時鐘訊號的第二個邊沿即上升沿的時候被採集。
CPOL= 0,CPHA=1, CPOL=0表示時鐘訊號在沒有資料傳輸時即空閒時的狀態為低電平。 如果CPHA=1,那麼資料就在時鐘訊號的第二個邊沿即下降沿的時候被採集。
CPHA=0時:在時鐘訊號的第一個邊沿
CPOL=1,CPHA=0, CPOL=1表示時鐘訊號在沒有資料傳輸時即空閒時的狀態為高電平。如果CPHA=1,那麼資料就在時鐘訊號的第一個邊沿即下降沿的時候被採集。
CPOL= 0,CPHA=0, CPOL=0表示時鐘訊號在沒有資料傳輸時即空閒時的狀態為低電平。 如果CPHA=1,那麼資料就在時鐘訊號的第一個邊沿即上升沿的時候被採集。
為什麼要配置這兩個引數?
因為SPI外設的從機的時鐘相位和極性都是有嚴格要求的。所以我們要根據選擇的外設的時鐘相位和極性來配置主機的相位和極性。必須要與從機匹配。
(八)資料幀的格式和狀態標誌
資料幀格式:根據CR1暫存器的LSBFIRST位的設定,資料可以MSB在前也可以LSB在前。
根據CR1暫存器的DEF位,每個資料幀可以是8位或16位。
(九)SPI中斷
(十)SPI引腳配置 (3個SPI)
引腳的工作模式設定
引腳必須要按照這個表格配置。
二。SPI暫存器庫函式配置
(一)常用暫存器
(二)SPI相關庫函式
STM32的SPI介面可以配置為支援SPI協議或者支援I2S音訊協議。預設是SPI模式,可以透過軟體切換到I2S方式。
常用的函式:
1。 void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);//SPI的初始化
2。 void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); //SPI使能
3。 void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); //開啟中斷
4。 void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);//通 過DMA傳輸資料
5。 void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); //傳送資料
6。 uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); //接收資料
7。 void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize); //設定資料是8位還是16位
8。 其他幾個狀態函式
void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);//SPI的初始化
結構體成員變數比較多,這裡我們挑取幾個重要的成員變數講解一下:
第一個引數 SPI_Direction 是用來設定 SPI 的通訊方式,可以選擇為半雙工,全雙工,以及序列發和序列收方式,這裡我們選擇全雙工模式 SPI_Direction_2Lines_FullDuplex。
第二個引數 SPI_Mode 用來設定 SPI 的主從模式,這裡我們設定為主機模式 SPI_Mode_Master,當然有需要你也可以選擇為從機模式 SPI_Mode_Slave。
第三個引數 SPI_DataSiz 為 8 位還是 16 位幀格式選擇項,這裡我們是 8 位傳輸,選擇SPI_DataSize_8b。
第四個引數 SPI_CPOL 用來設定時鐘極性,我們設定串行同步時鐘的空閒狀態為高電平所以我們選擇 SPI_CPOL_High。
第五個引數 SPI_CPHA 用來設定時鐘相位,也就是選擇在串行同步時鐘的第幾個跳變沿(上升或下降)資料被取樣,可以為第一個或者第二個條邊沿採集,這裡我們選擇第二個跳變沿,所以選擇 SPI_CPHA_2Edge
第六個引數 SPI_NSS 設定 NSS 訊號由硬體(NSS 管腳)還是軟體控制,這裡我們透過軟體控
制 NSS 關鍵,而不是硬體自動控制,所以選擇 SPI_NSS_Soft。
第七個引數 SPI_BaudRatePrescaler 很關鍵,就是設定 SPI 波特率預分頻值也就是決定 SPI 的時
鐘的引數 , 從不分頻道 256 分頻 8 個可選值,初始化的時候我們選擇 256 分頻值
SPI_BaudRatePrescaler_256, 傳輸速度為 36M/256=140。625KHz。
第八個引數 SPI_FirstBit 設定資料傳輸順序是 MSB 位在前還是 LSB 位在前, ,這裡我們選擇
SPI_FirstBit_MSB 高位在前。
第九個引數 SPI_CRCPolynomial 是用來設定 CRC 校驗多項式,提高通訊可靠性,大於 1 即可。
設定好上面 9 個引數,我們就可以初始化 SPI 外設了。
初始化的範例格式為:
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure。SPI_Direction = SPI_Direction_2Lines_FullDuplex; //雙線雙向全雙工
SPI_InitStructure。SPI_Mode = SPI_Mode_Master; //主 SPI
SPI_InitStructure。SPI_DataSize = SPI_DataSize_8b; // SPI 傳送接收 8 位幀結構
SPI_InitStructure。SPI_CPOL = SPI_CPOL_High;//串行同步時鐘的空閒狀態為高電平
371
SPI_InitStructure。SPI_CPHA = SPI_CPHA_2Edge;//第二個跳變沿資料被取樣
SPI_InitStructure。SPI_NSS = SPI_NSS_Soft; //NSS 訊號由軟體控制
SPI_InitStructure。SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //預分頻 256
SPI_InitStructure。SPI_FirstBit = SPI_FirstBit_MSB; //資料傳輸從 MSB 位開始
SPI_InitStructure。SPI_CRCPolynomial = 7; //CRC 值計算的多項式
SPI_Init(SPI2, &SPI_InitStructure); //根據指定的引數初始化外設 SPIx 暫存器
(三)程式配置步驟
三。W25Qxx配置講解
(一)電路圖
片選用的PB12
W25Q64 是華邦公司推出的大容量SPI FLASH 產品,W25Q64 的容量為 64Mb,該系列還有 W25Q80/16/32 等。ALIENTEK 所選擇的 W25Q64 容量為 64Mb,也就是 8M 位元組。(1M=1024K)
W25Q64 將 8M 的容量分為 128 個塊(Block),每個塊大小為 64K 位元組,每個塊又分為 16個扇區(Sector),每個扇區 4K 個位元組。W25Q64 的最少擦除單位為一個扇區,也就是每次必須擦除 4K 個位元組。這樣我們需要給 W25Q64 開闢一個至少 4K 的快取區,這樣對 SRAM 要求比較高,要求晶片必須有 4K 以上 SRAM 才能很好的操作。
W25Q64 的擦寫週期多達 10W 次,具有 20 年的資料儲存期限,支援電壓為 2。7~3。6V,W25Q64 支援標準的 SPI,還支援雙輸出/四輸出的 SPI,最大 SPI 時鐘可以到 80Mhz(雙輸出時相當於 160Mhz,四輸出時相當於 320M),更多的 W25Q64 的介紹,請參考 W25Q64 的DATASHEET。
在往一個地址寫資料之前,要先把這個扇區的資料全部讀出來儲存在快取裡,然後再把這個扇區擦除,然後在快取中修改要寫的資料,然後再把整個快取中的資料再重新寫入剛才擦除的扇區中。
便於學習和參考再給大家分享些spi 的資料
stm32之SPI通訊
SPI通訊協議驅動norFlash