STM32 SPI慢速计算

朱利安

我正在使用STM32F4及其SPI与本教程中的74HC595进行通信。区别在于初学者,为简单起见,我使用非DMA版本。我使用STMCubeMX配置SPI和GPIO

问题是:我没有获得锁存器PIN,我将其设置为PA8以在传输期间足够快地进行切换。

在此处输入图片说明

我正在使用的代码:

        spiTxBuf[0] = 0b00000010;

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);


        HAL_SPI_Transmit(&hspi1, spiTxBuf, 1, HAL_MAX_DELAY);
//        while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);

        HAL_Delay(1);

我尝试过的事情:

  1. 将引脚PA8的最大输出速度设置为非常快 在此处输入图片说明

  2. 等待SPI完成(请参见上面的注释行)

  3. 如此处所示,将DMA用于SPI,这实际上使它变慢了。

我如何才能更快地切换?我应该在SPI完成后创建并中断并在那里设置锁存器吗?

跟随莫妮卡到Codidact

我如何才能更快地切换?

如果可能,请使用硬件NSS引脚

某些STM32控制器可以NSS自动切换其引脚,发送后具有可配置的延迟。检查参考手册,如果您是其中之一,则将移位器的锁存器引脚重新连接到SPIx_NSSMCU上的引脚。

不要使用HAL

对于具有严格时序要求的任何事物,HAL都非常慢并且过于复杂。不要使用它。

只需执行参考手册中的SPI发送过程即可。

SPI->CR1 |= SPI_CR1_SPE; // this is required only once
GPIOA->BSRR = 1 << (8 + 16);
*(volatile uint8_t *)&SPI->DR = 0b00000010;
while((SPI->SR & (SPI_SR_TXE | SPI_SR_BSY)) != SPI_SR_TXE)
    ;
GPIOA->BSRR = 1 << 8;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章