主题 : 求助串口问题 复制链接 | 浏览器收藏 | 打印
超越自我
级别: 新手上路
UID: 19213
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
贡献值: 0 点
综合积分: 2 分
注册时间: 2010-04-17
最后登录: 2010-06-09
楼主  发表于: 2010-05-18 14:49

 求助串口问题

刚接触2440,初步裸奔的,试着写,现在T0中断能响应,UART0中断不能响应,发送数据也不正常,请问应该检查哪里?弄好几天了,郁闷中。相关代码如下:
/*-----------------------------------------------------------------------------------------------------*/
void pll_init(void)                      //时钟初始化
{
rLOCKTIME=0xffff;
rCLKDIVN=(0<<3)|(2<<1)|1;
rUPLLCON=(56<<12)|(2<<4)|2;
rMPLLCON=(92<<12)|(1<<4)|1;
rCAMDIVN=0;
rCLKSLOW=(0<<7)|(0<<5)|(0<<4)|0x00;
rCLKCON=0xfffff0;

MMU_DisableICache();
MMU_DisableDCache();
}
/*-----------------------------------------------------------------------------------------------------*/
void port_init(void)                     //端口初始化
{    
rGPACON = 0x7fffff;
    
rGPBCON = 0x155555;
rGPBUP  = 0x7ff;

rGPCCON = 0xaaaaaaaa;
rGPCUP  = 0xffff;
    
rGPDCON = 0xaaaaaaaa;      
rGPDUP  = 0xffff;
  
rGPECON = 0xaaaaaaaa;      
rGPEUP  = 0xffff;    
  
rGPFCON = 0x55aa;
rGPFUP  = 0x00;//0xff;
  
rGPGCON = 0xff95ffba;
rGPGUP  = 0xffff;

rGPHCON = 0x2afaaa;
rGPHUP  = 0x7ff;
  
rGPJDAT = (1<<12)|(0<<11);
rGPJCON = 0x016aaaa;
rGPJUP    = ~((0<<12)|(1<<11));

rGPJDAT = (0<<12)|(0<<11);
rGPJCON = 0x016aaaa;
rGPJUP    = 0x1fff;//~((1<<12)|(1<<11));
    
//External interrupt will be falling edge triggered.
rEXTINT0 = 0x22222222;    // EINT[7:0]
rEXTINT1 = 0x22222222;    // EINT[15:8]
rEXTINT2 = 0x22222222;    // EINT[23:16]
}
/*-----------------------------------------------------------------------------------------------------*/
void uart_init(void)                     //串口初始化
{//uart0
//线性控制寄存器
rULCON0=(0<<7)    |  //保留
         (0<<6)    |  //0=正常模式,1=红外收/发模式
         (0x000<<3)|  //0xx=无效验,100=奇效验,101=偶效验,110=强制为1,111=强制为0
         (0<<2)    |  //0=1位停止位,1=2位停止位
         0x11;        //数据长度,00=5位,01=6位,10=7位,11=8位
//UART 控制寄存器        
rUCON0=(0x00<<12) |  //FCLK divider
        (0x00<<10) |  //波特率选择,00,10 = PCLK,01 = UEXTCLK,11 = FCLK/n   UBRDIVn=(int)(UCLK/(bps*16))-1                      //          
        (1<<9)     |  //发送中断类型:0=脉冲,1=电平
        (0<<8)     |  //接收中断类型:0=脉冲,1=电平
        (0<<7)     |  //是否使能接收超时中断:0=不允许,1=允许
        (0<<6)     |  //是否允许接收错误状态时中断:0=不允许,1=允许
        (0<<5)     |  //0=正常模式,1=回送模式
        (0<<4)     |  //0=正常发送,1=发送打断信号
        (0x01<<2)  |  //是否发送数据到发送缓冲器:00=不发送,01=中断请求,10=DMA0请求,11=DMA1请求
        0x01;         //是否从接收缓冲器中接收数据:00=不接收,01=中断请求,10=DMA0请求,11=DMA1请求
//UART FIFO 控制寄存器      
rUFCON0=(0x00<<6) |  //决定发送FIFO的触发等级:00=Empty,01=16-byte,10=32-byte,11=48-byte
         (0x00<<4) |  //决定接收FIFO的触发等级:00=1-byte,01=8-byte,10=16-byte,11=32-byte
         (0<<3)    |  //Reserved
         (0<<2)    |  //在重置FIFO后自动清除,0=Normal,1=Tx FIFO reset
         (0<<1)    |  //在重置FIFO后自动清除,0 Normal,1=Rx FIFO reset
         0;           //FIFO Enable,0=Disable,1=Enable
//UART MODEM 控制寄存器        
rUMCON0=(0x00<<5) |  //这些位必须为0
         (0<<4)    |  //Auto Flow Control (AFC): 0=无效,1=有效
         (0x00<<1) |  //这些位必须为0
         0;           //如果AFC位有效,则该值被忽略。在这种情况下S3C2440A将自动控制nRTS。如果AFC位无效,
                      //nRTS必须由软件控制。0 = 'H' level (去激活nRTS) 1 = 'L' level (激活nRTS)
//UART 波特率除数寄存器
rUBRDIV0=0x144;//波特率因子,UBRDIVn=(int)(PCLK/(baud*16))-1



pISR_TIMER0=(int)timer0_irq;
pISR_UART0=(int)uart0_irq;




//开IRQ,FIQ
CLR_IF();