STM32的SPI外設(shè)片選只有一個怎么破?
SPI總線拓?fù)?/span>
一般地,SPI總線按照下圖方式進(jìn)行連接,一主多從。如上圖:
- 每個從設(shè)備都有獨立的片選引腳,主機(jī)同一時間段內(nèi),與一個從設(shè)備進(jìn)行通信,也即選中一個從設(shè)備。
- MOSI/MISO/SCLK并聯(lián)在一起
- MISO須是三態(tài)門,當(dāng)從設(shè)備未選中時,該腳須設(shè)置為高阻態(tài),而不能是輸出態(tài),否則會影響總線!
- 對于MOSI/SCLK,雖然并聯(lián)在一起,但是由于僅一個輸出,多輸入。
怎么破呢?
菊花鏈拓?fù)?/span>
這種方案,省引腳。但是要移位控制,相對獨立片選效率還是低不少。獨立片選拓?fù)?/span>
SPI外設(shè)的MOSI、MISO、SCK還是照用不誤,但是片選我們不用,設(shè)置成通用輸出模式,再用其他的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,?