OpenEdv-开源电子网

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

STM32自学之SPI的DMA操作(寄存器级)

  [复制链接]

3

主题

14

帖子

1

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2012-1-26
在线时间
0 小时
发表于 2012-3-10 20:11:58 | 显示全部楼层 |阅读模式

STM32自学之SPI的DMA操作(寄存器级)

一、实验目标

学会配置STM32SPI寄存器和DMA寄存器,实现STM32SPI1SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。之后看可以利用DMA来实现什么功能~~~

二、实验目的

加入DMASPI通信相对于普通SPI通信有什么好处?STSPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法:

减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令->目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。而且像SD卡的操作,是一个顺序流的指令操作过程,用中断也不容易控制。那到底加入了DMA有什么好处?仔细查看了STM32F10xxx的用户手册,发现这么一行字“连续和非连续传输:当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同时BSY位不会被清除。如果软件不够快,则会导致不连续的通信;这时,在每个数据传输之间会被清除”以及


也就是说如果连续传输而不使用DMA的话,需要CPU不停检测TXE并很快地置入SPI->DR的值,对于复杂程序的话这是很难达到的,而如果使用DMA,就可以轻易实现连续传输,CPU只需等待其完成就好。我想到的一个应用就是在写SD卡的时候,每次写一个块512字节,就可以用到,能提高SD卡的写入数据速率。

其次还可以降低功耗,记得数字集成电路老师说过一句话“软件上降低数字电路功耗的一个方法就是减少电平转换。”那么连续通信的时候,像SPIBSY电平转换会大大减少!

最后一点,虽然效果不大,就是如果不是用DMA,那么CPU的工作就是搬运工,把SPI->DR的内容搬到内存存储起来,而如果使用DMA,就省略了这个环节!

我想,为什么实现同一个功能,有的执行起来很流畅,有的却很卡,应该和这些小细节的减载有关吧。

这次先把SPI基本通信写出来,然后再写SPI的连续通信,并看能不能用到SD卡读写上。

三、SPI&DMA分析

1、这里先说明一下SPI的全双工通信(高手略过哈)

SPI全双工通信的特点:一边发送一边接收,硬件上只有一个SPI->DR寄存器和两个缓冲器(发送缓冲器和接收缓冲器),主模式(从模式类似):SPI->DR会先读发送缓冲器,并通过MOSI管脚(Master output Slave Input)一位一位地发送出去,在发送的过程中,SPI->DR的数据会左移(如果是高位先发送),并且会从MISOMaster input Slave output)读入数据填补SPI->DR左移后的空缺。传完8比特后,SPI->DR再把数据并行写入接收缓冲寄存器。所以,SPI1SPI2的通信过程如下:



配置SPI寄存器的时候,需要注意以下几点:

1nss的配置:如果是单主单从,使用nss软件管理,除了用MSTR配置主从设备,还要设置SSMSSI,只有在SSM位为1时,SSI位才有意义。

2)主从设备的数据帧格式,时钟沿读写模式要一致;

3SPI的寄存器也需要开启DMA使能;

4SPI虽然可以发送16bit数据,可是只支持8bitDMA

2、再说一下DMA

DMA——Direct Memory Access,直接内存存取,作用是独立于CPU,直接建立内存与外设的通信通道。

SPIDMA操作,就是在SPI->TXE1时,会向对应的DMA通道发出请求,DMA通道会发出应答信号,SPI收到应答信号后撤销请求信号,DMA撤销应答信号,并把内存值置入发送缓冲,SPI传送开始。接收过程与上面类似。

DMA配置的部分说明:

(1)       需要使能RCC寄存器的SPIDMA时钟,至于辅助时钟,查过网上的讨论,有人说一些外设如果没有开启辅助时钟会不能用,但SPI不需要;

(2)       DMA的存储器地址(memorybaseaddr):即变量地址。我们在程序中定义的每个变量,都有对应的内存地址,你想把SPI的接收发送数据存在哪个变量,就将对应变量的地址赋给DMA存储器地址寄存器。如u8  SPI1_TX_Buff的地址是(u32)&SPI1_TX_Buffu8  SPI1_TX_Buff[512]的地址是(u32)SPI1_TX_Buff

(3)     DMA循环模式:有些资料会译为DMA的循环缓存模式,我觉得不太准确,这里循环的意思是指DMA的传输数量计数器会重置初值,由于DMA每传一个数据,传输数量计数器减一,只有在传输数量计数器的值不为零时,才会响应请求。在循环模式下,当传输计数器的值减为0后,会重新装载;而内存(缓存)地址则不管循环非循环模式,都会在每次传输完成后重置为基地址。所以,如果我们把DMA设置会正常模式,那么在下次传输前,只需对DMA的传输数量计数器重新写入就行。

循环模式一般用于数据更新,比如ADC采用需要不停更新数据。

(4)       DMA的外设地址:正点原子的串口DMA实验中,在写外设地址时,都会用一个变量缓存再写入,否则程序就运行不正确,他也不知道为什么,而ST库函数的example中对于外设地址也都是重新define的,所以外设地址最好还是采用#define SPI1_DR_Addr ( (u32)0x4001300C )定义的好。

至于外设地址,可以先从STM32的用户手册“2.3存储器映像”得到起始地址+对应外设所在目录的“寄存器地址映像”标识的偏移地址。例如:从“2.3存储器映像”得到SPI1起始地址0x40013000,从SPI所在目录的“寄存器地址映像”得到SPI->DR的偏移量为0x0C,那么SPI1_DR_Addr就是0x4001300C

(5)       DMA通道开启顺序:按照下图的数字序号依次开启,才能确保数据正确发送。比如①的SPI2_TX_Buff对应的是DMA通道5.


(6)       正常模式的第二次发送:DMA发送的时候只需使能DMA就可以开始传送,但是第二次传送之前,需要进行以下步骤:

1、  关闭DMA通道;

2、  清除DMA传输完成标志以及重置CNDTR传输数量计数器;

3、  开启DMA通道,等待传输完成。

四、实验结果

利用SPI1SPI2进行两次数据传输,并比较SPI1_RXSPI2_TXSPI2_RXSPI1_TX,数据相同点亮LED灯。

在某个论坛看到有人说把SPI的速度设置为2分频传输数据不正确,分析原因是DMA反应不过来。我也试了一下,传输正常,数据正确。(SPI传输速率是用JTAG仿真查看寄存器的)

哦,对了,期间还吃过一个亏,害我调了好久,就是下面的语句:

while( ( DMA1->ISR & (1<<17) ) == 0  ) ;        //等待通道5传输完成

我写成:

while(   DMA1->ISR  &  (1<<17)  == 0  ) ;     //等待通道5传输完成

由于“==”的优先级比“&”高,所以会先执行“(1<<17)  == 0”,结果是0,再与上DMA1->ISR,那么相当于while直接跳过了,读不到数据!很低级的错误!所以提醒后来者,看起来可加可不加的括号,还是要加上去的好!

还有一个问题,一直在想DMA传输,那么硬件怎么认为一次传输的结束而停止以及怎样才能开启新一次的传输。我觉得最关键就是DMA的传输数量计数器以及DMA的传输完成标志。只要DMA的计数器不为零,就能响应请求传输,此时就算传输完成标志置位,也能进行DMA响应,只不过你不知道什么时候完成罢了。所以每次传输开始前,程序需要清除标志位并检测到该标志位置位,才知道一次传输是否完成!

续:终于把SPIDMA弄完了,实现了连续发送和读取的功能,DMA开辟512字节的数组作为内存存储数据(所以连续发送最大的数据量也是512,当然可以在宏定义里面更改),通过num控制要写入或读入的数据量,源代码中有3个函数,一个函数是读写一体的,一个函数是只发送模式,一个函数是只接收模式,都通过测试。唯一的缺陷就是没有进行错误检测,特别说明一下,我把清标志位是放在函数前面而不是函数后面,就是想函数执行完,标志位依然还在,我们可以以此来判断是否有错误。在这里和大家分享一下小经验。

(1)              怎么测试?最好的测试方法我觉得就是双机通讯了,由于实验室资源比较好,所以我得以有两个STM32(非MiniSTM32,用的是AG嵌入式开发板)进行测试,所以以上代码都是通过双击测试的,不过我只整理了SPI1主机源代码,需要的自己稍微改一下就可以,程序中有注释!

(2)              用双机测试的时候,刚开始我没有共地,导致数据可以接收,但是数据错误!所以紧记,当你使用两个器件通讯或交互时,一定要先检查两个器件是否共地,甚至共源!

(3)              如果只有一个STM32其实也可以测试,就是把MISOMOSI短接,但这个测试方法,用来测试SPI1_ReceiveSendByte(u16 num)就比较方便,用来测试只发送和只接收模式就需要改一下函数咯。

(4)              弄了这么久的SPI_DMA,也不知道用处大不大,总之弄完了,呵呵,也算比较了解SPI总线和DMA了,接下来想试试原子哥的新的SD卡函数,原来AG嵌入式开发板也是移植原子哥的旧版,也是有些卡初始化失败,我还以为是我的卡有问题呢?还有就是文件系统,前阵子只弄了基本的读写,准备把FATFS文件系统写得完善一点~



最后,附上源代码。(使用的不是MiniSTM32,所以大家在测试时只需要改一下LED驱动。)
第一个源代码是基础的,实现一个字节在SPI1&SPI2的传送;
第二个是函数化的代码咯,发送随意数量的8bit数据,数量小于512;

SPI_DMA.zip

1.11 MB, 下载次数: 21700

SPI1_DMA(发送随意数量的8bit数据,数量小于512).zip

1.09 MB, 下载次数: 19019

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

104

帖子

0

精华

初级会员

Rank: 2

积分
179
金钱
179
注册时间
2011-8-2
在线时间
0 小时
发表于 2012-3-10 21:21:33 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-11 08:02:07 | 显示全部楼层
非常好!
回复 支持 反对

使用道具 举报

3

主题

14

帖子

1

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2012-1-26
在线时间
0 小时
 楼主| 发表于 2012-3-11 11:19:23 | 显示全部楼层
回复【2楼】提刀上马:
---------------------------------
回复【3楼】正点原子:
---------------------------------
呵呵,发上来和大家一起学习~有什么写得不好的还请多多指教~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2012-5-10
在线时间
0 小时
发表于 2012-5-10 22:55:36 | 显示全部楼层
 将师兄的程序改了一点点,主从机都是用SPI1,都是软件管理模式,发送任意字节,用外部中断作为从机的片选信号,主机产生低电平片选信号,从机进入中断程序准备接受数据,接收完之后用串口显示所接收的数据,经测试过没问题的。不过将主机改成SPI2之后就有问题了。。。把所有的配置对了又对,还是不知道哪里出了问题。。。

》》》用的是AG开发板

例程(38)-SPI_DMA两机通信(任意字节).rar

1.56 MB, 下载次数: 4665

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-5-11 00:09:18 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

2

主题

394

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2091
金钱
2091
注册时间
2012-5-8
在线时间
312 小时
发表于 2012-7-3 10:41:07 | 显示全部楼层
经典呀!
回复 支持 反对

使用道具 举报

13

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
344
金钱
344
注册时间
2012-7-13
在线时间
83 小时
发表于 2012-7-13 14:39:22 | 显示全部楼层
谢谢啊
回复 支持 反对

使用道具 举报

头像被屏蔽

93

主题

160

帖子

0

精华

禁止发言

积分
457
金钱
457
注册时间
2012-4-3
在线时间
7 小时
发表于 2012-7-15 02:31:55 | 显示全部楼层
回复【楼主位】linziying:
---------------------------------
请问spi的sd卡,用dma传输,是否可以加快sd卡的读取速度?
回复 支持 反对

使用道具 举报

10

主题

40

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
244
金钱
244
注册时间
2012-7-20
在线时间
65 小时
发表于 2012-7-20 10:47:00 | 显示全部楼层
 谢谢您的资料,
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-12-19
在线时间
3 小时
发表于 2012-7-26 11:04:52 | 显示全部楼层
资料下载了,感谢师兄的付出,让我等菜鸟少走弯路。
回复 支持 反对

使用道具 举报

0

主题

79

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2012-4-25
在线时间
10 小时
发表于 2012-8-9 10:09:52 | 显示全部楼层
顶,,,,,,,,,,
QQ:747764222?可接项目 和 毕设等
? 可以出售各种LED灯,以及控制方案。
? ? LED灯已经出口到全球各地,控制方案也很有经验。
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2012-7-4
在线时间
4 小时
发表于 2012-9-12 22:20:20 | 显示全部楼层
感谢分享!!!!!!!!
回复 支持 反对

使用道具 举报

3

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2012-2-2
在线时间
0 小时
发表于 2012-10-23 17:04:24 | 显示全部楼层
回复【楼主位】linziying:
 
STM32学习笔记(二)
——之SPI_DMA寄存器级操作
一、实验目标
学会配置STM32的SPI寄存器和DMA寄存器,实现STM32的SPI1与SPI2通信功能,每次发送一字节数据,并可多次发送,如果接收的数据正确,则点亮LED灯。
二、实验目的
加入DMA的SPI通信相对于普通SPI通信有什么好处?ST给SPI加了DMA功能出于什么目的?我觉得这是很重要的一个问题,一直边学习边想。以下是我的看法:
减少CPU负荷?我想这应该是DMA最主要的功能,可是对于SPI通信来说,其实大部分时候我们需要根据发送的指令->目标器件的应答来决定下一个指令,所以此时CPU还是需要一直等待每次通信的结束。而且像SD卡的操作,是一个顺序流的指令操作过程,用中断也不容易控制。那到底加入了DMA有什么好处?仔细查看了STM32F10xxx的用户手册,发现这么一行字“连续和非连续传输:当在主模式下发送数据时,如果软件足够快,能够在检测到每次TXE的上升沿(或TXE中断),并立即在正在进行的传输结束之前写入SPI_DR寄存器,则能够实现连续的通信;此时,在每个数据项的传输之间的SPI时钟保持连续,同
......
---------------------------------

如果使用一主多从的话,从机的NSS用GPIO来驱动吗
回复 支持 反对

使用道具 举报

126

主题

820

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1683
金钱
1683
注册时间
2012-10-28
在线时间
62 小时
发表于 2012-11-8 14:36:23 | 显示全部楼层
Thank you 
坚持学习!就能成功!
回复 支持 反对

使用道具 举报

8

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2012-9-4
在线时间
0 小时
发表于 2012-11-19 19:28:47 | 显示全部楼层

正在学···,好资料。

回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-8-9
在线时间
4 小时
发表于 2012-11-28 10:30:40 | 显示全部楼层
为什么SPI DMA的发送也是用的//非存储器到存储器模式呢
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2012-8-9
在线时间
4 小时
发表于 2012-11-28 10:32:15 | 显示全部楼层
这样不就没有装载到SPI的DR寄存器的动作了吗,那怎么工作的起来
回复 支持 反对

使用道具 举报

259

主题

806

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2012-10-28
在线时间
353 小时
发表于 2013-1-9 16:37:42 | 显示全部楼层
Thank you 
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2013-1-9
在线时间
0 小时
发表于 2013-1-10 11:10:29 | 显示全部楼层
讲的很详细啊......
睡觉是一种享受.....
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2012-9-4
在线时间
2 小时
发表于 2013-1-15 21:28:44 | 显示全部楼层
回复【楼主位】linziying:
---------------------------------
(4)SPI虽然可以发送16bit数据,可是只支持8bitDMA! 

-----------------------------------------------------------
    这不应该只限8位DMA吧 官方有说明吗  为什么我用16位成功了?
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2013-1-24
在线时间
0 小时
发表于 2013-3-12 16:35:23 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥:
楼主提到———
"SPI1和SPI2进行两次数据传输,并比较SPI1_RX与SPI2_TX,SPI2_RX与SPI1_TX,数据相同点亮LED灯"
用一块MiniSTM32 可以实现吗?将SPI1的MISO接到SPI2 的MOSI ,将SPI1的MOSI接到SPI2 的MISO.
初来乍到,请多指教。谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-3-12 20:01:57 | 显示全部楼层
回复【23楼】youngs:
---------------------------------
可以
自发自收了,你要学会SPI的主从设置。
除了MISO接MOSI,还要接SCK,CS等。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

19

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2013-1-24
在线时间
0 小时
发表于 2013-3-14 20:56:07 | 显示全部楼层
回复【24楼】正点原子:
---------------------------------
原子哥,有没有用一个开发板实现stm32 的SPI1和SPI2 通信的例程啊,我已经看了好几天了,快崩溃了了,就是没弄通。。帮帮忙啊。。。
谢谢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-4-22
在线时间
0 小时
发表于 2013-4-24 13:08:12 | 显示全部楼层
这几天急需要啊,谢谢!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2013-4-24
在线时间
0 小时
发表于 2013-4-24 22:08:23 | 显示全部楼层
好,顶
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-5-4
在线时间
0 小时
发表于 2013-5-4 16:30:21 | 显示全部楼层
全用寄存器写的啊,有的看了
回复 支持 反对

使用道具 举报

5

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2012-8-10
在线时间
40 小时
发表于 2013-5-12 19:43:05 | 显示全部楼层
谢谢,好东西,希望用这个可以提高spi写SD卡的速度
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2011-6-4
在线时间
31 小时
发表于 2013-6-5 14:15:27 | 显示全部楼层
谢谢,学习了
回复 支持 反对

使用道具 举报

2

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-5-21
在线时间
0 小时
发表于 2013-6-5 18:44:06 | 显示全部楼层
学习了!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2013-6-25
在线时间
3 小时
发表于 2013-6-25 09:46:45 | 显示全部楼层
楼主分析的很到位很详细哈~借用学习下
回复 支持 反对

使用道具 举报

16

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-15
在线时间
7 小时
发表于 2013-7-8 10:04:01 | 显示全部楼层
学习下
回复 支持 反对

使用道具 举报

8

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2013-8-11
在线时间
0 小时
发表于 2013-8-21 19:47:24 | 显示全部楼层
楼主我先赞一个!!!!!!!!!
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2011-9-21
在线时间
0 小时
发表于 2013-8-28 13:12:29 | 显示全部楼层
学习了额
回复 支持 反对

使用道具 举报

15

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2012-12-29
在线时间
28 小时
发表于 2013-8-30 22:01:31 | 显示全部楼层
为什么改为从机 MOSI与MISO 就不能接收到数据?
回复 支持 反对

使用道具 举报

23

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-11-4 00:37:22 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2013-10-23
在线时间
0 小时
发表于 2013-11-14 19:43:48 | 显示全部楼层
牛逼的人,如此的多啊。
回复 支持 反对

使用道具 举报

53

主题

608

帖子

0

精华

高级会员

Rank: 4

积分
890
金钱
890
注册时间
2013-3-29
在线时间
18 小时
发表于 2013-11-14 21:07:48 | 显示全部楼层
回复【楼主位】linziying:
----------------------------向楼主学习。
学电子,学音乐!!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-11-16
在线时间
0 小时
发表于 2013-11-19 00:09:37 | 显示全部楼层
顶一个,楼主强大
回复 支持 反对

使用道具 举报

2

主题

394

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2091
金钱
2091
注册时间
2012-5-8
在线时间
312 小时
发表于 2013-11-21 22:52:25 | 显示全部楼层
超级好的帖子,希望楼主继续!
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2013-11-26 03:30:39 | 显示全部楼层
回复【26楼】正点原子:
---------------------------------
原子哥,主节点和从节点采用SPI DMA的方式传输数据。连续传输一段时间过后,主节点就会出现丢失几个数据进不了接收完成中断,但是从节点是可以进发送完成中断的。我采用的是16bits SPI DMA传输,请问你知道是什么原因不?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-11-26 11:37:28 | 显示全部楼层
回复【43楼】Sya_inn:
---------------------------------
不知哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2013-11-27 04:20:53 | 显示全部楼层
回复【44楼】正点原子:
---------------------------------
后面仔细检查了一下,是因为中断函数把DMA通讯给干扰了。中断能够打断DMA的传输吗?我是采用的SPI的DMA,如果被中断打断,为什么该SPI停下来,等到中断过后再继续传输呢。这个是SPI的Master,传输应该是可以由他控制的啊。现在感觉DMA传输用起来具体情况很不清楚啊。。。希望原子哥能够解答一下。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-11-27 10:23:04 | 显示全部楼层
中断不会打断SPI DMA哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2013-11-28 03:19:49 | 显示全部楼层
回复【46楼】正点原子:
---------------------------------
请问 他们的优先级是什么关系呢?DMA在传输的时候,中断来了,中断就不能执行了吗?麻烦了
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2013-11-28 06:51:34 | 显示全部楼层
回复【46楼】正点原子:
---------------------------------
我主节点使用的代码:
//接收数据_Int
void SPI2_DMA_Receive_Data_Int(unsigned char* ReceiveDataBuffer,unsigned short length )
{
    //关闭4,5通道
    DMA1_Channel5->CCR &= ~( 1 << 0 ) ;           //关闭DMA通道5
DMA1_Channel4->CCR &= ~( 1 << 0 ) ;           //关闭DMA通道4
//
DMA1->IFCR = 0xFF000 ;                          //清除通道4,5的标志位
//
DMA1_Channel4->CNDTR = 0x0000   ;             //传输数量寄存器清零
DMA1_Channel4->CNDTR = length>>1;               //传输数量设置为buffersize个
DMA1_Channel4->CMAR =  (u32)ReceiveDataBuffer;
//
DMA1_Channel5->CNDTR &= 0x0000   ;             //传输数量寄存器清零
DMA1_Channel5->CNDTR = length>>1;   
DMA1_Channel5->CMAR =  (u32)SPI2_TX_ConfigBuff ;   //设置DMA存储器地址,注意MSIZE
//打开DMA4,5通道
    //while( ( SPI2->SR & 0x02 ) == 0 );
DMA1_Channel4->CCR |= 1 << 0 ;                  //开启DMA通道4
DMA1_Channel5->CCR |= 1 << 0 ;                  //开启DMA通道5
}

从节点使用的代码:
void SPI1_DMA_Send_Data_Int(unsigned char* SendDataBuffer, unsigned  short length)
{
  DMA1_Channel3->CCR &=~(1<<0);
  DMA1_Channel2->CCR &=~(1<<0);
   
//
DMA1_Channel2->CNDTR = 0x0000   ;             //传输数量寄存器清零
DMA1_Channel2->CNDTR = length>>1;               //传输数量设置为buffersize个
DMA1_Channel2->CMAR =  (u32)ReceiveDataBuffer;
//
DMA1_Channel3->CNDTR &= 0x0000   ;             //传输数量寄存器清零
DMA1_Channel3->CNDTR = length>>1;   
DMA1_Channel3->CMAR =  (u32)SendDataBuffer;  
//打开DMA2,3通道
        while( ( SPI2->SR & 0x02 ) == 0 );
DMA1_Channel2->CCR |= 1 << 0 ;                  
DMA1_Channel3->CCR |= 1 << 0 ;                  
}

为什么会出现:实验过后发现:如果传输数据位32个,收到的第一个数据是上一包数据的最后一个+后面的31个是本次的数据。
为什么会出现这种情况呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2013-11-28 11:46:35 | 显示全部楼层
回复【47楼】Sya_inn:
---------------------------------
DMA和中断无关....
DMA是个外设,该干啥干啥,中不中断都与他无关.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

80

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
531
金钱
531
注册时间
2013-7-4
在线时间
12 小时
发表于 2013-11-28 13:48:27 | 显示全部楼层
回复【49楼】正点原子:
---------------------------------
那原子哥,可以通过DMA做SPI和SDIO之间的通信么?这样就可以通过spi接受数据直接写到sd卡上了吧?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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