gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:19:22 28 4
gpt4 key购买 nike

所以我尝试将硬件 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 保持低电平。

关于arm - 如何在 stm32f4 上使用硬件 NSS (SPI)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35780290/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com