主题 : uart求助 复制链接 | 浏览器收藏 | 打印
现在你混日子,小心将来日子混你!
级别: 新手上路
UID: 60650
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
综合积分: 24 分
注册时间: 2011-12-14
最后登录: 2012-05-05
楼主  发表于: 2012-02-19 16:06

 uart求助

我写了一个串品通信的程序可是没有一点点的反映!这是为何啊,请各位高手帮我看下

#define rULCON1     (*(volatile unsigned *)(0x7F005400))
#define rUCON1         (*(volatile unsigned *)(0x7F005404))
#define rUFCON1     (*(volatile unsigned *)(0x7F005408))
#define rUMCON1     (*(volatile unsigned *)(0x7F00540C))
#define rUTRSTAT1     (*(volatile unsigned *)(0x7F005410))
#define rUERSTAT1     (*(volatile unsigned *)(0x7F005414))
#define rUFSTAT1     (*(volatile unsigned *)(0x7F005418))
#define rUMSTAT1    (*(volatile unsigned *)(0x7F00541C))
#define rUTXH1         (*(volatile unsigned *)(0x7F005420))
#define rURXH1        (*(volatile unsigned *)(0x7F005424))
#define rUBRDIV1     (*(volatile unsigned *)(0x7F005428))
#define rUDIVSLOT1     (*(volatile unsigned *)(0x7F00542C))
#define rUINTP1     (*(volatile unsigned *)(0x7F005430))
#define rUINTSP1     (*(volatile unsigned *)(0x7F005434))
#define rUINTM1     (*(volatile unsigned *)(0x7F005438))
#define rGPACON0     (*(volatile unsigned *)(0x7F008000))

static void init_uart0(void);
static void Tx(char word);
static char Rx();
static void delay(unsigned int z);
static void put_word(char *s);
static void get_word(char *s);

int _start(void)
{
    
    init_uart0();
    while(1){
        Tx(0x33);
        put_word("hello word \n");
    }
    return 0;
}
static void init_uart0(void)
{
    rGPACON0 = (rGPACON0 & ~(0xFFFFU<<16)|(0x2222U<<16)); //set GPACON to UART1
    rULCON1 = (rULCON1 & ~(0xFFU)|(0x3U));    //set word length 8 bit
    rUCON1 = (rUCON1 & ~(0xFU)|(0xAU));    //set transmit/receive mode DMA request
//    rUFCON1 = (rUFCON1 & ~(0xFU<<4)|(0x6U<<4));    //set Tx/Rx FIFO Trigger Level 16 bit
    rUBRDIV1 = (rUBRDIV1 & ~(0xFFFFU)|(0x0014U));    //set baud rate
    rUDIVSLOT1 = (rUDIVSLOT1 & ~(0xFFFFU)|(0xDDD5U));    //select the slot where clock generator divide clock source
}

static void Tx(char word) {
    if((rUTRSTAT1 & (0x2U))!=0x2U)
    rUTXH1 = word;
}

static char Rx() {
    char word;
    if((rUTRSTAT1 & 0x1)==0x1) {
            word = rURXH1;
    }
    return word;
}
static void delay(unsigned int z) {
    unsigned int x,y;
    for(x=z;x>0;x--)
        for(y=1000;y>0;y--);
}

static void put_word(char *s) {
    while(*s){
        Tx(*s);
        s++;
    }
}
static void get_word(char *s) {
    unsigned char words;
    while(1) {    
        words=Rx();
        if(words == '\r'||words == '\n'){
            *s = 0;
            break;
        }
        *s = words;
        *s++;
    }
}
级别: 新手上路
UID: 61330
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
综合积分: 6 分
注册时间: 2011-12-27
最后登录: 2012-06-18
1楼  发表于: 2012-02-20 21:35
static void Tx(char word) 函数有点问题,
static void Tx(char word)
{
     if((rUTRSTAT1 & (0x2U))!=0x2U)    //你是判断"Transmit buffer empty”如果为空,你就将数据写到rUTXH1里面。你应该采用等待的方式
     rUTXH1 = word;                                 //否则程序到这里的时候,正好上次的没发完,就过了
}
//////////////////////////////////////////////////////////////
static void Tx(char word)
{
         while(!(rUTRSTAT1 & 0x02);    //当程序执行到这里的时候,它就会等到发送Buffer为空的时候才会发送下一个字符,否则就死等
     rUTXH1 = word;
}
现在你混日子,小心将来日子混你!
级别: 新手上路
UID: 60650
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
综合积分: 24 分
注册时间: 2011-12-14
最后登录: 2012-05-05
2楼  发表于: 2012-02-23 15:24
谢谢,
现在你混日子,小心将来日子混你!
级别: 新手上路
UID: 60650
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
综合积分: 24 分
注册时间: 2011-12-14
最后登录: 2012-05-05
3楼  发表于: 2012-02-24 11:17

 回 1楼(chenwy) 的帖子

上电后的时钟频率是多少,要如何算 rUBRDIV1和 rUDIVSLOT1 寄存器啊,我调了半天出来的还是乱码!
现在你混日子,小心将来日子混你!
级别: 新手上路
UID: 60650
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
综合积分: 24 分
注册时间: 2011-12-14
最后登录: 2012-05-05
4楼  发表于: 2012-02-24 11:38
问题已解决,谢谢chenwy!