embedded - STM32 SPI 慢速计算

标签 embedded stm32 spi

我正在使用 STM32F4 及其 SPI 与 74HC595 进行通信,如本教程中所示。不同之处在于,对于初学者来说,为了简单起见,我使用非 DMA 版本。我使用STMCubeMX来配置SPI和GPIO

问题是:我没有获得锁存 PIN,我将其设置为 PA8 以在传输过程中足够快地切换。

enter image description here

我正在使用的代码:

        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 的最大输出速度设置为非常快 enter image description here

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

  3. 对 SPI 使用 DMA(如此处所示),这实际上使其速度变慢。

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

最佳答案

How do i get that to toggle faster?

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

一些 STM32 Controller 可以自动切换其 NSS 引脚,并在传输后具有可配置的延迟。检查引用手册,如果您是其中之一,请将移位器的锁存引脚重新连接到 MCU 上的 SPIx_NSS 引脚。

不要使用 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;

关于embedded - STM32 SPI 慢速计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56440516/

相关文章:

STM32F4 : EEPROM 25LC256 management through SPI

c - 在没有arduino的情况下在atmega32上编程电子墨水显示屏

linux - 为我的嵌入式设备定义一个干净且有效的 asound.conf

c - 嵌入式应用测试代码

c - Malloc 被意外中断中断

c++ - 较新版本的 GCC 抛出 reinterpret_cast 错误

bit-manipulation - 通过位操作生成正交信号

c - 动态字符数组大小调整

c - 在 arm cortex m4 nrf52 的本地闪存中重写变量的初始化值

c - SPI 闪存编程问题