首页 > 解决方案 > STM32 SPI MISO 保持高电平

问题描述

我正在尝试在 2 个 stm32 设备之间进行基本的 SPI 通信。HAL 用于此目的。想法是每 1 秒在 2 个 MCU 之间交换数据。所以我创建了定时器,目的是每 1 秒产生一次中断(定时器用于设置启动 SPI 通信的标志)。MCU 配置为在全双工模式下工作(1 个主设备和 1 个从设备)。

接下来是我的问题:当 SPI 配置为在较低带宽上工作时(当预分频器为 256 或 128 时),2 个 MCU 按预期进行通信。随着速度的增加,数据在 MOSI 线上收集越来越多的垃圾。基本上味噌生产线不能按预期工作。味噌线在应该低的时候保持高(看图片)。

主码:

#define SPI_SLAVE_SYNBYTE     (0xAC)
#define SPI_MASTER_SYNBYTE    (0x53)

bool flagSpi1 = false;
uint8_t rxSpi[10] = {0};
uint8_t txSpi[10] = "Milan";

void Synch(void)
{
    uint8_t txAck = SPI_MASTER_SYNBYTE;
    uint8_t rxAck = 0;
    do
    {
        if(HAL_SPI_TransmitReceive_DMA(&hspi3, (uint8_t *)&txAck, (uint8_t *)&rxAck, 1) != HAL_OK)
        {
            Error_Handler();
        }
        while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
    }while(rxAck != SPI_SLAVE_SYNBYTE);
}
void Receive_Spi_Master(void)
{
    if(HAL_SPI_Receive_DMA(&hspi3, rxSpi, 10) != HAL_OK)
    {
        Error_Handler();
    }
    while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
}
void Transmit_Spi_Master(void)
{
    if(HAL_SPI_Transmit_DMA(&hspi3, txSpi, 10) != HAL_OK)
    {
        Error_Handler();
    }
    while(HAL_SPI_GetState(&hspi3) != HAL_SPI_STATE_READY){}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM5)
    {
        flagSpi1 = true;
    }
}
main(void)
{
    Init_Part();      

    while(1)
    {
        if(flagSpi1)
        {
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
            Synch();
            Receive_Spi_Master();
            Synch();
            Transmit_Spi_Master();
            Synch();
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);
            Send_Data_To_Terminal_Via_Uart(rxSpi);
            HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_15);
            flagSpi1 = false;
        }
   }   

}

奴隶代码:

#define SPI_SLAVE_SYNBYTE     (0xAC)
#define SPI_MASTER_SYNBYTE    (0x53)

uint8_t txSpi[10] = "Test";
uint8_t rxSpi[10];

void Synch(void)
{
    uint8_t txAck = SPI_SLAVE_SYNBYTE;
    uint8_t rxAck = 0;

    do
    {
        if(HAL_SPI_TransmitReceive_DMA(&hspi1, (uint8_t *)&txAck, (uint8_t *)&rxAck, 1) != HAL_OK)
        {
            Error_Handler();
        }
        while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}

    }while(rxAck != SPI_MASTER_SYNBYTE);
}

void Transmit_Spi_Slave(void)
{
    if(HAL_SPI_Transmit_DMA(&hspi1, txSpi, 10) != HAL_OK)
    {
        Error_Handler();
    }
    while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
}

void Receive_Spi_Slave(void)
{
    if(HAL_SPI_Receive_DMA(&hspi1, rxSpi, 10) != HAL_OK)
    {
        Error_Handler();
    }
    while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY){}
}

main(void)
{
    Init_Part();

    while (1)
    {
        if(!HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4))
        {
            Synch();
            Transmit_Spi_Slave();
            Synch();
            Receive_Spi_Slave();
            Synch();
            HAL_Delay(3);
        }
    }
}

当代码“工作”时(它工作但我认为 MISO 线是错误的,这张图片代表低速 SPI - 预分频器是 256) 在此处输入图像描述

标签: embeddedstm32spi

解决方案


空闲时,味噌没关系,什么都不应该读它。忽略那个。

当你得到垃圾时,你的屏幕是什么样的?您的所有引脚都配置为高速吗?两个设备可以高速通信吗?您能否向我们展示一些基本配置为低速的东西,然后是相同的高速输出?


推荐阅读