xiaowang11 发表于 2018-12-3 16:26:55

在STM32F4上面SPI2 DMA 接受不到数据

大家好,我最近遇到一个问题,SPI2 DMA 接受不到数据,不知道哪里遇到了问题,向大神们请教一下。比较急,谢谢!
下面是我的代码:
DCMI 通过DMA给 SPI发数据,DCMI有数据发出,且数据正确。但是SPI没有接受到数据,且LCD没有显示摄像头端的数据(spi2驱动LCD是ok的)。
DCMI端代码:这是ok的通过FSMC验证过。
      DMA_InitTypeDefDMA_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
      //spi tx -> DMA_Channel_3
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
      DMA_DeInit(DMA2_Stream1);//µÈ´ýDMA2_Stream1
      while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}

DMA_InitStructure.DMA_Channel = DMA_Channel_1;//ͨµÀ1 DCMIͨµÀ
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&DCMI->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&SPI2->DR;
      DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = DMA_BufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);


SPI DMA端配置代码:
void SPI2_DMAInit (void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

    DMA_DeInit(DMA1_Stream3);
    DMA_DeInit(DMA1_Stream4);
                while (DMA_GetCmdStatus(DMA1_Stream3) != DISABLE){printf("-");}
                        
    DMA_InitStructure.DMA_Channel= DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI2->DR));               
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)SPI_RXBUFFER;   
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;                     
    DMA_InitStructure.DMA_BufferSize = 1;                                                               
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;         
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA1_Stream3, &DMA_InitStructure);

//    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)SPI_TXBUFFER;       //
//    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;                     
//    DMA_InitStructure.DMA_BufferSize = 8;                               //
//    DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
//    DMA_Init(DMA1_Stream4, &DMA_InitStructure);

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

    DMA_ITConfig(DMA1_Stream3, DMA_IT_TC | DMA_IT_TE, ENABLE);
    DMA_ITConfig(DMA1_Stream4, DMA_IT_TC | DMA_IT_TE, ENABLE);

    NVIC_InitTypeDefNVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannel =ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    DMA_Cmd(DMA1_Stream3, ENABLE);
    DMA_Cmd(DMA1_Stream4, ENABLE);
                printf("DMA 000 \n");
}


void DMA1_Stream3_IRQHandler (void)
{
    if (DMA_GetITStatus(DMA1_Stream3, DMA_IT_TCIF3) == SET)
    {
      DMA_ClearFlag(DMA1_Stream3, DMA_IT_TC);
      DMA_ClearFlag(DMA1_Stream4, DMA_IT_TC);
      DMA_ClearITPendingBit(DMA1_Stream3, DMA_IT_TCIF3);
      DMA_ClearITPendingBit(DMA1_Stream4, DMA_IT_TCIF4);

      SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, DISABLE);
      SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Rx, DISABLE);
                        printf("DMA 111 \n");
    }
                printf("DMA 222 \n");
}


xiaowang11 发表于 2018-12-3 16:37:17

第一次使用SPI DMA有点菜,希望高手能够指点指点。

cruelfox 发表于 2018-12-13 09:50:15

DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&SPI2->DR;

这一句有问题啊,RAM地址怎么写成SPI寄存器了?
页: [1]
查看完整版本: 在STM32F4上面SPI2 DMA 接受不到数据