STM32F103作为SPI从设备向主设备发送数据出现故障,这么清掉DR数据?

2019-07-14 14:30发布

STM32F103作为SPI从设备向主设备发送数据,用的DMA命令:
HAL_SPI_TransmitReceive_DMA(&hspi2, (uint8_t *) spi2SendDate, (uint8_t *) spi2RecvDate, 0x0a);
主设备和从设备同时启动的话,正常。
如果从设备不断电,主设备重新上电,则从设备出现错误,是在
static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma)
这个函数的这部分里:
if (SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET,
        SPI_TIMEOUT_VALUE) != HAL_OK)
        {
            printf("spi2 cr1: %08x ", hspi->Instance->CR1);
            printf("spi2 cr2: %08x ", hspi->Instance->CR2);
            printf("spi2 sr: %08x ", hspi->Instance->SR);
            printf("spi2 dr: %08x ", hspi->Instance->DR);
            SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG);
            HAL_UART_Transmit(&huart1, (uint8_t *) &"txe err ", 0x09,
                    0xFFFF);
        }

printf语句是我后加的,串口接收如下:

txe err
spi dma err
spi2 cr1: 00000a3b
spi2 cr2: 00000003
spi2 sr: 00000000
spi2 dr: 00000000

觉得可能是从设备开启了SPI的DMA接收,接收固定长度。接收过程中,主设备重启了,从设备仍在等待,结果出错?
试着在SPI的错误回调函数里关闭DMA,并重新初始化SPI2,想下次接收时能正确,结果错误依旧。

void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
{
    if (hspi == &hspi2)
    {
        HAL_UART_Transmit(&huart1, &"spi dma err ", 0x0d, 0xFFFF);
        HAL_SPI_DMAStop(&hspi2);
//        HAL_SPI_Init(&hspi2);
        MX_SPI2_Init();
    }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
谦谦三君子
2019-07-15 03:09
用示波器测量,无论哪种情况,主设备发送的MOSI波形都是正确的。
更改了下主设备发送的频率,原来是0.1秒发送一次,修改为1秒和3秒试了试,问题依旧。
为改为3秒发送一次的话,发送过程所占用的时间,只占这3秒时间的很小的一部分,那么给主设备重新上电时,恰好遇到SPI通讯的几率应该很小。可惜现象是,试了很多次,绝大部分都是错误的情况。

一周热门 更多>