完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
STM32F103作为SPI从设备向主设备发送数据,用的DMA命令:
HAL_SPI_TransmitReceive_DMA(&hspi2, (uint8_t *) spi2SendDate, (uint8_t *) spi2RecvDate, 0x0a); 主设备和从设备同时启动的话,正常。 如果从设备不断电,主设备重新上电,则从设备出现错误,是在 static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) 这个函数的这部分里: if (SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) { printf("spi2 cr1: %08xrn", hspi->Instance->CR1); printf("spi2 cr2: %08xrn", hspi->Instance->CR2); printf("spi2 sr: %08xrn", hspi->Instance->SR); printf("spi2 dr: %08xrn", hspi->Instance->DR); SET_BIT(hspi->ErrorCode, HAL_SPI_ERROR_FLAG); HAL_UART_Transmit(&huart1, (uint8_t *) &"txe errrn", 0x09, 0xFFFF); } printf语句是我后加的,串口接收如下: txe err spi dma err spi2 cr1: 00000a3b spi2 cr2: 00000003 spi2 sr: 00000000 spi2 dr: 00000000 觉得可能是从设备开启了SPI的DMA接收,接收固定长度。接收过程中,主设备重启了,从设备仍在等待,结果出错? 试着在SPI的错误回调函数里关闭DMA,并重新初始化SPI2,想下次接收时能正确,结果错误依旧。 void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi) { if (hspi == &hspi2) { HAL_UART_Transmit(&huart1, &"spi dma errrn", 0x0d, 0xFFFF); HAL_SPI_DMAStop(&hspi2); // HAL_SPI_Init(&hspi2); MX_SPI2_Init(); } } |
|
相关推荐
5个回答
|
|
|
DMA中断函数:
HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma) 该函数里又调用: hdma->XferCpltCallback(hdma) 对应的函数是: static void SPI_DMATransmitReceiveCplt(DMA_HandleTypeDef *hdma) 在这个函数里,先判断是否有CRC错误,然后是判断TXE是否为高: if (SPI_WaitOnFlagUntilTimeout(hspi, SPI_FLAG_TXE, RESET, SPI_TIMEOUT_VALUE) != HAL_OK) 然后就卡在这里了。 |
|
|
|
|
|
每次都能进DMA中断,并可调用SPI_DMATransmitReceiveCplt()函数,说明DMA算是完成了转换。
而在SPI_DMATransmitReceiveCplt()这个函数里检测TXE出错,TXE为发送非空,说明还有数据。不知道这个数据从那里来的... |
|
|
|
|
|
用示波器测量,无论哪种情况,主设备发送的MOSI波形都是正确的。
更改了下主设备发送的频率,原来是0.1秒发送一次,修改为1秒和3秒试了试,问题依旧。 为改为3秒发送一次的话,发送过程所占用的时间,只占这3秒时间的很小的一部分,那么给主设备重新上电时,恰好遇到SPI通讯的几率应该很小。可惜现象是,试了很多次,绝大部分都是错误的情况。 |
|
|
|
|
|
本帖最后由 any012 于 2017-7-5 14:31 编辑
试了在HAL_SPI_TxRxCpltCallback()函数里,重启单片机。重启后倒是能正常接收。 后,又试着修改SPI DMA的配置,由DMA_NORMAL改为DMA_CIRCULAR,结果倒是正常了,给主设备重新上电后,从设备开始接收了2帧数据以后就正常了。 这个函数里,检测到DMA不是循环模式的话,就直接调用HAL_SPI_TxRxCpltCallback(hspi)函数了,略过中间的错误判断了。不知道为何时这样,那么判断又有什么用? |
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:19 , Processed in 0.759851 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5579