新聞中心

STM32 SPI 注意要點

作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
覺得SPI很簡單,所以從來沒有去仔細去看就直接用了,這次在調(diào)一個芯片的時候出現(xiàn)了一個比較奇怪的問題,以為是程序邏輯的問題,浪費了好幾天的時間都沒有找到原因。今天乖乖查閱了一些手冊,最后在《STM32不完全手冊》里找到了線索,現(xiàn)在索性對SPI做個總結(jié)。首先說最近碰到的問題。

問題一:錯以為SPI的讀數(shù)據(jù),直接讀取SPIx->DR寄存器就可以完成。
這個問題我一直沒注意,十分慚愧。原來SPI的時鐘只有在往DR寄存器里面寫數(shù)據(jù)的時候才會產(chǎn)生,讀是不會產(chǎn)生的(暫時沒有從哪個資料中得到確認,不過我猜就是這樣)。所以要讀取slave發(fā)過來的數(shù)據(jù),master必須先發(fā)一個“DUMMY”數(shù)據(jù),這個數(shù)據(jù)內(nèi)容不重要,目的只是為了產(chǎn)生一組clock給 slave,slave的數(shù)據(jù)就沿著這一組clock給發(fā)了出來。
master給slave讀寫數(shù)據(jù)的過程是這樣的:
寫:master對DR寫數(shù)據(jù),產(chǎn)生clock,同時數(shù)據(jù)從MOSI管腳移位發(fā)送到slave的MOSI管腳;
讀:master對DR寫DUMMy,產(chǎn)生clock,同時DUMMy由MOSI發(fā)給slave(這個數(shù)據(jù)沒有意義),同時讀取的數(shù)據(jù)從slave的MISO管腳移位發(fā)送到master的MISO管腳。

問題二:在配置為雙線全雙工的時候,如上面所說,在master寫數(shù)據(jù)的時候,其實stm32的SPI同時也往master的DR寄存器里面讀進數(shù)據(jù)(讀寫雖然都是DR,其實是兩個不同的寄存器)。對這點的忽略,就是這次問題產(chǎn)生的原因。
我在對采集芯片讀取數(shù)據(jù)之前,需要向芯片發(fā)送一個讀取數(shù)據(jù)的指令,在發(fā)送指令后,理論來說采集芯片會自動等待發(fā)送數(shù)據(jù)過來,只要我stm32這邊發(fā)一個 DUMMy產(chǎn)生一組clock,然后就可以從DR中讀取數(shù)據(jù)。但是由于在發(fā)送讀取指令的時候,其實STM32也同時也把一個無用的數(shù)據(jù)讀到DR里面去了,這個數(shù)據(jù)在沒有被取走之前,是不會再接受新的數(shù)據(jù)的,所以在后來發(fā)送DUMMY的時候,讀寄存器DR并沒有更新,所以讀到的數(shù)據(jù)自然是錯的。
解決方法是,在發(fā)送指令之后,讀一次數(shù)據(jù),清除DR,以便接收下個數(shù)據(jù)。


下面對SPI其他要點做一些總結(jié)。
管腳定義:
MISO:主設(shè)備輸入/從設(shè)備輸出
MOSI:主設(shè)備輸出/從設(shè)備輸入
SCK:串口時鐘,作為主設(shè)備的輸出,從設(shè)備的輸入
NSS:從設(shè)備選擇

對于NSS,對于從設(shè)備,輸入低電平表示選擇該從設(shè)備,這個信號在硬件NSS模式時,由NSS管腳提供;在軟件NSS模式時,由內(nèi)部SSI位控制,NSS管腳可以用作普通IO使用。
對于主設(shè)備,如果NSS輸出被使能,NSS會輸出低電平,可以與從設(shè)備的NSS相連,當從設(shè)備為硬件NSS模式時,將自動變成從SPI設(shè)備(不允許多主環(huán)境);如果NSS輸出被關(guān)閉:允許操作于多主環(huán)境。


關(guān)鍵詞: STM32SPI注意要

評論


技術(shù)專區(qū)

關(guān)閉