![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| 如何在NIOSII中使用DMA | |||||
作者:Free 文章来源:Free 点击数: 更新时间:2008-1-4 ![]() |
|||||
|
最近使用NIOSII的DMA的方式来实现用SPI发送数据,具体方式是用NIOSII将UART的数据接收,当它接收到一定数量的数据后使用DMA方式将数据发送出去。 出现的问题:一开始我们使用NIOSII的e核,将程序放到外部的SRAM中,结果发现SPI的发送速度跟不上DSP要求的速度。NIOSII的SPI核设定为slave模式,DSP的主SPI的访问速度为10M。 然后我们就觉得是DMA与CPU强占总线造成速度不够,应为我们将接收的数放到外部的SRAM中,同时程序也运行在外部SRAM。我们就开辟了新的存数据的空间,具体做法是: 在IDE的system library property中将Stack memory指定为on chip memory ,然后在程序中用 #pragma DATA_SECTION( uart2_data,".ON_CHIP_RAM"); alt_u16 uart2_data[LENGTH+2];//uart2 to spi buffer; 将存储空间指定到on chip memory上结果发现如果程序中只有使用DMA发送SPI数据时可以实现,如果还有其他任务时,就不能实现正确发送数据。 同时我们还发现如果将DMA的目的端指定了两个,造成的结果 就是在程序中用txchan = alt_dma_txchan_open("/dev/dma_0");打不开DMA。 问题的解决:由于以上的原因,我们初步认为是DMA与CPU抢占工作时间,同时NIOSII的指令工作速度不够快造成的,我们决定将NIOSII换成s核, 先使用on chip memory 来实现发送数据的存储,DMA从on chip memory 源端发送到SPI 目的端,结果发现能够正确发送, 然后我们又尝试将数据放到SRAM中发现也能够正确的发送数据。 DMA的使用方法:在IDE程序中使用DMA的方法如下: txchan = alt_dma_txchan_open("/dev/dma_0");//打开DMA发送通道 alt_dma_txchan_ioctl(txchan, ALT_DMA_TX_ONLY_ON, (void *)(SPI_BASE+2));//将目的端设定为固定在SPI的TXDATA寄存器 IOCTL函数的使用参考本日志中的NIOSII常用函数函数 alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_16,(void*)NULL);//将DMA的发送方式设定为16位模式,此处应该注意DMA的LENGTH计数是以8位来计数的 在设定DMA的发送个数时应该×2 alt_dma_txchan_send(txchan,(void *)&uart2_data,c_counter*2,uart2Done,NULL); NIOSII 中的SPI的ROE和WOE需要及时清除,否则会造成SPI阻塞。IOWR_ALTERA_AVALON_SPI_STATUS(SPI_BASE,0x18); |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| NIOS的用户定义接口逻辑实例 NIOS II中用到的C/C++函数 基于Nios II内核的SOPC开发板… 基于Nios II的非一般模式类设… 基于Nios II的DTMB单频网适配… 基于Nios II和DDS的雷达信号… 一种基于Nios II的可重构DSP… Nios II IDE软件编译环境探密… 基于Nios II的非一般模式类设… |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|