原创 如何在NIOSII中使用DMA

2008-1-17 12:48 3871 7 7 分类: FPGA/CPLD

最近使用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);   

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条