"); //-->
最近做一个实验,DMA控制SDRAM和UART之间的数据传输。一个不难的实验,网上也有许多资料和讲解,我却搞了半个月没有一点实验现象。
在SOPC中的配置如图所示:
我最开始一直使用的是Quartus II 9.0SP2,实现UART发送数据的程序如下:
#include <stdio.h>
#include <string.h>
#include "system.h"
#include "sys/alt_dma.h"
#include <unistd.h>
volatile int dma_tx_done=0;
static volatile alt_u8 chr[20]={0,1,2,3,4,6,5,7,8,9,10,11,12,13,14,15} ;
//待发送的数据
void dma_done(void* handle)
{
dma_tx_done=1;
}
int main(void)
{
alt_dma_txchan tx;
void *source_buff_ptr=(void*)chr;//源地址
//创建DMA接收信道
tx = alt_dma_txchan_open("/dev/dma");
//当信道创建成功
//alt_u8 chr={"helloworld!!!!!!"};
//alt_u8 *p=chr;
if(tx != NULL)
{
printf("Dma transition start.");
while(1)
{
//设置DMA传输的数据位宽 本例中为8位
alt_dma_txchan_ioctl(tx,ALT_DMA_SET_MODE_8,NULL);
//指定从uart接收数据
alt_dma_txchan_ioctl(tx,ALT_DMA_TX_ONLY_ON,(void*)UART_BASE+4);
//提交DMA接收请求 指定接收数据的位置(sdram)以及传输数据量
if(alt_dma_txchan_send(tx,
source_buff_ptr,
16,
dma_done,
NULL) < 0)
{
printf ("Error: failed to post receive request\n");
}
//关闭DMA接收信道
while(!dma_tx_done);
alt_dma_txchan_close(tx);
usleep(1000000);
}
}
return 0;
}
之所以一直做不对,是因为我看其他的程序和资料都是UART_BASE+2。UART的发送寄存器地址也是UART_BASE+2

而我的实验必须是UART_BASE+4才能实验成功。
后来我用了几天Quartus II 10.1,感觉不适应,就又换回了Quartus II 9.0,重新做DMA实验,又经过了几天的调试才实验成功。这次串口发送地址是UART_BASE+2。为什么有的时候是UART_BASE+4,有的时候是UART_BASE+2?这个问题值得以后继续探讨。恳请指教!
更正:原来叫悲剧DMA,是因为这个问题是在做DMA传输时遇到的。实际上市UART的问题。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
低速串行总线调试-SPI译码
想要与众不同?Windows Embedded帮你实现
Hermes Agent被实锤架构级抄袭中国团队
低速串行总线调试-I2C译码
百套嵌入式资料及软件系统
尼得科传动技术设立冲压机新组装工厂
阀门控制用温度调节电路
VxWorks_6.4_Fixed_Defects_Report_v2
CPU正面临严重短缺
VxWorks 编程手册
波士顿动力机器狗借助谷歌 Gemini AI,现已能读取仪表与温度计
请问S3C4510的JTAG部分的用74LS126行不行?
信号分析软件FAMOS 2026+AI
低速串行总线调试-RS232译码
百套嵌入式资料及软件系统
蔷热式炉用温度调节电路
难道tornado2.2做的BSP再也不能用vxload.com在DOS/WIN98下load起来了吗?
TDK推出新型高压共模扼流圈以打造紧凑型1250 V DC转换器
低速串行总线调试-CAN译码
VersaKit-20xx开发套件(Ramtron)
双位温度调节器电路
品英Pickering为航空、低空航电设备和电池保驾护航
采用施密特触发器的双位温度调节器电路
USB系统研究
百套嵌入式资料及软件系统
美国智库CSIS:对华半导体管控反效果已经显现
Upgrading a bsp for tornado2.2
ADI 泰国新工厂启用 强化供应链与绿色制造
采用比例―微分调节器刚D热炉电路
SONOTEC 发布新型流量传感器 集成气泡检测与 AI 能力