您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> SPORT口DMA传输疑问
本帖共有1434个阅读者
发表帖子 发表投票 回复主题
SPORT口DMA传输疑问
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPORT口DMA传输疑问

我现在要用SPROT口向外发送数据(想用DMA功能),但是数据长度是经程序运行变化的。但是每次发送的最小量都是5个16bit数据,这样是不是把DMA设为16bit,数据长度为5,增加量为1。然后开DMA的发送中断,每传完5个16bit后,在中断处理里再把后面的5个16bit数据写入DMA数据地址,这样反复直到传输完呢?谢谢!


这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2012/2/15 22:43:31
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

DMA的地址是按字节算的,你的数据长度为16比特,每次dma传输2个字节,所以DMA的  MODIFY 值为2.

进中断后关闭DMA,然后重新设定DMA起始地址和传输次数,然后再次启动DMA即可。

另外,用DMA传输不一定用中断,你的传输因为每次长度不同,用中断的话反而不好操作,可以尝试直接使能传输,如:

    *pDMA1_START_ADDR = &buffer;
buffer[0] = 0x000000|(temp<<4);
Enable_DMA1_Sport0_TX(1);

*pDMA1_START_ADDR = &buffer;
buffer[0] = 0x010000|(temp<<4);
Enable_DMA1_Sport0_TX(1);
  
*pDMA1_START_ADDR = &buffer;
buffer[0] = 0x020000|(temp<<4);
Enable_DMA1_Sport0_TX(1);
  
*pDMA1_START_ADDR = &buffer;
buffer[0] = 0x030000|(temp<<4);
Enable_DMA1_Sport0_TX(1);  

如担心传输数据太多,可以在每次传输前加一个DMA完成传输的状态判断。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/2/15 23:59:04
blackfin(论坛游民)
blackfin
头衔:社区公民
帮派:无帮无派
帖数:114
金钱:1105
积分:153
注册时间:2011/6/10
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

谢谢Andy!想问下你那Enable_DMA1_Sport0_TX(1);  是什么功能,是不是在函数里还要判断发送完成与否再进行下一次传输呢?


这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2012/2/16 10:19:09
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

这个函数就是 配置SPORT和DMA寄存器的使能位。因为我只发送1个byte,瞬间就完成了,所以我没有做DMA传输完成的判断,如果你发送的数据量大,最好做一下判断。


这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2012/2/16 12:34:36
zhongcaid(论坛新手)
zhongcaid
头衔:社区公民
帮派:无帮无派
帖数:9
金钱:158
积分:10
注册时间:2013/6/4
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线

你好!能不用DMA而用处理器核心,进行SPORT传输吗?谢谢!



这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2013/6/4 16:56:02
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
可以,你只需要配置完SPORT初始化后,直接向SPORTx_TX寄存器写你需要传输的数据即可,在传输前,需通过状态寄存器判断传输FIFO是否为空。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/6/4 17:00:32
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159339 Call, 1 Queries, Processed in 0.015625 second(s),