你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ST SPI DMA接收异常

[复制链接]
zhuo1000 提问时间:2015-8-3 15:53 /
   芯片:STM32f405,  做的功能是SPI的dma传输,
      
      st正常接收是这样的,0xAB 0xBA 0xA0 ~~~~~~
       假如出现异常   0x0 0xAB 0xBA 0xA0~~~~~
       出现这种情况,我如何让系统SPI恢复,能正常接收。


附:
附:
void DMA2_Stream0_IRQHandler(void)
{
  GPIOB->BSRRH = GPIO_Pin_5;
  /* Test on DMA Stream Transfer Complete interrupt */
  //if (DMA_GetFlagStatus(SPIx_RX_DMA_STREAM,SPIx_RX_DMA_FLAG_TCIF))
  if(DMA_GetITStatus(SPIx_RX_DMA_STREAM, DMA_IT_TCIF0))
  {
     DMA_ClearITPendingBit(SPIx_RX_DMA_STREAM, DMA_IT_TCIF0);  
     DMA_ClearFlag(SPIx_RX_DMA_STREAM,SPIx_RX_DMA_FLAG_TCIF);  



            ab =spi_aRxBuffer[0];
             ba =spi_aRxBuffer[1];            
            spi_head_cmd =spi_aRxBuffer[2];
       if((ab ==0xAB) &&  (ba ==0xBA ))
               {
                  spi_deal_handle(package_status);
                    ab =0;
                    ba =0;
           }
           else  //这是异常处理,但是我发现没有恢复正常
                   {
                        dma_reinit();

           }

函数如下:
void dma_reinit(void)
{
     DMA_Cmd(SPIx_RX_DMA_STREAM,DISABLE);  
     DMA_ClearFlag(SPIx_RX_DMA_STREAM,DMA_FLAG_TEIF0 | DMA_FLAG_DMEIF0 | DMA_FLAG_FEIF0);
     
}


void spi_receive_data_enable(void)
{  
  DMA_ClearFlag(SPIx_RX_DMA_STREAM,SPIx_RX_DMA_FLAG_TCIF);  
  //DMA_DeInit(SPIx_TX_DMA_STREAM);
  DMA_DeInit(SPIx_RX_DMA_STREAM);
  
  /* Configure DMA Initialization Structure */
  DMA_InitStructure.DMA_BufferSize = SPI_BUFFERSIZE ;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable ;
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull ;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC4;//DMA_MemoryBurst_Single ;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(SPIx_WIFI->DR)) ;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  /* Configure TX DMA */
//  DMA_InitStructure.DMA_Channel = SPIx_TX_DMA_CHANNEL ;
//  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral ;
//  DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)spi_aTxBuffer ;
//  DMA_Init(SPIx_TX_DMA_STREAM, &DMA_InitStructure);
  /* Configure RX DMA */
  DMA_InitStructure.DMA_Channel = SPIx_RX_DMA_CHANNEL ;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory ;
  DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)spi_aRxBuffer ;
  DMA_Init(SPIx_RX_DMA_STREAM, &DMA_InitStructure);
  
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
   SPI_Init(SPIx_WIFI, &SPI_InitStructure);
            //DMA_ClearFlag(SPIx_RX_DMA_STREAM,SPIx_RX_DMA_FLAG_TCIF);
        DMA_ITConfig(SPIx_RX_DMA_STREAM, DMA_IT_TC, ENABLE); //wyz add
        DMA_Cmd(SPIx_RX_DMA_STREAM,ENABLE);  
         SPI_I2S_DMACmd(SPIx_WIFI, SPI_I2S_DMAReq_Rx, ENABLE);      
        SPI_Cmd(SPIx_WIFI, ENABLE);
}
  spi_receive_data_enable();

  
  }
}
收藏 评论2 发布时间:2015-8-3 15:53

举报

2个回答
zhuo1000 回答时间:2015-8-3 15:55:12
我的思路是,接收异常,我清理掉错误标志,spi disable,然后重新初始化
DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)spi_aRxBuffer ; ,再使能。但是这样做,还是没能恢复正常。
你好我好大家好! 回答时间:2015-8-3 21:49:19
帮顶         

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版