OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15164|回复: 8

说说用DMA的SPI双机通信中几个很容易出错的点

[复制链接]

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-11-12 14:47:24 | 显示全部楼层 |阅读模式
网上搜了很多资料,但是copy程序下来发现各种问题。我来说说几个比较容易导致数据出错的点:

1)分频值:SPI的频率最高为18M,SPI1是在频率为72M的APB2上,而SPI2是在频率为36M的APB1上。如果芯片时钟频率为72M,那么SPI1的分频值为4,SPI2的分频值为2.
2)开DMA顺序:我在网上看到有人说要先开从机发送、再开主机发送、再开从机接收、最后开主机接收。我不知道为什么要这么开,而且这种开DMA方式是很难实现的,你可能要再加两根握手线判断对方到底开好DMA没有。我的程序“从机接收-从机发送-主机接收-主机发送”的顺序一样可行。
3)DMA中断:当数据发送到最后一个字节的第一位时,如果你开了DMA发送中断,就会进入DMA发送中断函数,这时候不能马上清楚标志位。必须要查询ISR寄存器判断剩下的7位数据是否也传输完毕,然后就是判断SR寄存器是否在忙。都完成以后才可清楚标志位、重新配置DMA数据长度,否则你后面的数据会出错。
4)上拉电阻:不加上拉偶尔会出错,这个出错并不是仿真能看出来的,我仿真每次都对,但是拔掉仿真器不停测试就发现数据出错了,5次重启能有1次错误。加了后数据异常稳定。不明白为何网上资料全没加上拉。
5)重设缓冲区地址:由于项目需要一个长度可变的缓冲区,所以我多次用了malloc和free进行分配缓冲区大小,这样就造成了缓冲区地址的不停改变,所以必须要失能DMA,然后重新配置DMA的缓冲区地址。
6)不用中断的主机发送过程:我看到网上的资料是主机使能DMA后,死等在那查询DMA是否传输完毕,这样就发挥不出DMA的作用了。SPI的频率是18M,而DMA据说大概是10M左右,如果用死等的方式,反而不如不用DMA。
所以,如果主机不用DMA中断的方式,那么可以写两个函数,一个是使能DMA,一个是判断DMA有没有传输完成。在这两个函数之间CPU就可以自己做自己的事情去了,反正主机有主动权。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-11-12 15:19:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2015-1-21 09:59:19 | 显示全部楼层
好经验,不错
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2066
金钱
2066
注册时间
2012-5-26
在线时间
291 小时
发表于 2016-4-11 09:37:33 | 显示全部楼层
谢谢分享,最近用SPI+DMA双机通信也遇到问题,双机通信开始没问题,1个小时候就会出现数据错乱
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

5

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2015-9-11
在线时间
46 小时
发表于 2016-4-12 15:14:07 | 显示全部楼层
写了个dma spi 读取w25q128问题多多。
迫于生计
回复 支持 反对

使用道具 举报

15

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2013-9-24
在线时间
20 小时
发表于 2016-8-17 14:23:54 | 显示全部楼层

你们家F4串口的DMA发送例程就是死等的。。。我说咋这么怪异
回复 支持 反对

使用道具 举报

12

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2018-2-11
在线时间
38 小时
发表于 2018-3-22 15:54:48 | 显示全部楼层
aa511950071 发表于 2016-4-12 15:14
写了个dma spi 读取w25q128问题多多。

我现在也在写这样的,DMA通讯没调通,能分享下程序吗?
回复 支持 反对

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2018-10-27 20:36:54 | 显示全部楼层
不错,就是少了例程提供
业精于勤荒于嬉;行成于思毁于随!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-8-5
在线时间
4 小时
发表于 2020-3-12 15:25:58 | 显示全部楼层
第四点的上拉是指SPI的CLK吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 08:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表