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

nvbavucw  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

我尝试将引脚的芯片使能(CE)设置为在SPI传输前变为高电平,并在完成传输后返回低电平(TX或RX)。我使用NRF24L01和Nucleo-F303。据说当CE高时,那就是我可以向NRF24L01进行真实的SPI传输的时候。然而,CE引脚暂时变为低电平,然后甚至在真实的传输尚未完成之前再次变为高电平
x1c 0d1x的数据
其余的引脚似乎是同步相应的。我如何让CE引脚准确地去高之前,使SPI传输,然后低时,我完成或不做任何更多的传输。
以下是我试图解决这个问题的方法

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);

bbmckpt7

bbmckpt71#

通常,SPI的从机选择信号为低电平有效,但您可以通过位SSIOP(它是STM32 H7上的位的名称,在其他STM32上可能不同)更改此行为。
关于您的另一个问题,从机选择信号在两个字节之间变为非活动状态,您可以通过位SSOM改变该行为。
不同的SPI配置通常在参考手册中有很好的描述。

eqzww0vc

eqzww0vc2#

最后我选择了裸金属,因为库的延迟太大,而且有太多的抽象层

相关问题