新闻  |   论坛  |   博客  |   在线研讨会
悲剧UART
502593045 | 2011-04-05 21:54:34    阅读:4205   发布文章

最近做一个实验,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的问题。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
halibote523  2011-04-07 11:40:53 

NOIS了解的不是很深!!

虾虽在江湖,江湖却没有关于虾的传说!
推荐文章
最近访客