STM32 | SPI从机发送数据时出现问题

时间:2020-08-27 21:53:41

标签: stm32 spi

严格地说,我的SPI外围设备有问题,该板配置为SPI从机,该板发送数据以响应来自其他配置为主机的板的传入消息。

从站(STM32F407VG-发现):

  • SPI初始化功能:
void spi2_peripheral_config_init(void)
{
    LL_SPI_InitTypeDef spi2_peripheral_config = {
        .TransferDirection = LL_SPI_FULL_DUPLEX,
        .Mode = LL_SPI_MODE_SLAVE,
        .DataWidth = LL_SPI_DATAWIDTH_8BIT,
        .ClockPolarity = LL_SPI_POLARITY_LOW,
        .ClockPhase = LL_SPI_PHASE_1EDGE,
        .NSS = LL_SPI_NSS_HARD_INPUT,
        .BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV2,
        .BitOrder = LL_SPI_MSB_FIRST,
        .CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE,
        .CRCPoly = 0x00
    };
    LL_SPI_Init(SPI2, &spi2_peripheral_config);
    LL_SPI_Enable(SPI2);
}
  • SPI发送数据功能:
void spi2_send_data(uint8_t *tx_buffer, uint32_t bytes_to_send)
{
    for (uint32_t index = 0; index < bytes_to_send; index++) {
        while (LL_SPI_IsActiveFlag_TXE(SPI2) == 0) {
            ;
        }
        LL_SPI_TransmitData8(SPI2, tx_buffer[index]);
    }
}
  • SPI接收数据功能:
void spi2_receive_data(uint8_t *rx_buffer, uint32_t bytes_to_receive)
{
    for (uint32_t index = 0; index < bytes_to_receive; index++) {
        while (LL_SPI_IsActiveFlag_RXNE(SPI2) == 0) {
            ;
        }
        rx_buffer[index] = LL_SPI_ReceiveData8(SPI2);
    }
}

在主应用程序内部,我有以下代码,等待主服务器的传入数据:

    char received_message[17] = {0};
    spi2_receive_data((uint8_t *)received_message, 17);
    while (strcmp(received_message, "Hello STM32F407!") != 0) {
        ;
    }
    status_led_turn_on();
    
    uint8_t response_code = 0x55;
    while (1) {
        spi2_send_data(&response_code, 1);
    }

此代码正常工作,但是如果我要发送一些数据,即从设备->主设备,则MISO行会变得“怪异”,它无法发送任何数据,如果是,则完全是垃圾。下面我附上USB逻辑分析仪的图片:

USB logic analyzer picture 1

USB logic analyzer picture 2

我知道要从从机获取数据,主机必须提供时钟信号,这意味着主机必须发送一些虚拟数据以从从机读取数据。

但是当我从主机向从机发送一个虚拟字节时,MISO无法提供任何反馈。

什么会导致这种问题?

1 个答案:

答案 0 :(得分:0)

非常合乎逻辑。主机总是在传输到从机时接收数据。因此,您需要先清除FIFO,然后再接收任何数据。

void spi2_receive_data(uint8_t *rx_buffer, uint32_t bytes_to_receive)
{
    while(LL_SPI_IsActiveFlag_RXNE(SPI2)) LL_SPI_ReceiveData8(SPI2);
    for (uint32_t index = 0; index < bytes_to_receive; index++) 
    {
        spi2_send_data((uint8_t[]){0}, 1); // dummy send
        while (LL_SPI_IsActiveFlag_RXNE(SPI2) == 0);
        rx_buffer[index] = LL_SPI_ReceiveData8(SPI2);
    }
}