關(guān)于STM32中SPI硬件的NSS配置
? ????NSS:從器件選擇,即可作輸入也可作輸出。主機(master)利用此引腳選擇需要通信的從機(slave)。感覺這個概念較復雜,本人閱讀了一些文章后寫下自己的見解,如有不對請指出。另外,本文默認片選低電平使能,我不太清楚有沒有高電平使能的設備。。。。。。? ??
? ? ? ? 首先讓我們看看NSS的結(jié)構(gòu)圖,其中最重要的是左側(cè)標紅的NSS引腳和右側(cè)標紅的內(nèi)部NSS。對于主機,其內(nèi)部NSS需要被設置為高電平;對于需要通信的從機,其內(nèi)部NSS應為低電平。

0. 英文縮寫
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SSM:軟件從設備管理 (Software slave management)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SSI:內(nèi)部從設備選擇 (Internal slave select)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SSOE:SS輸出使能 (SS output enable)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MSTR:主設備選擇 (Master selection)
1. 主機寄存器配置
1.1 軟件從設備管理(SPI_CR1寄存器的SSM置1)
1.1.1 NSS輸入
? ? ? ? 根據(jù)官方文檔,當SSM被置1時,NSS input 的電平由 SSI bit 的值決定(官方文檔翻譯的不準確,困擾我很久),這個很好理解,就是那個數(shù)據(jù)選擇器選擇來自SSI bit的輸入。那么SSI bit該怎么設置呢?我在查看了官方庫函數(shù)發(fā)現(xiàn):
? ? ? ? 將STM32配置為主機會將SSI bit置1(上面的紅色數(shù)字,對應SPI_CRI寄存器的第8位),那么現(xiàn)在 NSS input 就被設置為了1,Internal nss 被設置為1,STM32被配置為主設備。
1.1.2 NSS輸出
? ? ? ? 在配置輸出前,我們需要知道一般1個主設備需要管理多個從設備,在某一時刻主機只能與一個從機通信。
? ? ? ? (1)通過任意一個GPIO來控制(SSM = 1, SSOE = 0)
? ? ? ? 假如我們有10個設備,那么我們可以將這10個設備的片選(chip slect)引腳與STM32的10個引腳相連,我們?nèi)绻胍湍硞€設備通信,只需將這個設備的CS拉低,其他設備的CS保持高電平就可以了。
? ? ? ? 如果采用GPIO控制片選的話,NSS引腳就自由了,它也可以當作普通GPIO用了。
? ? ? ? (2)通過SPI的NSS引腳控制(SSM = 1, SSOE = 1)
? ? ? ?此模式不存在,因為軟件從設備管理(SSM為1)時無法控制NSS引腳的輸出(看圖中的那行英文字)。所以對于軟件從設備管理,主機想要選擇從機只能通過GPIO。另外,手動將需要通信的從機的片選拉低也行,但不推薦。
1.2 硬件從設備管理(SPI_CR1寄存器的SSM置0)
? ? ? ? ?1.2.1 NSS輸入
? ? ? ? 當SSM被置0時,NSS input 的電平由NSS引腳決定。前面我們討論過,對于主機,其內(nèi)部NSS需要被設置為高電平。那么這個輸入就一定為高電平,例如將NSS引腳通過上拉電阻連接VCC。
? ? ? ? ?1.2.2 NSS輸出
? ? ? ? (1)允許NSS輸出(SSM = 0, SSOE = 1)
? ? ? ? 此配置僅在設備以主模式運行時使用。當主機啟動通信時,NSS引腳被驅(qū)動為低電平,并且在SPI被禁用之前一直處于低電平。
? ? ? ? 作為硬件從設備管理的主機,要求NSS引腳為高電平;當開始通信后,NSS又被拉低。這里我不太懂,請大家?guī)臀铱纯础?/p>
? ? ? ? (2)禁止NSS輸出(SSM = 0, SSOE = 0)
? ? ? ? 此配置允許在主模式下運行的設備具有多主功能。此時應采用GPIO控制從機的片選。

2. 從機寄存器配置
2.1 軟件從設備管理(SPI_CR1寄存器的SSM置1)
? ? ? ? 此時 NSS input 的信號來自于 SSI bit(由程序設置),且 SSI bit 必須設置為0。要不然都是主機,通信個毛啊......
2.2 硬件從設備管理(SPI_CR1寄存器的SSM置0)
? ? ? ? 此時 NSS input 的信號由NSS引腳決定,從機可以受控于其他主設備。

3. 使用推薦
? ? ? ? 個人覺得選擇軟件從器件管理還比較簡單,只需把SSM置1,并用GPIO控制片選就可以了(概念清晰,其他模式把我都繞暈了)。
? ? ? ? 最后,有時候還是得看英文文檔啊,雖然看的頭都大了......
