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