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