**项目情况说明:**使用niosii,ddr3,msgdma(下文用DMA代指),三速以太网。控制dma在ddr和以太网接口之间进行数据搬移,分别使用流到存储器和存储器到流模式。
**踩坑记录:**1.DMA传输完成是指从存储器取完数据,但是还没有完全传输到流端,要注意检测busy状态来判断传输完成。
2.DMA IP的数据FIFO深度参数,默认配置的是32。测试发现传输的数据有个别数据错乱,把深度加大就正常。目前没找到相关解释。
3.DMA IP的传输类型选择对齐访问,数据宽度选择32位。测试结果总是从我设定的满足4字节对齐地址的后两个字节开始传输,现象等同于好像DMA取数据的地址线第二位始终是1。DMA传出和传入到存储器的现象是一样有效传输数据总是开始于我设定地址的后两位,但是我设置的地址又满足了4字节对齐。原因查找发现由于DMA传输对象是以太网,以太网IP核设置了以太网包4字节对齐,由于以太网的帧头是14个字节所以以太网IP核在发送时会丢弃前两个字节,在接收时会增加两个字节来对齐4字节。
4.当要访问DMA流到存储器到底传输了多少字节时,需要使能IP参数response port,于此同时c语言程序里面描述符的长度参数要么设置你想要去接受的数据量要么设置为IP核里面的最大传输字节。如果设置大于最大传输字节读取该数据寄存器会有问题。response寄存器必须要dma传输完成后才能去读取,并且要把response的所有寄存器(两个)读完,否则它的FIFO最终会被填满DMA会一直处于busy状态。
DMA IP核描述:要实现跨区域高效率的DMA需要选择IP核里面的prefetching module.
niosii 使用MSGDMA踩坑记录
于 2022-08-02 10:56:09 首次发布