SPI主机DMA接收数据出错是什么原因

2019-08-14 16:01发布

我用的是STM32F103C8T6,设置SPI为主机,DMA接收方式,左图是轮询读到正确的数据,右图是DMA接收错误的数据
SPI.png DMA.png

初始化代码:
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                //8bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;                                //4.5MHZ
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1, &SPI_InitStructure);
        SPI_NSSInternalSoftwareConfig(SPI1,  SPI_NSSInternalSoft_Set);

        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
        SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);


        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR);
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)EcgBuff;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 0;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel2, &DMA_InitStructure);

        DMA_Cmd(DMA1_Channel2, DISABLE);

        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)DummyClock;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
        DMA_Init(DMA1_Channel3, &DMA_InitStructure);
        DMA_Cmd(DMA1_Channel3, DISABLE);

        DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE);
        DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);


DMA读取len字节
void  SPIReadBuf(uint8_t *buf, uint16_t len)
{
        DMA_Cmd(DMA1_Channel2, DISABLE);
        DMA_Cmd(DMA1_Channel3, DISABLE);
        DMA1_Channel2->CNDTR = len;
        DMA1_Channel3->CNDTR = len;
        SPI1->DR;
        DMA_Cmd(DMA1_Channel2, ENABLE);       
        DMA_Cmd(DMA1_Channel3, ENABLE);

}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。