避坑之SPI SPIDMA

避坑之SPI SPIDMA

最近使用AT32F403A调试SPI 屏踩了不少坑
直接放问题:
第一坑,看下面SPI 配置有问题吗?

看不出请继续往下看现象:
白屏 白屏 啥情况?
在这里插入图片描述

思路:主频高了?默认主频240Mhz 给它降到200. 出来了。但是没道理 查手册!!! 与问题查手册 查手册 查手册 不查浪费半天! 看到没 50HZ . 所以主频高了 SPI 分频后已经超过了芯片SPI 支持得能力。那我们就恢复到240,改掉SPI 分频 。搞定!
在这里插入图片描述
在这里插入图片描述

第二坑:DMA 其实很简单 但是配置不好就是坑王。
看代码 清屏函数 。想着DMA 发送一次 片选配置一次。
在这里插入图片描述

看效果:
在这里插入图片描述

清屏配置得绿色 出来是个花花。原来DMA 是一次性把所有要发得数据都丢出去 而不是发一次配置一次CS RS(DS).
修改后正常:
在这里插入图片描述
在这里插入图片描述

第三坑: DMA 配置
幺蛾子诞生了 开启DMA 后下面这个熊样
在这里插入图片描述
在这里插入图片描述

为啥,按现象是数据写入不对,要么是字节不对 要么数据宽度不对。
头大 。 把字节宽度改了单字节。正常了!

在这里插入图片描述

第四坑: 内存地址怎么配
初始的时候总是纠结这个DMA 内存地址怎么配置。因为我一开始并不需要写入数据。后续写数据可能这个地址又是变的。怎么办:上代码

在这里插入图片描述

Lcd_data_buf 是一个指针。只要初始化即可。丢给这个函数。
具体写数据的时候再去配置一次地址和数据大小。怎么配。看我写的封装函数。
DMA2_Channel2->CMBA = (uint32_t)buf;
在这里插入图片描述

CMBA 是配置的内存读的地址。 setCurrDataCouter 是配置DMA 这个家伙搬运的数据量。

可以看下面实际也是写的一个寄存器。
void DMA_SetCurrDataCounter(DMA_Channel_Type* DMAy_Channelx, uint16_t DataNumber)
{
/* Check the parameters */
assert_param(IS_DMA_ALL_PERIPH(DMAy_Channelx));

/--------------------------- DMAy Channelx CNDTR Configuration ---------------/
/* Write to DMAy Channelx CNDTR */
DMAy_Channelx->TCNT = DataNumber;
}

第五坑:

SPI 测试 对比

模拟SPI 硬件SPI 硬件SPI + DMA 测试对比。后面原来越快。
但是刷屏的话还是可以看出来。 跟并口比起来可能真的心有余而力不足。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值