STM32H7 在原子例程上把DMA-串口发送 改成DMA-SPI2发送,只能发送一次,再启动发送没有现象了。求大佬帮我,不甚感激

2019-07-20 01:00发布

本帖最后由 在路上(起航) 于 2019-2-18 13:46 编辑

HAL库用的是V1.3版本
下面是DMA初始化
[mw_shl_code=applescript,true]void SPI2_DMA_Config(DMA_Stream_TypeDef *DMA_Streamx)
{
        if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
        {
        __HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能        
        }else
        {
        __HAL_RCC_DMA1_CLK_ENABLE();//DMA1时钟使能
        }
   

    //Tx DMA配置
    SPI2TxDMA1_Handler.Instance=DMA_Streamx;                            //数据流选择
        SPI2TxDMA1_Handler.Init.Request=DMA_REQUEST_SPI2_TX;                                //SPI2发送DMA
    SPI2TxDMA1_Handler.Init.Direction=DMA_MEMORY_TO_PERIPH;             //存储器到外设
    SPI2TxDMA1_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //外设非增量模式
    SPI2TxDMA1_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //存储器增量模式
    SPI2TxDMA1_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE;    //外设数据长度:8位
    SPI2TxDMA1_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE;       //存储器数据长度:8位
    SPI2TxDMA1_Handler.Init.Mode=DMA_NORMAL;                            //外设流控模式
    SPI2TxDMA1_Handler.Init.Priority=DMA_PRIORITY_HIGH;                 //中等优先级
    SPI2TxDMA1_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    SPI2TxDMA1_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;      
    SPI2TxDMA1_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //存储器突发单次传输
    SPI2TxDMA1_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //外设突发单次传输


    HAL_DMA_DeInit(&SPI2TxDMA1_Handler);   
    HAL_DMA_Init(&SPI2TxDMA1_Handler);
   
    __HAL_LINKDMA(&SPI2_Handler,hdmatx,SPI2TxDMA1_Handler);    //将DMA与USART1联系起来(发送DMA)
   

} [/mw_shl_code]

下面是初始化SPI2
[mw_shl_code=applescript,true]void SPI2_Init(void)
{
    SPI2_Handler.Instance=SPI2;                      //SP2
    SPI2_Handler.Init.Mode=SPI_MODE_MASTER;          //设置SPI工作模式,设置为主模式
    SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES_TXONLY;//设置SPI单向或者双向的数据模式:SPI设置为双线模式
    SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT;    //设置SPI的数据大小:SPI发送接收8位帧结构
    SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_LOW; //串行同步时钟的空闲状态为高电平
    SPI2_Handler.Init.CLKPhase=SPI_PHASE_1EDGE;      //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    SPI2_Handler.Init.NSS=SPI_NSS_SOFT;              //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
    SPI2_Handler.Init.NSSPMode=SPI_NSS_PULSE_DISABLE;//NSS信号脉冲失能
    SPI2_Handler.Init.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE;  //SPI主模式IO状态保持使能
    SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4;//定义波特率预分频的值:波特率预分频值为256
    SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB;     //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
    SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE;     //关闭TI模式
    SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
    SPI2_Handler.Init.CRCPolynomial=7;               //CRC值计算的多项式
    HAL_SPI_Init(&SPI2_Handler);
   
    __HAL_SPI_ENABLE(&SPI2_Handler);                 //使能SPI2
//    SPI2_ReadWriteByte(0Xff);                        //启动传输
}[/mw_shl_code]

下面是循环调用,100MS调用一次
[mw_shl_code=applescript,true]HAL_SPI_DMAStop(&SPI2_Handler);      //传输完成以后关闭串口DMA
        HAL_SPI_Transmit_DMA(&SPI2_Handler, showBuff, 36); //开启DMA传输[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。