完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
芯片: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(); } } |
|
相关推荐
1个回答
|
|
STM32F405 SPI DMA接收异常的原因可能有以下几点:
1. 配置错误:确保SPI和DMA的配置正确,包括时钟、端口、数据宽度等。 2. 硬件连接问题:检查SPI和DMA的硬件连接是否正确,包括数据线、时钟线、片选线等。 3. 软件问题:检查SPI和DMA的初始化代码是否正确,以及中断处理函数是否正确处理了异常情况。 4. 外部干扰:可能存在外部电磁干扰,导致SPI通信不稳定。尝试增加屏蔽线或使用差分信号。 5. 电源问题:不稳定的电源可能导致SPI通信异常。确保电源稳定,可以考虑使用稳压器。 为了解决这个问题,你可以尝试以下步骤: 1. 仔细检查SPI和DMA的配置,确保它们正确设置。 2. 检查硬件连接,确保所有连接都正确无误。 3. 检查SPI和DMA的初始化代码,确保它们正确初始化。 4. 在中断处理函数中添加错误处理逻辑,例如: ```c void DMA2_Stream0_IRQHandler(void) { GPIOB->BSRRH = GPIO_Pin_5; // 指示中断发生 // 检查DMA中断标志 if (DMA_GetFlagStatus(DMA2_Stream0, DMA_FLAG_TEIF) != RESET) { // 传输错误中断,重置DMA DMA_ClearFlag(DMA2_Stream0, DMA_FLAG_TEIF); DMA_Cmd(DMA2_Stream0, DISABLE); // 禁用DMA DMA_Init(DMA2_Stream0, ...); // 重新初始化DMA DMA_Cmd(DMA2_Stream0, ENABLE); // 启用DMA } // 检查SPI中断标志 if (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_RXNE) != RESET) { // 接收到数据,处理数据 while (SPI_I2S_GetITStatus(SPIx, SPI_I2S_IT_RXNE) != RESET) { uint8_t data = SPI_I2S_ReceiveData(SPIx); // 处理接收到的数据 } } } ``` 5. 如果问题仍然存在,尝试使用示波器检查SPI通信信号,以确定是否存在外部干扰或硬件问题。 6. 确保电源稳定,可以考虑使用稳压器。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1781 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1085 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
732浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
596浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
557浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 10:02 , Processed in 0.815959 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号