簡體   English   中英

如何在 stm32f4 上使用硬件 NSS (SPI)?

[英]How to use hardware NSS (SPI) on stm32f4?

所以我嘗試將硬件 NSS 信號與 HAL 庫一起使用,但我找不到任何使 NSS 引腳具有低電平或高電平的函數。 我也試圖在 HAL 文檔中找到答案,但也沒有信息。 互聯網上的所有示例都只包含軟件 NSS。 應該如何使用硬件NSS?

我在某處讀到只要 SPI 主機被啟用,NSS 就會被驅動為低電平,如果 SPI 主機被禁用,則再次驅動為高電平。 我使用 ST 的 HAL 庫(Cube/CubeMX)和 STM32L476 並輪詢 SPI1 進行了嘗試。 傳輸前的初始化和傳輸后的取消初始化沒有設置 NSS 引腳 - 但花費了很多時間:

初始化結構:

hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi1.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;

傳輸順序:

HAL_SPI_Init( &hspi1 );
HAL_SPI_TransmitReceive( &hspi1, btx, brx, l, 5 ); // timeout 5msec;
while( hspi1.State == HAL_SPI_STATE_BUSY );  // wait for xmission complete
HAL_SPI_DeInit( &hspi1 );

所以我決定使用 GPIO 手動設置引腳(在初始化中使用 SPI_NSS_SOFT):

HAL_GPIO_WritePin( NSS1_GPIO_Port, NSS1_Pin, GPIO_PIN_RESET ); // NSS1 low
HAL_SPI_TransmitReceive( &hspi1, btx, brx, l, 5 ); // timeout 5msec;
while( hspi1.State == HAL_SPI_STATE_BUSY );  // wait xmission complete
HAL_GPIO_WritePin( NSS1_GPIO_Port, NSS1_Pin, GPIO_PIN_SET ); // NSS1 high

我使用阻塞傳輸(無 DMA 或中斷),因為它足夠快並且沒有其他任務等待。 事實證明,DMA 設置在 20MHz 下僅發送 24 個字節所需的時間長得令人無法接受。 IT 將是一個可接受的替代方案。

據我在 STM32L4xx 手冊第 38.4.12/13 章中看到,在每個字節/字傳輸后自動 NSS 變高,因此不適用於在整個傳輸過程中保持 NSS 低的較長流。

您可以將 NSS 引腳用作標准 GPIO 並使用中斷例程驅動它。您應該通過軟件完成該部分。首先將 Nss 置於低電平,然后發送您的幀 (HAL_SPI_Transmit) 從設備獲取所有幀后,使用 HAL_SPI_RxCpltCallback 和將 Nss 置於該中斷的高位。

不要忘記將 GPIO 引腳連接到從機上的 Nss 引腳。

如果 HiZ [未記錄],NSS 引腳可能需要上拉電阻

查看您的 STM32 芯片的參考手冊。 我不知道它們是否都一樣,但根據我的一個(STM32WB55xx)和一個我能夠找到一個公共網絡鏈接( STM32F0 )......

請參閱 NSS 引腳管理的 SPI 功能描述(我鏈接到的 STM32F0 文檔的第 28.5.5 節),其中描述了三種模式:

  • 軟件 NSS 管理(SPIx_CR1 寄存器 SSM 位 = 1)。 內部從設備選擇信息由寄存器 SPIx_CR1 中的 SSI 位在內部驅動。 外部 NSS 引腳可供應用程序免費使用。

  • 硬件 NSS 管理(SSM 位 = 0)。 這有兩種可能的配置,具體取決於寄存器 SPIx_CR1 中的 SSOE 位:

    • NSS 輸出使能 (SSOE = 1)。 僅在 MCU 為主時使用。 NSS 信號在主模式 (SPE=1) 下啟用 SPI 后立即驅動為低電平,並保持低電平直到禁用 SPI (SPE=0)。 如果激活 NSS 脈沖模式,則可以在連續通信之間生成脈沖。 SPI 無法使用此 NSS 設置在多主配置中工作
    • NSS 輸出禁用 (SSOE = 0)。 如果 MCU 是主控,這允許多主控能力。 如果 NSS 被拉低,SPI 進入主模式故障狀態,器件自動重新配置為從模式。 在從機模式下,NSS 引腳用作標准的“片選”輸入,當 NSS 線處於低電平時選擇從機。

查看我的 SoC 的標頭,軟模式是 SSM=1(軟件 NSS 管理)。 硬輸出模式為 SSM=0 和 SSOE=1(NSS 輸出使能)。 硬輸入模式全為零(NSS 輸出禁用)。

如果您使用的是硬輸出模式,您可能還想查看 NSS 脈沖模式(我鏈接到的 STM32F0 文檔中的第 28.5.12 節)。 它描述了(帶有時序圖)系統如何在大多數時間將 NSS 保持為低電平,並在數據幀之間將其脈沖為高電平。 如果您的設備使用 NSS/CS 來同步數據幀,那么這可能很有用。 或者可能不會,如果您的設備通過中止當前操作對 NSS 變高做出反應,因為文本似乎表明它將在您傳輸的每個單詞之間而不是緩沖區之間脈沖 NSS。

不幸的是,這看起來不是最靈活的實現。 根據您的應用程序,您可能會發現將其置於軟模式並通過 GPIO 切換 NSS 引腳更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM