1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
修改了 drv_spi.c , spi_config.h 和 dma_config.h,使 rtt 可以用于 spi 的 DMA操作。 补充一点:不用 DMA,轮询方式是可以正常使用的,电路上没有问题。 |
|
相关推荐
4个回答
|
|
这题我正好测试过,请楼主确定几个点:
SPI 轮训是正常的 SPI 请使用 DMA1 或者 DMA2 SPI 会使用到 rt_malloc , heap 确保是 AXI SRAM MPU 配置的 cache 策略 drv_spi.c 中在开启 DMA 之后,对应的 SPI 外设中断是否开启了. 如果 SPI 轮训是正常的,请使用 DMA1 或者 DMA2. 因为 DMA1 DMA2 无法访问到 TCM,如果确保 rt_malloc 是从 AXI SRAM 申请的内存. cache这里,如果你参考的 ART-Pi 或者 STM32H743-ATK-APLLO 那么这里就不需要修改. 检查是否对用的 外设中断函数是否有. |
|
|
|
在补充一点,在读数据之前加一句 SCB_InvalidateDCache();
|
|
|
|
补充下,malloc出来的地址和大小也要确保cache_line对齐哈,如果不能确认,可以用本地buf再拷贝一次。
|
|
|
|
最终搞定了这个问题,具体方法如下: drv_spi.c 的 spixfer 函数,添加如下代码。 第一部分是动态分配一段CacheLine对齐的内存,采用的策略是先分配比 send_length 大,且对齐之后也能放下数据的内存。之后再取对齐地址进行使用。 之后复制发送内容到分配的内存,并刷新缓存。 注意分配的内存一定不能在 DTCM。 之后执行 HAL_SPI_TransmitReceive_DMA 函数,必须是这个函数,后面的单独 DMA 发送和接收的函数不行。 具体原因不清楚。 第二部分是复制接收数据到接收缓存,且释放动态内存。 注意这部分必须放在 DMA 传输完成之后,即上面的 while 循环之后。 另外要注意动态分配的内存区域对应的内存策略必须是 可缓冲 且 可缓存。其他情况调试了不能通过,具体原因不清楚。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
590 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2241 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1233 浏览 0 评论
1788 浏览 0 评论
1464 浏览 0 评论
74826 浏览 21 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 04:01 , Processed in 0.752046 second(s), Total 77, Slave 59 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号