打印
[STM32L1]

STM32L151RET6的SPI2使用DMA模式发送数据

[复制链接]
830|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
BOY200501|  楼主 | 2020-2-16 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,使用SPI2的DMA进行发送数据到OLED屏的显示RAM。实测发现(SPI2的时钟为16MHz):
  传输128个的SCK时长:66us
  传输256B的SCK时长: 133us
  传输1024B的SCK时长:517us
  传输4096B的SCK时长:1.916ms(√),有时为1.080ms(×)
  传输8192B的SCK时长:2.9xxms(×),应该是4ms。
  传输16KB的SCK时长:5.3ms(×),应该是8.192ms。

可见,DMA传输数据≤1024时,时长是对的。计算方法:传输字节数*8/(16,000,000)= 时长。
尝试解决的方法有:1. 每次都重新设置DMA通道的使能,SPI TxDMA的使能。---无效果
                             2. SPI2的频率由16MHz降为8MHz。-----------------------------无效果

版主和各位群友,有没有遇到过这样的问题,如何解决?
非常感谢大家。

使用特权

评论回复
沙发
BOY200501|  楼主 | 2020-2-16 14:04 | 只看该作者
补充一句,没有DMA传输错误标记。

使用特权

评论回复
板凳
BOY200501|  楼主 | 2020-2-16 15:28 | 只看该作者
本帖最后由 BOY200501 于 2020-2-16 23:14 编辑

自己找到问题了:使用判断DMA传输完成的条件错了,不应判断GIF5。        因为DMA传输一半时会也是置位GIF5(因为HTIF5被设置了)。
       下面的代码是错误的。            /*等待DMA传输完成(或错误),再清除标志。
      */
        uint32_t tmo= 30;
        while(0 == (DMA1->ISR & DMA_ISR_GIF5)){
                uartS(".");
                osDelay(1);
               
                if(0 == --tmo){
                        tmo= 100;        //C 超时标志值
                        uartS("err:DMA\r\n");
                        break;
                }
        }

解决方法:不判断GIF5,而去判断TEIF5和TCIF5。
根本原因:看了DS,但半懂还不用库。

使用特权

评论回复
地板
hanzhen654| | 2020-2-16 16:10 | 只看该作者
BOY200501 发表于 2020-2-16 15:28
自己找到问题了:使用判断DMA传输完成的条件错了,不应判断GIF5。        因为DMA传输一半时会也是置位GIF5 ...

楼主这次研究透了,这个是什么项目啊

使用特权

评论回复
5
BOY200501|  楼主 | 2020-2-16 16:34 | 只看该作者
hanzhen654 发表于 2020-2-16 16:10
楼主这次研究透了,这个是什么项目啊

SPI驱动128*128的OLED屏,为使用emWin铺垫。

使用特权

评论回复
6
TomasLi| | 2020-2-16 21:01 | 只看该作者
慢慢研究这里边的内容还是很有意思的,效率会更高.

使用特权

评论回复
7
香水城| | 2020-2-17 13:01 | 只看该作者
BOY200501 发表于 2020-2-16 15:28
自己找到问题了:使用判断DMA传输完成的条件错了,不应判断GIF5。        因为DMA传输一半时会也是置位GIF5 ...

如果你判断GIF5,还很宽泛,得进一步查看相关标志。

GIFx: Channel x global interrupt flag (x = 1 ..7)
This bit is set by hardware. It is cleared by software writing 1 to the corresponding bit in the
DMA_IFCR register.
0: No TE, HT or TC event on channel x

好多事件都会触发它,你还得检查到底是半传输事件还是传输完成事件或出错事件。
建议你选择合适的事件来判断。


1: A TE, HT or TC event occurred on channel x。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

66

帖子

3

粉丝