我用的是戰(zhàn)艦STM32開發(fā)板,兩個知識點,一:是STM32 SPI的原理;二:用STM32自帶的SPI對外部flash(W25Q64)的讀寫。
一:STM32 SPI的原理
先上圖:
主模式和從模式:主模式:主設備在SCK腳產生時鐘;從模式:SCK引腳用來接收從主設備傳來的時鐘。
通常SPI通過4個引腳與外部器件相連:
1、MISO:主設備數據輸入,從設備數據輸出引腳。
2、MOSI:主設備數據輸出,從設備數據輸入引腳。
3、SCLK:串口時鐘,由主設備輸出,從設備輸入。
4、NSS:從設備選擇
這里必須牢記一點:從上圖中可以看出,SPI通信是雙向的,主機往從機里面寫一個數據,他自己同時也能讀到一個數據。這點在SPI的編程中很重要,理解了很簡單!
前3個引腳根據框圖都能看明白,下面主要講第4個引腳:NSS。
NSS:從設備選擇引腳。這是一個可選的引腳,用來選擇主/從設備。他的功能是用來作為“片選引腳”,讓主設備可以單獨的與特定的從設備通訊,避免數據線上的沖突。
前面相信大家都能看明白。下圖是NSS用來選擇主從設備
先簡單說明一下NSS引腳的兩種模式:硬件NSS模式和軟件NSS模式。
硬件NSS:是指SPI自動控制SPI的片選信號,發(fā)送數據時,輸出低電平;不發(fā)送數據時,輸出高電平。但是實際操作中,NSS根本無法自己置位和復位(ST技術人員承認的bug)。故一般不用硬件NSS,因為這種方式就只能一個SPI接一個從機。
軟件NSS:就是用軟件的方式(普通IO口)控制SPI的片選,發(fā)送數據時,軟件置片選為低;結束傳輸時,軟件置片選為高。優(yōu)點:一個SPI可以控制多個從機(多個片選線)。
在上圖硬件NSS中:
1的意思:
(前提是NSS輸出被使能)當你的STM32工作為主SPI模式,這時NSS引腳被拉低,所有SPI設備的NSS引腳與這個主SPI設備的NSS相連,將自動被配置為從SPI設備。
2的意思:
當SPI配置為NSS 硬件模式時,通過檢測NSS引腳的可以實現自身主機和從機的切換。也就是說,STM32 SPI通過檢測NSS,一旦發(fā)現NSS線不為低,自己就輸出低,從而配置成為主設備。
如果STM32 SPI檢測到NSS線為低,則說明傳輸系統(tǒng)中已經有一個主設備存在了,自己就配置成從設備。
在上圖軟件NSS中:
1、可以使用STM32給的的NSS引腳(如SPI2的PB12引腳)來實現片選,這時要配置SPI_CR1寄存器來設置PB12輸出高低電平。
2、也可以用普通IO來實現片選。這里不多說,純軟件控制~
二:用STM32自帶的SPI對外部flash(W25Q64)的讀寫
用STM32自帶的SPI對W25Q64的讀寫其實并不難,主要是根據W25Q64提供的操作時序來編寫相應代碼。譬如:在讀W25Q64數據的操作是,先往W25Q64中寫要讀的指令(0x03)。然后按照W25Q64數據手冊中給的時序圖來編寫代碼。并不難~