OpenEdv-开源电子网

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

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

  [复制链接]

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2013-11-28 16:02:19 | 显示全部楼层
回复【50楼】jimmjimm:
---------------------------------
你可以试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2013-11-29 02:27:34 | 显示全部楼层
回复【49楼】正点原子:
---------------------------------
但是如果中断需要访问SRAM的话,岂不是和DMA使用数据总线相冲突了?!!!
昨天字节序不对的原因找到了。在开启DMA通道之前,SPI的发送缓冲区已经压入了一个数据了,通过发送缓冲区不为空可以看到,DMA统计数据是从发送缓冲区发送出去的数统计的,所以就会出现每次发送的时候剩下一个在发送缓冲区里面,在下一次去发送。
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2013-11-29 02:35:17 | 显示全部楼层
回复【49楼】正点原子:
---------------------------------
并且我采用开了中断过后,确实对DMA通道的通讯造成了影响。比如Master,会造成丢了几个数据,然后DMA的数据寄存器还没有到0,DMA传输就停掉了,非常苦恼。然后我把这些中断都给关掉了,就没这个问题。后来采用每次开DMA通道之前关闭中断,然后打开过后,再打开中断,貌似没这个问题了,但是不知道这是什么原因,不知道原子哥知道不?
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

17

主题

470

帖子

1

精华

高级会员

Rank: 4

积分
718
金钱
718
注册时间
2013-11-23
在线时间
0 小时
发表于 2013-12-9 11:28:40 | 显示全部楼层
回复【15楼】lkl10800139:
---------------------------------
是的
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-12-5
在线时间
0 小时
发表于 2013-12-16 13:59:34 | 显示全部楼层
楼主分析的很细致,真是用心了。 我也调调我的DMA传输音频文件看行不行
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-12-25 11:35:50 | 显示全部楼层
very 牛叉。顶起来啊。多谢楼主。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-4-22 20:53:54 | 显示全部楼层
好文章
多谢楼主
158028044 133
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-4-22
在线时间
0 小时
发表于 2014-4-23 22:51:28 | 显示全部楼层
看了几遍,还是不太明白,路漫漫






158028044 133
158028044 133
回复 支持 反对

使用道具 举报

头像被屏蔽

254

主题

304

帖子

0

精华

禁止发言

积分
1006
金钱
1006
注册时间
2012-4-13
在线时间
32 小时
发表于 2014-4-25 16:26:54 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

47

主题

373

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2014-3-6
在线时间
19 小时
发表于 2014-4-25 17:28:08 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,我想问下书上的DMA实验,最后清楚通道4传输完成标志那里,是不是错的?

书上的程序是: if(DMA_GetFlagStatus(DMA2_FLAG_TC4)!=RESET)
                      {
                             DMA_ClearFlag(DMA2_FLAG_TC4);
                             break;
                      }

应该是清除DMA1上的标志吧,而上面的程序是清除DMA2的
成长不是衣服越来越小,裤子越来越短,而是心和梦想一起越来越大!
回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2014-4-25 19:54:13 | 显示全部楼层
回复【61楼】ljjdglg520:
---------------------------------
是的,确实有误。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-7-15
在线时间
6 小时
发表于 2014-7-15 16:49:36 | 显示全部楼层
支持一个先。
回复 支持 反对

使用道具 举报

6

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2014-7-31
在线时间
0 小时
发表于 2014-8-8 11:44:33 | 显示全部楼层
正在学习双机SPI通信   太及时了
回复 支持 反对

使用道具 举报

17

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2014-10-6 15:46:31 | 显示全部楼层
谢谢!!!!!!
回复 支持 反对

使用道具 举报

85

主题

376

帖子

0

精华

高级会员

Rank: 4

积分
897
金钱
897
注册时间
2013-4-29
在线时间
86 小时
发表于 2014-11-14 08:31:05 | 显示全部楼层
学习一下。。
回复 支持 反对

使用道具 举报

253

主题

792

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1852
金钱
1852
注册时间
2012-10-28
在线时间
343 小时
发表于 2014-11-14 16:19:07 | 显示全部楼层
灰常感谢感谢了哦
回复 支持 反对

使用道具 举报

8

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-8-22
在线时间
11 小时
发表于 2015-1-9 19:02:06 | 显示全部楼层
太感谢了,正在写SPI FLASH SST25V64C发送到USB CH376的程序,学习了
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2015-1-19 20:30:19 | 显示全部楼层
顶,学习ING
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-19
在线时间
4 小时
发表于 2015-2-9 10:54:17 | 显示全部楼层
正要做SD卡读取图片的,感觉读写很慢,你帮我解决了一个大问题,谢谢。
新手,求助
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2015-5-26
在线时间
6 小时
发表于 2015-6-4 16:01:29 | 显示全部楼层
顶一个,很不错
回复 支持 反对

使用道具 举报

2

主题

396

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2058
金钱
2058
注册时间
2012-5-8
在线时间
308 小时
发表于 2015-8-22 23:03:28 | 显示全部楼层
牛人!最爱寄存器版本的例程
回复 支持 反对

使用道具 举报

15

主题

787

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3222
金钱
3222
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-9-9 12:52:58 | 显示全部楼层
mark!!!!!!!!!!!!!!!!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-3-6
在线时间
18 小时
发表于 2015-9-26 21:34:02 | 显示全部楼层
回复【10楼】noip0726:
---------------------------------
最近做过测试,用的是Cortex-M0的片子,STM32F030x,48Mhz,用DMA大概是不用的3倍,用DMA方式读SD卡文件,用的PetitFs文件系统(FATFS的一个精简版),读取速度大概有818KB/S,如果用FATFS应该会更快
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-5-12
在线时间
0 小时
发表于 2015-10-19 17:09:05 | 显示全部楼层
不错,有资料分享一下!!
回复 支持 反对

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-5-12
在线时间
0 小时
发表于 2015-10-19 17:11:21 | 显示全部楼层
//接收数据_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 ;                   


能不能用库函数  实现一下  
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-10-8
在线时间
36 小时
发表于 2015-10-21 20:20:40 | 显示全部楼层
  厉害
回复 支持 反对

使用道具 举报

5

主题

74

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2015-9-11
在线时间
46 小时
发表于 2015-10-24 08:01:19 | 显示全部楼层
666666666
回复 支持 反对

使用道具 举报

12

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-20 20:48:19 | 显示全部楼层
厉害,收藏了
天道酬勤
回复 支持 反对

使用道具 举报

57

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2013-5-23
在线时间
46 小时
发表于 2016-3-27 01:46:15 | 显示全部楼层
好东西,,,,,,,,,,,,,,,,,,,,
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2016-2-1
在线时间
1 小时
发表于 2016-3-28 23:31:13 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-3-22
在线时间
29 小时
发表于 2016-3-29 09:16:36 | 显示全部楼层
谢谢你的资料
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
232
金钱
232
注册时间
2016-8-9
在线时间
29 小时
发表于 2016-9-5 17:47:19 | 显示全部楼层
haotie  haotie
回复 支持 反对

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
金钱
1472
注册时间
2016-1-25
在线时间
258 小时
发表于 2016-10-10 09:58:32 | 显示全部楼层
学习了。。。。。。。。。。
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
425
金钱
425
注册时间
2016-3-9
在线时间
74 小时
发表于 2016-10-10 17:23:57 | 显示全部楼层
mark!!!!!!!!!
回复 支持 反对

使用道具 举报

32

主题

301

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2016-10-10 18:21:34 来自手机 | 显示全部楼层
目前还不懂。
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
167
金钱
167
注册时间
2016-1-16
在线时间
15 小时
发表于 2016-10-10 18:52:00 | 显示全部楼层
收藏一下先
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-31
在线时间
12 小时
发表于 2016-10-11 16:04:04 | 显示全部楼层
意义不大, 函数中依然是需要等待DMA传输完成, 才退出函数, 阻塞机制, 和直接的发送效果相差不大
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-31
在线时间
12 小时
发表于 2016-10-12 11:51:49 | 显示全部楼层
杜公子寒枫 发表于 2016-10-11 16:04
意义不大, 函数中依然是需要等待DMA传输完成, 才退出函数, 阻塞机制, 和直接的发送效果相差不大

建议楼主在发送/接收之前, 先判断上一次的发送是否完成-->复位DMA-->启动传输-->退出(不等待DMA传输完成, 下一次进入此函数时再判断)
回复 支持 反对

使用道具 举报

5

主题

150

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2015-12-28
在线时间
132 小时
发表于 2016-10-21 08:54:45 | 显示全部楼层

***********             **                       **********                           *************  
*                            **                        *           *                                              *
*                            **                        *           *                                              *
***********             **                       *            *                            ************
*                            **                        *            *                                             *
*                            **                        *            *                                             *
*                            **                        **********                           *************
越努力,越优秀;越独立,越自由
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-5-3
在线时间
42 小时
发表于 2016-10-29 09:28:47 | 显示全部楼层
赞下大神。
回复 支持 反对

使用道具 举报

11

主题

98

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5050
金钱
5050
注册时间
2015-11-5
在线时间
659 小时
发表于 2016-11-2 22:42:29 | 显示全部楼层
已收藏,谢谢楼主!!
回复 支持 反对

使用道具 举报

4

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2016-1-25
在线时间
75 小时
发表于 2016-11-25 09:48:50 | 显示全部楼层
开始学习这个了,一点一点地进步
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2014-8-15
在线时间
47 小时
发表于 2016-12-20 16:22:08 | 显示全部楼层

     请问原子哥,我在调试VS1003的时候使用SPI已经调试成功了。但是我需要显示歌曲信息。这样就导致了有的时候放码率高的歌曲就会出现卡段的现象。所以想用SPI的DMA发送数据到VS1003提高速度,下面是我播放的MP3歌曲的代码,修改了下,但是没有调试成功。麻烦帮我看看,问题出在哪里呢。


[mw_shl_code=c,true]
[mw_shl_code=c,true]/播放一曲指定的歌曲
//返回值:0,正常播放完成
//        1,下一曲
// 2,上一曲
// 0XFF,出现错误了
//播放音乐
u8 mp3_play_song(u8 *pname,u8 *fn)
{
FIL* fmp3;
u16 br;
u8 res,rval;
u16 i=0;
u8 key,j=0;
u8 pause_Flag=0;
rval=0;
fmp3=(FIL*)mymalloc(SRAMIN,sizeof(FIL));//申请内存

if(fmp3==NULL) rval=0xFF;//内存申请失败

if(rval==0)
{
VS_Soft_Reset(); //软复位
VS_Set_All(); //设置音量等信息
VS_Reset_DecodeTime();        //复位解码时间       
res=f_open(fmp3,(const TCHAR*)pname,FA_READ);//打开文件
if(res==0) //打开成功
{
VS_SPI_SpeedHigh();        //高速       
while(rval==0) //读出512个字节
{ //btr是用户要读的数据量,br是实际读取的数据量
res=f_read(fmp3,mp3_buf,512,(UINT*)&br);        //这样当判断到br==0时,文件读完
i=0;       
do
{       
if(DMA_GetFlagStatus(DMA1_FLAG_TC3)!=RESET) //等待通道3传输完成
{       
VS_XDCS=1; //完成一次传输       
DMA_ClearFlag(DMA1_FLAG_TC3);        //清除通道3传输完成标志       
DMA1_Channel3->CMAR =(u32)(mp3_buf+i);        //重新赋予一次数据地址开启一次DMA传输       

if(VS_DQ!=0)
{
VS_XDCS=0;
printf("传输一组数据..\n");
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //启动一次DMA传输       
DMA_Enable(DMA1_Channel3);        //使能DMA传输
i+=32;       
}       
}
else
{
key=KEY_Scan(0);//不支持连按0
switch(key)
{
case KEY0_PRES:
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //启动一次DMA传输       
DMA_Enable(DMA1_Channel3);        //使能DMA传输
break;
}       
}       
}while(i<512);       

if(br!=512||res!=0)
{
printf("读完了..\n");
rval=0;
break;        //读完了
}       
}
f_close(fmp3);
}else rval=0xFF;//出现错误
}
myfree(SRAMIN,fmp3);
return rval;
}[/mw_shl_code][/mw_shl_code]
回复 支持 反对

使用道具 举报

0

主题

29

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1714
金钱
1714
注册时间
2016-11-23
在线时间
138 小时
发表于 2016-12-22 19:16:40 | 显示全部楼层
写的很好,学习了。
回复 支持 反对

使用道具 举报

33

主题

197

帖子

0

精华

高级会员

Rank: 4

积分
587
金钱
587
注册时间
2015-1-9
在线时间
80 小时
发表于 2017-1-21 10:43:59 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
489
金钱
489
注册时间
2016-12-21
在线时间
76 小时
发表于 2017-4-14 10:09:12 | 显示全部楼层
好帖,学到了,多谢大神
回复 支持 反对

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1100
金钱
1100
注册时间
2016-7-19
在线时间
168 小时
发表于 2017-7-5 16:13:18 | 显示全部楼层
写的很细。谢谢分享!
回复 支持 反对

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2012-7-20
在线时间
15 小时
发表于 2017-7-19 08:43:45 | 显示全部楼层
经典,MARK,谢谢分享!
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-8-12
在线时间
2 小时
发表于 2017-8-1 18:41:13 | 显示全部楼层
不错的例子,不过我用的是stm32f303,与AD2S1210旋变解码芯片通信,下载参考,不胜感激.
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 15:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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