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