使用 SPI 未在正确的时刻设置芯片使能

Posted

技术标签:

【中文标题】使用 SPI 未在正确的时刻设置芯片使能【英文标题】:Chip Enable not setting at right moment using SPI 【发布时间】:2020-02-10 13:35:59 【问题描述】:

我试图在 SPI 传输之前将引脚的芯片启用 (CE) 设置为高电平,并在完成传输(TX 或 RX)后返回低电平。我正在使用 NRF24L01 和 Nucleo-F303。据说当 CE 高时,我可以对 NRF24L01 进行真正的 SPI 传输。但是,即使在真正的传输尚未完成之前,CE 引脚也会暂时变低,然后再次变高

其余的引脚似乎正在相应地同步。我如何在进行 SPI 传输之前让 CE 引脚准确地变高,然后在完成或不再进行传输时变低。

这是我尝试解决问题的方法

int main(void)

    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_SPI1_Init();
    MX_USART1_UART_Init();

    HAL_Delay(5);

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
    uint8_t data[6] = 0x5C, 0xBA, 0xBB, 0x4D, 0x5E, 0xFB,;
    uint8_t data1[6] = 0;

    while (1)
    
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET);

        if(HAL_SPI_TransmitReceive(&hspi1, data, data1, 6, HAL_MAX_DELAY) == HAL_OK)
        
            HAL_Delay(1);
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
        
    

这就是我配置 GPIO_PIN_3 的方式

    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // digital Output
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

【问题讨论】:

【参考方案1】:

通常 SPI 的 Slave Select 信号为低电平有效,但您可以通过位 SSIOP 更改此行为(它是 STM32H7 上的位名称,在其他 STM32 上可能不同)。

关于您的另一个问题,从选择信号在两个字节之间变为非活动状态,您可以通过位 SSOM 更改该行为。

参考手册中通常很好地描述了不同的 SPI 配置。

【讨论】:

【参考方案2】:

我最终选择了裸机,因为这些库延迟了很多并且有很多抽象层

【讨论】:

如果您的代码不必在不同型号的 STM32 uCs 上运行,这是正确的决定

以上是关于使用 SPI 未在正确的时刻设置芯片使能的主要内容,如果未能解决你的问题,请参考以下文章

NVIDIA Jetson之SPI功能使能

stm32 SPI介绍和配置

SPI怎么区分主从? 两个设备之间通过SPI连接,根据啥来定义主从?

JSON响应未在单元格内显示

STM32G0学习手册——SPI总线使用

IOS 蓝牙未在 iPhone 设置页面中发现