我們都知道STM32中的SPI一共有四根線,分別是MISO,MOSI,NSS,SCKMISO跟MOSI是雙向數(shù)據(jù)線,SCK是時鐘線。我們下面來介紹一下關(guān)于NSS是什么作用。在標準的SPI通信協(xié)議中除了上面的三根線,還有一根是CS線即片選線,所以在這里,NSS也是片選,只不過此片選線相對復(fù)雜了點。對于STM32來說,NSS線既可以作輸入,又可以作輸出。所謂輸入就是外部NSS輸入給自己。輸出就是將NSS的信號送出去。輸入與輸出的配置,可以通過SPI_CR2寄存器的SSOE位,當此位為1時,且SPI為主機時,NSS就輸出低電平,也就是拉低,因此當其他SPI設(shè)備的NSS引腳與它相連,必然接收到低電平,則片選成功,都成為從設(shè)備了。NSS輸入時,分為兩種情況,一種是軟件模式,一種是硬件模式。軟件模式? 1 對于SPI主機來說需要設(shè)置SPI_CR1寄存器的SSM為1和SSI位為1,SSM為1是為了使能軟件管理。NSS有內(nèi)部和外部引腳。這時候,外部引腳留作他用(可以用來作為GPIO驅(qū)動從設(shè)備的片選信號)。內(nèi)部NSS引腳電平則通過SPI_CRL寄存器的SSI位來驅(qū)動。SSI位為1是為了使NSS內(nèi)電平為高電平。STM32手冊上說,要保持MSTR和SPE位為1,也就是說要保持主機模式,只有NSS接到高電平信號時,這兩位才能保持置1.也就是說對于STM32的SPI,要保持為主機狀態(tài),內(nèi)部輸入的NSS電平必須為高。當然這里在硬件模式下也是如此。2 對于SPI 從機來說? ??主機自己的內(nèi)部NSS高電平解決了,那么SPI從機的NSS片選低電平也得解決啊。如果從機選擇STM32的一個SPI,譬如主機選為SPI1,從機選為SPI2,則要按照以下操作手冊說,NSS引腳在完成字節(jié)傳輸之前必須連接到一個低電平信號。在軟件模式下,則需要設(shè)置SPI_CR1寄存器的SSM為1(軟件管理使能)和SSI位為0.果然如此。SSI必須要為0,也就是SPI2的片選為低,則片選成功。
對于主機,我們的NSS可以直接接到高電平,對于從機,NSS接低就可以。當然我們上面提過當一個主機的SSOE為1時,主機工作在輸出模式,而且NSS拉低了,我們要讓從機片選,只要將CS接到主機的NSS上,CS自動拉低。
? SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex;
? SPI_InitStructure.SPI_Mode =SPI_Mode_Master; ? ??//這里設(shè)置SPI1為主模式,設(shè)置SSI為1
? SPI_InitStructure.SPI_DataSize =SPI_DataSize_8b;
? SPI_InitStructure.SPI_CPOL =SPI_CPOL_Low;
? SPI_InitStructure.SPI_CPHA =SPI_CPHA_2Edge;
? SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;? ? ?? ?//這里設(shè)置SSM為1,軟件管理??? SPI_InitStructure.SPI_BaudRatePrescaler =SPI_BaudRatePrescaler_4;
? SPI_InitStructure.SPI_FirstBit =SPI_FirstBit_LSB;
? SPI_InitStructure.SPI_CRCPolynomial =7;
? SPI_Init(SPI1,&SPI_InitStructure);
?
? SPI_InitStructure.SPI_Mode =SPI_Mode_Slave;//這里設(shè)置SPI2為從模式SSI為0
?//因為SPI2和SPI1用的是同一個SPI_InitStructure,所以SSM位已經(jīng)為1
? SPI_Init(SPI2,&SPI_InitStructure);
對于SPI2的配置,和SPI1用的是同一個結(jié)構(gòu)體,只需要把模式和SSI一改就行,其他的譬如軟件使能,還有時序什么的都不用改。這樣SPI1和SPI2就配置好了。以后就可以傳輸數(shù)據(jù)了。