1)sip管理模式分為:硬件管理和軟件管理;主要由NSS 、SSI、SSM決定;
NSS是芯片上一個實實在在的引腳,SSI和SSM是SPI_CR1控制器里的的位。
值得注意的是:NSS分外部引腳和內部引腳的。外部NSS引腳當然就是與GPIO 共用的引腳,芯片上可以肉眼看到這個引腳;內部NSS引腳就是STM32芯片里集成的SPI模塊引腳,我們肉眼是看不見的它的,換句話說,真正與SPI通信控制器連接的是內部NSS引腳,外部NSS引腳不能直接連到芯片內部的SPI模塊,而是先連接內部NSS引腳,通過內部NSS引腳作用SPI模塊。
2)基本概述:
位SSM在SPI_CR1控制器里默認為0;
SSM可以控制內部NSS引腳與SSI(一個寄存器,軟件模式)相連,還是與NSS外部引腳(真正的STM32引腳,硬件模式)相連。真正作用的是內部NSS引腳(內部NSS引腳才真正連接到SPI通信控制器上)
當SSM=0,說明使用硬件管理模式,此時NSS有效,內部NSS引腳與外部NSS引腳相連,忽視SSI位,對SPI_CR1的 SSI位 的寫操作無效;
當SSM=1,說明使用軟件管理模式,此時SSI位有效,內部NSS引腳與SSI相連,忽視外部NSS引腳,我們可以把外部NSS引腳當做普通IO口;
3)配置:
SPI從模式的配置(MSTR=0)
1.硬件模式:SSM=0,當外部NSS為低電平時,內部NSS也為低電平,此時可以傳送數據。
外部NSS引腳必須作為輸入模式,此引腳就成為了該器件的片選引腳:
外部NSS引腳設置為復用功能+無上下拉,外部NSS引腳需要手動連接一個低電平,此時可以傳送數據,低電平必須維持到SPI關閉為此,相當片選該從器件;
外部NSS引腳設置為復用功能+無上下拉,外部NSS引腳手動連接一個高電平,內部NSS引腳被外部高電平拉高,此時不可以轉送數據,因為相當取消從器件的片選;
2.軟件模式:SSM=1,並SSI=0.STM32芯片讓內部NSS引腳為低電平,此時可以傳送數據。
外部NSS引腳被釋放,可做普通IO作為其他用途使用。
SPI主模式的配置(MSTR=1)
1.硬件模式:SSM=0
A:輸入模式:SSOE=0,在外部NSS引腳為高電平,即內部NSS引腳也為高電平時,才能進行數據傳輸。 如果要使能從設備,還需要一個GPIO引腳。
在此情況下,外部NSS要是被接低電平,則會進入主模式故障,MSTR會清零,由主模式進入從模式。
外部NSS引腳需要配置為復用+無上下拉,且外部NSS引腳必須接入一個高電平,它才能維持主模式狀態。
B:輸出模式:SSOE=1, 外部NSS引腳會被芯片自動輸出低電平,使能從設備,進行數據傳輸。 不需要額外的GPIO引腳就能控制從設備。
外部NSS引腳需要配置為復用功能,再把此引腳連接從器件的CS引腳,因為此情況下,外部NSS引腳就相當於片選引腳了。
2.軟件模式:SSM=1,SSI=1,將內部NSS引腳設置為高電平。這樣隨時可以傳輸數據。當然多數情況還需要一個GPIO引腳輸出低電平,來使能從設備,讓從設備可以接收數據。
3.需要注意的是,SSOE位必須在主模式下配置才有效。它的作用是在硬件管理的主模式下是否開啟外部NSS引腳的輸入、輸出模式。這是芯片手冊上說的。
綜上所述,NSS引腳就是片選CS引腳是很不負責任的說法。
本人也是參考下面此文章,此作者前半部分講的非常好,但不能全信此作者講,特別是他所寫的后半部分,有些個人認為還是有些缺陷:
https://blog.csdn.net/andylauren/article/details/52259703
SPI_CR2 :
SPI_CR1: