STM32的SPI外設片選只有一個怎么破?
[導讀][導讀]大家好,我是逸珺。之前用STM32的SPI需要控制很多外部芯片,可是一個SPI的外設只有一個片選,要實現(xiàn)獨立片選一主多從,怎么實現(xiàn)呢?SPI總線拓撲一般地,SPI總線按照下圖方式進行連接,一主多從。如上圖:每個從設備都有獨立的片選引腳,主機同一時間段內(nèi),與一個從設備進行通...
[導讀] 大家好,我是逸珺。之前用STM32的SPI需要控制很多外部芯片,可是一個SPI的外設只有一個片選,要實現(xiàn)獨立片選一主多從,怎么實現(xiàn)呢?
如上圖:
那么要實現(xiàn)前面說的一主多從,怎么辦呢?有朋友說,直接用GPIO去模擬不就可以了。不錯,SPI總線要用GPIO模擬還是很容易的,但是這樣做波特率做不高,需要占用CPU時間,效率比較低!而用SPI外設控制器,底層bit流的收發(fā)由外設控制器實現(xiàn),用GPIO模擬則需要CPU參與。 這種方案,省引腳。但是要移位控制,相對獨立片選效率還是低不少。
SPI總線拓撲
一般地,SPI總線按照下圖方式進行連接,一主多從。如上圖:
- 每個從設備都有獨立的片選引腳,主機同一時間段內(nèi),與一個從設備進行通信,也即選中一個從設備。
- MOSI/MISO/SCLK并聯(lián)在一起
- MISO須是三態(tài)門,當從設備未選中時,該腳須設置為高阻態(tài),而不能是輸出態(tài),否則會影響總線!
- 對于MOSI/SCLK,雖然并聯(lián)在一起,但是由于僅一個輸出,多輸入。
怎么破呢?
菊花鏈拓撲
獨立片選拓撲
SPI外設的MOSI、MISO、SCK還是照用不誤,但是片選我們不用,設置成通用輸出模式,再用其他的GPIO片選從芯片即可。上代碼看看:void?HAL_SPI_MspInit(SPI_HandleTypeDef*?hspi)
{
??GPIO_InitTypeDef?GPIO_InitStruct?=?{0};
??if(hspi->Instance==SPI1)
??{
????__HAL_RCC_SPI1_CLK_ENABLE();
????__HAL_RCC_GPIOA_CLK_ENABLE();
????/**SPI1?GPIO?Configuration
????PA5?????------>?SPI1_SCK
????PA6?????------>?SPI1_MISO
????PA7?????------>?SPI1_MOSI
????PA15?????------>?SPI1_NSS?但是這里不用
????*/
????GPIO_InitStruct.Pin?=?GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
????GPIO_InitStruct.Mode?=?GPIO_MODE_AF_PP;
????GPIO_InitStruct.Pull?=?GPIO_NOPULL;
????GPIO_InitStruct.Speed?=?GPIO_SPEED_FREQ_VERY_HIGH;
????GPIO_InitStruct.Alternate?=?GPIO_AF5_SPI1;
????HAL_GPIO_Init(GPIOA,?