STM32 SPI MISO保持高电平

问题描述 投票:0回答:1

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

我的问题是下一个问题:当将SPI配置为在较低带宽上工作时(预分频器为256或128),2个MCU按预期进行通信。随着速度的提高,在MOSI线上收集越来越多的垃圾。基本上,MISO线路无法按预期工作。 MISO线应保持低位时保持高位(看图片)。

主代码:

#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)enter image description here

embedded stm32 spi
1个回答
0
投票

[处于空闲状态时,MISO无关紧要,没什么可读取的。不用管

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

© www.soinside.com 2019 - 2024. All rights reserved.