OpenEdv-开源电子网

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

调试SPI+DMA的一点心得

[复制链接]

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
发表于 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,要重新再拾起来,却是如此的陌生
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

13

主题

314

帖子

0

精华

高级会员

Rank: 4

积分
713
金钱
713
注册时间
2012-7-20
在线时间
102 小时
发表于 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

精华

新手入门

积分
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

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2014-7-1
在线时间
76 小时
发表于 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:
---------------------------------
你的配置代码能让我看一下吗
最近没吃药,感觉自己萌萌哒!
回复 支持 反对

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

5

主题

91

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

3

主题

197

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

5

主题

65

帖子

0

精华

初级会员

Rank: 2

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

使用道具 举报

83

主题

553

帖子

0

精华

高级会员

Rank: 4

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

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

回复 支持 反对

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1920
金钱
1920
注册时间
2013-11-18
在线时间
268 小时
 楼主| 发表于 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的话能用中断吗楼主?
最近没吃药,感觉自己萌萌哒!
回复 支持 反对

使用道具 举报

58

主题

499

帖子

4

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

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

使用道具 举报

21

主题

299

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
金钱
1834
注册时间
2013-7-29
在线时间
278 小时
发表于 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

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

使用道具 举报

8

主题

569

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

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

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

10

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

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

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

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

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2016-11-23
在线时间
32 小时
发表于 2017-11-13 21:27:29 | 显示全部楼层
谢谢,受益匪浅。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-1-8
在线时间
2 小时
发表于 2018-1-8 15:24:49 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2033
金钱
2033
注册时间
2017-12-11
在线时间
454 小时
发表于 2018-5-15 16:00:56 | 显示全部楼层
先看看再说
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-8-5
在线时间
5 小时
发表于 2019-8-17 08:55:53 | 显示全部楼层
为啥我用TI Mode模式时,SPI都不接受数据的?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-3-20
在线时间
2 小时
发表于 2020-3-20 17:35:41 | 显示全部楼层
请教一下楼主,TI mode 设置成master,8bit单次传送数据时,第一个clock的MISO怎样赋0或者1?也就是要设置哪些寄存器才能赋值?谢谢!
回复 支持 反对

使用道具 举报

2

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2020-8-11
在线时间
53 小时
发表于 2020-9-22 16:02:43 | 显示全部楼层
楼主你好,我最近也在学习SPI-DMA双机通信,想学习学你你的工程,可以提供一下你的工程吗?2510836153@qq.com谢谢您
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6439
金钱
6439
注册时间
2018-6-27
在线时间
545 小时
发表于 2020-11-20 09:24:43 | 显示全部楼层
谢谢分享,学习学习。
回复 支持 反对

使用道具 举报

2

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2020-12-29
在线时间
9 小时
发表于 2021-1-24 11:51:36 | 显示全部楼层

谢谢分享,
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-14 09:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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