OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 22813|回复: 33

调试SPI+DMA的一点心得

[复制链接]

  离线 

34

主题

469

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1723
金钱
1723
注册时间
2013-11-18
在线时间
232 小时
发表于 2014-12-9 14:49:11 | 显示全部楼层 |阅读模式
正点原子公众号
        由于项目需要,STM32F303跟STM32F405之间要用到DMA+SPI口来估大量数据传输,实现两边的数据收发。开始只用到MISO,MOSI,跟CLK三个信号,STM32F303配置成主机,18M的波特率,用DMA发4K的Buffer的数据,STM32F405这边用DMA循环接收SPI的数据,调试发现数据死活就是接收不对,完全是错乱的。改成不用DMA,直接SPI单个单个不停发送,接收数据却是正常的。用示波器看两个信号线的信号,信号也还好,用示波器的逻辑分析仪去分析SPI的通信,发现SPI的连续传输的时候,CLK是连续的,分析仪分析不到MISO上的数据或者分析出来的也是错误的。就猜想如果SPI的时钟在传输过程中是连续不间距的话,那么逻辑分析怎么可能知道SPI的MISO上1Byte的波形哪位才是初始位??STM32的SPI也是一样,硬件没法判断到,接收就错乱了。SPI通信中,如果时间每Byte的时钟不连续,就可以通过这时钟的间隙来判断。
   


 


         用专门的逻辑分析采齐SPI的数据来分析,数据对的,说明发送是正确的。就是接收错乱,让我更坚信前面的猜想,想要解决这个问题,最好就是增加同步,用一个同步线来告诉从机的SPI什么时候是一个Byte的开始,什么时候是结束。这里想到肯定是用NSS引脚来做,标准的SPI是不支持的,但是看到了TI Mode,这问题就解决了,也证实我的猜想。看下图TI Mode的时序
  


 配置NSS引脚,405跟303把SPI配置修改为硬件NSS和TI Mode模式,再Debug就看到从机的接收Buffer上正常的数据。
       前前后后折腾DMA+SPI有长的时间,网上都没有这样大量数据传输的应用,基本上都SPI的最简单应用,只要CLK不是连续的就不会出现这问题。按理来说如果STM32的SPI硬件时序做好了的话,也不会出现这问题,实际上它就是这里出问题了,我只能说STM32 的SPI也做得有点烂。
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117111
金钱
117111
注册时间
2010-12-1
在线时间
898 小时
发表于 2014-12-9 22:06:14 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复 支持 反对

使用道具 举报

  离线 

13

主题

309

帖子

0

精华

高级会员

Rank: 4

积分
644
金钱
644
注册时间
2012-7-20
在线时间
88 小时
发表于 2014-12-10 00:05:28 | 显示全部楼层
很实用,感谢分享
互联网,智能设备爱好者,欢迎讨论任何有意思的想法。
回复 支持 反对

使用道具 举报

  离线 

13

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2014-11-16
在线时间
0 小时
发表于 2014-12-10 08:11:05 | 显示全部楼层
拜读了,多谢,SPI很常用,如果以后用到了大数据量的连续传输,还真得小心了,记住了TI模式
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
21
金钱
21
注册时间
2014-12-11
在线时间
0 小时
发表于 2014-12-11 22:00:35 | 显示全部楼层
你好 
 我调试的时候遇到同一个问题 想请教下
STM32 F4  通过DMA实现内存到SPI的传输 实现FLASH写入
现在使用系统自带SPI驱动库函数 完全没问题
使用DMA就不行  check FLASH BUSY始终没法通过 
一直怀疑是时序的问题,但手上没逻辑分析仪
看了你的帖子 很受启发 谢谢
但还有点疑问,想请教下
对于外设FLASH CS管脚无法支持TI Mode 如何破?。。。
单独读M4手册上的 没讲这个时序分割的问题,比较含糊


想了一下 也没有好的思路 忘不吝赐教 谢谢
邮箱 f_14@163.com
qq 324124889
回复 支持 反对

使用道具 举报

  离线 

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
发表于 2015-2-3 21:03:07 | 显示全部楼层
很好,注意了
回复 支持 反对

使用道具 举报

  离线 

3

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
208
金钱
208
注册时间
2014-7-1
在线时间
33 小时
发表于 2015-2-11 19:43:59 | 显示全部楼层
我想我也遇到相同的问题了,两片407之间SPI+DMA双向通信,当传输数据量为1kB时都能正常接收,数据量大到4k时数据就混乱了,我看看换成TI方式试试
回复 支持 反对

使用道具 举报

  离线 

27

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-8-14
在线时间
8 小时
发表于 2015-3-18 11:34:41 | 显示全部楼层
楼主的配置能让我看一下吗
最近没吃药,感觉自己萌萌哒!
回复 支持 反对

使用道具 举报

  离线 

27

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-8-14
在线时间
8 小时
发表于 2015-3-18 11:35:09 | 显示全部楼层
回复【7楼】shirl:
---------------------------------
你的配置代码能让我看一下吗
最近没吃药,感觉自己萌萌哒!
回复 支持 反对

使用道具 举报

  离线 

4

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2014-8-16
在线时间
25 小时
发表于 2015-4-7 22:40:18 | 显示全部楼层
楼主,能把代码贴出来学习下不,看图难以理解到位
回复 支持 反对

使用道具 举报

  离线 

5

主题

90

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2014-10-28
在线时间
11 小时
发表于 2015-4-7 22:56:02 | 显示全部楼层
MARK 之后要用SPI+DMA写SD卡
成功必然有成功的原因,
回复 支持 反对

使用道具 举报

  离线 

4

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2014-8-16
在线时间
25 小时
发表于 2015-4-8 10:43:06 | 显示全部楼层
楼主说的TI Mode 是指 SPI_Mode_Master 模式吗?
回复 支持 反对

使用道具 举报

  离线 

34

主题

469

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1723
金钱
1723
注册时间
2013-11-18
在线时间
232 小时
 楼主| 发表于 2015-4-8 11:10:01 | 显示全部楼层
回复【12楼】ghostfly:
---------------------------------
SPI TI 协议,具体的你看手册就知道了
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

  离线 

3

主题

191

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
434
金钱
434
注册时间
2012-7-19
在线时间
46 小时
发表于 2015-4-8 12:21:56 | 显示全部楼层
回复【13楼】mzwhhwj:
---------------------------------
发送是对的,接收不对???接收方就是从模式了,spi外设自动在收到设定的时钟数后认为接收成功开始下一个循环
spi就是个移位寄存器,clk就是移位时钟,nss可以复位这个移位寄存器。。。
回复 支持 反对

使用道具 举报

  离线 

4

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2014-8-16
在线时间
25 小时
发表于 2015-4-8 15:48:37 | 显示全部楼层
回复【13楼】mzwhhwj:
---------------------------------
百度了下,还是不明白SPI TI ,也不懂看哪个手册,楼主方便的话,发我个相关资料 2208460862@qq.com  谢谢
回复 支持 反对

使用道具 举报

  离线 

34

主题

469

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1723
金钱
1723
注册时间
2013-11-18
在线时间
232 小时
 楼主| 发表于 2015-4-8 15:51:14 | 显示全部楼层
回复【15楼】ghostfly:
---------------------------------
看STM32中文参考手册
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

  离线 

4

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2014-8-16
在线时间
25 小时
发表于 2015-4-8 20:54:01 | 显示全部楼层
楼主,看了中文手册,你说的TI模式,我没找到,我理解成主模式,不知是否合理(在手册中,没找到楼主贴的第三幅图), 方便的话,还请楼主共享下这个配置过程,想学习。谢谢
回复 支持 反对

使用道具 举报

  离线 

37

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
617
金钱
617
注册时间
2014-9-30
在线时间
47 小时
发表于 2015-4-8 22:55:16 | 显示全部楼层
 ST 公司的 文档 介绍,始终 让人 ‘心理缺乏 完整感’ 。。。

TI 模式 —— 的 英文 全字母 拼写::大家 猜、难道 只能靠 【猜】 ??

回复 支持 反对

使用道具 举报

  离线 

34

主题

469

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1723
金钱
1723
注册时间
2013-11-18
在线时间
232 小时
 楼主| 发表于 2015-4-9 00:08:15 | 显示全部楼层
回复【18楼】caosix:
---------------------------------
TI就是德州仪器,搞硬件的人一看就知道TI是啥。TI Mode就是德州仪器的SPI协议标准,而我们一般用的SPI都是摩托罗拉的标准
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

  离线 

34

主题

469

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1723
金钱
1723
注册时间
2013-11-18
在线时间
232 小时
 楼主| 发表于 2015-4-9 00:10:21 | 显示全部楼层
回复【19楼】mzwhhwj:
---------------------------------
如果你用过TI的器件就知道,TI的器件的SPI接口就是它自己的TI Mode 的时序
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

  离线 

27

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2014-8-14
在线时间
8 小时
发表于 2015-10-14 18:37:24 | 显示全部楼层
TI mode,用DMA的话能用中断吗楼主?
最近没吃药,感觉自己萌萌哒!
回复 支持 反对

使用道具 举报

  离线 

34

主题

469

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1723
金钱
1723
注册时间
2013-11-18
在线时间
232 小时
 楼主| 发表于 2015-10-25 23:58:22 | 显示全部楼层
回复【21楼】barryotugh:
---------------------------------
可以用中断
已经放下多年的FPGA,要重新再拾起来,却是如此的陌生
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
21
金钱
21
注册时间
2015-12-10
在线时间
0 小时
发表于 2015-12-10 12:37:48 | 显示全部楼层
您好。我现在也是用SPI大量数据接收,并且是不定长数据,关于这个不定长怎么解决?DMA 也要设置长度吧,急求解决方案
回复 支持 反对

使用道具 举报

  离线 

10

主题

233

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1417
金钱
1417
注册时间
2013-7-29
在线时间
173 小时
发表于 2015-12-11 08:09:42 | 显示全部楼层
回复【23楼】zsl:
---------------------------------
我在11月24号时在该网站发过一个SPI主从机通信的例程,你可以查下。
回复 支持 反对

使用道具 举报

  离线 

38

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
340
金钱
340
注册时间
2013-12-7
在线时间
15 小时
发表于 2016-1-27 17:33:12 | 显示全部楼层
我现在也遇到从机接收数据开始数据是对的,后面几次数据出错的问题,楼主你这个主从极性相位设置是一样的吗
每天都是新开始
回复 支持 反对

使用道具 举报

  离线 

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-10-18
在线时间
20 小时
发表于 2016-8-15 19:37:56 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

  离线 

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2016-9-6
在线时间
22 小时
发表于 2017-2-13 18:03:04 | 显示全部楼层
您好,我想请教个问题,两个单片机,主机发送正常,从机也能接收。可是从机发送主机接收就是乱码了,这个是不是需要在从机发送的时候修改下SPI的模式呢?
回复 支持 反对

使用道具 举报

  离线 

6

主题

167

帖子

0

精华

高级会员

Rank: 4

积分
646
金钱
646
注册时间
2015-5-8
在线时间
113 小时
发表于 2017-4-12 09:25:24 | 显示全部楼层
很好,感谢分享
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
15
金钱
15
注册时间
2016-5-9
在线时间
2 小时
发表于 2017-4-25 21:22:22 | 显示全部楼层
搞了几天,连续模式一直不对, 看了这个文档,世界终于安宁了。多谢楼主分享,
回复 支持 反对

使用道具 举报

  离线 

10

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2016-7-7
在线时间
71 小时
发表于 2017-7-3 17:38:22 | 显示全部楼层
jbb2013 发表于 2017-4-25 21:22
搞了几天,连续模式一直不对, 看了这个文档,世界终于安宁了。多谢楼主分享,

接收端怎么配置的,用中断接收么,还是DMA???
回复 支持 反对

使用道具 举报

  离线 

10

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
326
金钱
326
注册时间
2016-7-7
在线时间
71 小时
发表于 2017-7-3 17:38:42 | 显示全部楼层
请问楼主接收端怎么配置的,用中断接收么,还是DMA???
回复 支持 反对

使用道具 举报

  离线 

0

主题

1

帖子

0

精华

新手上路

Rank: 1

积分
3
金钱
3
注册时间
2017-7-12
在线时间
0 小时
发表于 2017-7-12 10:55:23 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

  离线 

0

主题

3

帖子

0

精华

新手上路

Rank: 1

积分
33
金钱
33
注册时间
2017-3-3
在线时间
5 小时
发表于 2017-9-22 11:27:59 | 显示全部楼层
不错
回复 支持 反对

使用道具 举报

  离线 

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2016-11-23
在线时间
19 小时
发表于 6 天前 | 显示全部楼层
谢谢,受益匪浅。
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-19 16:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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