
芯片: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(); } } |
DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)spi_aRxBuffer ; ,再使能。但是这样做,还是没能恢复正常。