完善资料让更多小伙伴认识你,还能领取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 循环之后。 另外要注意动态分配的内存区域对应的内存策略必须是 可缓冲 且 可缓存。其他情况调试了不能通过,具体原因不清楚。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
782 浏览 0 评论
4050 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2502 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2919 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31346 浏览 11 评论
72891 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:06 , Processed in 0.588060 second(s), Total 48, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号