STM32H7 SPI+DMA传输错误

2019-07-20 03:45发布

  请问一下STM32H7的SPI+DMA该如何配置,之前按照同样的方式配置F4和F7的时候都没有什么问题,这次换了H7的芯片,在移植程序的时候一只卡在SPI+DMA这里无法通过,不加DMA单调试SPI的时候收发都没有问题,就是加上DMA以后一只发生DMA传输错误,请问这是什么原因造成的,附上DPI+DMA的配置代码void SPI1_Init(void)
{
        SPI1_Handler.Instance=SPI1;                         //SP1
        SPI1_Handler.Init.Mode=SPI_MODE_MASTER;             //设置SPI工作模式,设置为主模式
        SPI1_Handler.Init.Direction=SPI_DIRECTION_2LINES;   //设置SPI单向或者双向的数据模式:SPI设置为双线模式
        SPI1_Handler.Init.DataSize=SPI_DATASIZE_16BIT;       //设置SPI的数据大小:SPI发送接收16位帧结构
        SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_LOW;     //串行同步时钟的空闲状态为低电平
        SPI1_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;         //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
        SPI1_Handler.Init.NSS=SPI_NSS_SOFT;                 //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32;//定义波特率预分频的值:波特率预分频值为8
        SPI1_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI1_Handler.Init.TIMode=SPI_TIMODE_DISABLE;        //关闭TI模式
        SPI1_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
        SPI1_Handler.Init.CRCPolynomial=7;                  //CRC值计算的多项式  

        HAL_SPI_Init(&SPI1_Handler);               
}

void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
        GPIO_InitTypeDef GPIO_Initure;
  if(hspi->Instance == SPI1)
        {
          __HAL_RCC_SPI1_CLK_ENABLE();
                __HAL_RCC_GPIOA_CLK_ENABLE();
                __HAL_RCC_GPIOC_CLK_ENABLE();

    /**SPI1 GPIO Configuration   
    PA4     ------> SPI1_NSS
    PA5     ------> SPI1_SCK
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    */               
               
                // PA5 PA6 PA7
                GPIO_Initure.Pin=  GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 ;                        //PA5 PA6 PA7
                GPIO_Initure.Mode=GPIO_MODE_AF_PP;                //复用推挽输出
                GPIO_Initure.Pull=GPIO_NOPULL;                       
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;                //高速
                GPIO_Initure.Alternate=GPIO_AF5_SPI1;        //复用为spi1
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PI       

    //片选信号 PA4
          GPIO_Initure.Pin= GPIO_PIN_4;                        //PA4
                GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;                //推挽输出
                GPIO_Initure.Pull=GPIO_NOPULL;                       
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;                //高速
                HAL_GPIO_Init(GPIOA,&GPIO_Initure);                   //初始化PA       
                SPI_CS_HIGH;   //片选取消
               
    //中断引脚  Pc4
    GPIO_Initure.Pin = GPIO_PIN_4;
    GPIO_Initure.Mode = GPIO_MODE_INPUT;       
                GPIO_Initure.Pull=GPIO_PULLDOWN;                       
                GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH;                //高速
                HAL_GPIO_Init(GPIOC,&GPIO_Initure);                   //初始化PB       
          __HAL_SPI_ENABLE(&SPI1_Handler);    //启动SPI       

   SPI1_DMA_Config();
       
        }
}




void SPI1_DMA_Config(void)
{
         u8 res = HAL_ERROR;
          __HAL_RCC_DMA2_CLK_ENABLE();
       
          
    //rx DMA配置
    hdma_spi1_rx.Instance=DMA2_Stream2;                            //数据流选择
    hdma_spi1_rx.Init.Request=DMA_REQUEST_SPI1_RX;                        //通道选择
    hdma_spi1_rx.Init.Direction=DMA_PERIPH_TO_MEMORY;               //外设到内存
    hdma_spi1_rx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    hdma_spi1_rx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    hdma_spi1_rx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //外设数据长度:8位
    hdma_spi1_rx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;       //存储器数据长度:8位
    hdma_spi1_rx.Init.Mode=DMA_NORMAL;                            //外设普通模式
    hdma_spi1_rx.Init.Priority=DMA_PRIORITY_VERY_HIGH;               //优先级 非常高.
          hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
               
    res = HAL_DMA_Init(&hdma_spi1_rx);
                __HAL_LINKDMA(&SPI1_Handler,hdmarx,hdma_spi1_rx);    //将DMA与SPI2联系起来(接受DMA)
       
       
           //tx
       
    //tx DMA配置
    hdma_spi1_tx.Instance=DMA2_Stream3;                            //数据流选择
    hdma_spi1_tx.Init.Request=DMA_REQUEST_SPI1_TX;                        //通道选择
    hdma_spi1_tx.Init.Direction=DMA_MEMORY_TO_PERIPH;               //外设到内存
    hdma_spi1_tx.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    hdma_spi1_tx.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    hdma_spi1_tx.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //外设数据长度:16位
    hdma_spi1_tx.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;       //存储器数据长度:16位
    hdma_spi1_tx.Init.Mode=DMA_NORMAL;                            //外设普通模式
    hdma_spi1_tx.Init.Priority=DMA_PRIORITY_VERY_HIGH;               //优先级 非常高.
                hdma_spi1_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
       
    res = HAL_DMA_Init(&hdma_spi1_tx);
          __HAL_LINKDMA(&SPI1_Handler,hdmatx,hdma_spi1_tx);    //将DMA与SPI2联系起来(接受DMA)
       
       

                HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 1, 3);
                HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
               
                HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 1, 4);
                HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);
       

}







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