完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
使用HAL库的SPI DMA方式读取一个器件的数据,然后在回调函数中开启下一个器件的SPI DMA方式来读取数据,依此方式依次读取几个器件,比如器件1、2、3。。。。。。,用SPI DMA函数HAL_SPI_TransmitReceive_DMA读取器件1后在SPI的回调函数HAL_SPI_TxRxCpltCallback中调用HAL_SPI_TransmitReceive_DMA开始读取器件2,然后下一步再在HAL_SPI_TxRxCpltCallback中调用HAL_SPI_TransmitReceive_DMA读取器件3 。。。。。。但发现 读取总有些问题,尤其不能被中断打断,这是为什么呢?
|
|
相关推荐
17个回答
|
|
|
没人做过或碰到过么 这个问题
|
|
|
|
|
|
|
|
|
|
|
|
这是不是和在UART中断里面启用DMA中断发送或接受UART命令一样呀。就是在循环里面继续循环(尽管支持循环嵌套)
进中断处理函数之后SPI的DMA应该先关掉吧,使用HAL_SPI_DMAPause()/ HAL_SPI_DMAStop()。这样就没有问题了。你也可以试一试在callback里面只设置准备开启的DMA设备,比如用变量存储任务号。然后在SPIx_IRQHandler的末尾根据任务号来开启。这样程序执行完就推出循环了。但是没有试过。 楼主如果要试一下的话,讲结果告诉我,谢谢。 |
|
|
|
|
|
疑问1:你的器件1,2,3....通过什么来选择?同一路SPI不同片选还是多路SPI接从器件?
疑问2:HAL_SPI_TxRxCpltCallback中调用HAL_SPI_TransmitReceive_DMA开始读取器件2这用法是否正确? 疑问3:DMA从外设到内存过程不需要CPU干预,为什么中断能打断SPI的通信数据? 如果描述不清楚的,就请上代码吧。 |
|
|
|
|
|
我觉得提问题就得粘贴代码,这样问大家也不知道是什么原因导致的
|
|
|
|
|
|
建议配置为半双工。
|
|
|
|
|
易元空灭 发表于 2018-12-17 17:51 1.同一路SPI接若干器件。 2.如果已经知道正确与否我还来问什么呢? 3.实测是这样的 代码太长不好贴 |
|
|
|
|
|
|
|
|
|
|
naiztycheng 发表于 2018-12-17 17:40 多谢!如你所言,加上HAL_SPI_DMAStop()可以,不过加HAL_SPI_DMAPause()不行。 |
|
|
|
|
|
|
|
|
我在SPI回调函数中,添加HAL_SPI_DMAStop(),和HAL_SPI_Receive_DMA(),实际使能中断一次,请问楼主有碰到这个问题吗?
|
|
|
|
|
|
|
|
|
|
|
|
SPI接收回调代码:
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { HAL_SPI_DMAStop(hspi); if(HAL_SPI_Receive_DMA(hspi, REV_FPGA_DATA, 6)!= HAL_OK) { /* Transfer error in transmission process */ Error_Handler(); } } DMA初始化中的部分代码: /* SPI1 DMA Init */ /* SPI1_RX Init */ hdma_spi1_rx.Instance = DMA2_Stream0; hdma_spi1_rx.Init.Channel = DMA_CHANNEL_3; hdma_spi1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_spi1_rx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi1_rx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_spi1_rx.Init.Mode = DMA_NORMAL; hdma_spi1_rx.Init.Priority = DMA_PRIORITY_MEDIUM; hdma_spi1_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK) { _Error_Handler(__FILE__, __LINE__); } 主函数中,初始化后,执行了一次 : if(HAL_SPI_Receive_DMA(hspi, REV_FPGA_DATA, 6)!= HAL_OK) { /* Transfer error in transmission process */ Error_Handler(); } 结果是:只执行了一次dma |
|
|
|
|
|
|
|
|
|
|
|
楼主是不是用的从模式,我现在正在调试,遇到了这样的问题
|
|
|
|
|
|
|
|
|
使用了HAL库的函数来进行数据的读写: HAL_SPI_TransmitReceive_DMA
此函数内需要对spi的状态量进行判断是否为ready,然后再将状态量变成busy,函数内使能了DMA的TC(传输完成)中断,但是DMA中断中没有将spi的状态量改回ready,导致数据的读取失败。DMA中断中直接调用DMA中断请求函数HAL_DMA_IRQHandler。我该如何进行修改呀呀呀呀 SPI的EOT(传输结束)中断的中断请求函数中有将spi的状态改回ready,但是我如果又打开DMA的TC中断,又打开spi的EOT中断,当我发送一个数据的时候,传输之后该发送哪个中断呢 看楼主有说在spi中断回调函数中使用这个函数,这个spi中断在初始化里使能吗,但是这个时候我没有发送任何数据,如何进入中断呢 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
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-2 01:56 , Processed in 1.191374 second(s), Total 104, Slave 87 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
7023