2008042123 发表于 2012-10-23 21:44:27

TL16C550与dsp的异步串口通信

用查询方式能够成功实现通信,但是用中断总是出不来!!

找高人指点一下!!谢谢
#define UART_BASE_ADDR                0x90120000
#define MCWA            *(int *)0x90100008//外扩寄存器地址MCWA,D3 到 D0 有效
#define OFFSET            2
#define RBR                                        *((short *)(UART_BASE_ADDR+0*OFFSET))//        接收缓冲寄存器 RBR
#define THR                                        *((short *)(UART_BASE_ADDR+0*OFFSET))//        发送缓冲寄存器 THR
#define IER                                        *((short *)(UART_BASE_ADDR+1*OFFSET))//中断始能寄存器IER
#define IIR                                        *((short *)(UART_BASE_ADDR+2*OFFSET))//        中断标志寄存器IIR
#define FCR                                        *((short *)(UART_BASE_ADDR+2*OFFSET))//        FIFO 控制寄存器 FCR
#define LCR                                        *((short *)(UART_BASE_ADDR+3*OFFSET))//线路控制寄存器LCR
#define MCR                                        *((short *)(UART_BASE_ADDR+4*OFFSET))//MODEM 控制寄存器 MCR
#define LSR                                        *((short *)(UART_BASE_ADDR+5*OFFSET))//线路状态寄存器LSR
#define MSR                                        *((short *)(UART_BASE_ADDR+6*OFFSET))//MODEM 状态寄存器 MSR
#define SCR                                        *((short *)(UART_BASE_ADDR+7*OFFSET))//暂存寄存器 SCR
#define DLL                                        *((short *)(UART_BASE_ADDR+0*OFFSET))//低位除数寄存器 DLL
#define DLM                                        *((short *)(UART_BASE_ADDR+1*OFFSET))// 高位除数寄存器 DLM   
#define CECTL1                    *((long *)0x01800004) // 定义EMIF CE1的地址
void wait();
       


//char cString={ "Hello PC!,Over|" },cReceive,cBuffer,cAnswer={"Oh,you say"};
//int bReceive,nLen;

main()
{
   
        MCWA=0x00080008;
        LCR = 0x80; //使能波特率设置寄存器。DLAB=1.访问除数和功能切换寄存器,奇校验,奇偶校验无效,一个停止位,数据长度5位
        DLL = 0x18; // 波特率9600
        DLM = 0x00;
        LCR = 0x03;// 设置数据格式:无校验,一个停止位,数据长度8位
        FCR = 0x01;//允许FIFO
        MCR = 0x08;//MODE控制
        IER = 0x01; // 使能接收就绪中断   
    InitInterrupt();
    while(1)
       {}
       
}
          
void interrupt XINT4()        //中断响应函数
{
    unsigned int uWork;
    while(LSR&0x01) //接收数据就绪
        {
           uWork=RBR&0xff;//接收数据
           THR=uWork;//将接收到的数据发送出去
        }

        FCR=0x03;//清空FIFO
}

void InitInterrupt(void)
{
        // 设置中断控制寄存器
        CSR&=0xfffffffe;        // 关中断 GIE=0
        ISTP=0x00000c00;        // 重置中断向量表到0C00h
           IMH=0x0;                        // 指定xint4中断
           IML=0x04;
           ICR=0xff;                        // 清除等待的中断
        IER=0x13;                        // 使能xint4中断
        CSR=CSR|1;                         // 开中断
}

redsword84 发表于 2012-10-23 22:47:52

上示波器,看中断信号出来了吗?没出来,就是配置问题,出来了,就是程序问题

2008042123 发表于 2012-10-24 18:58:35

就是看相应的的中断信号位的信号跳转情况吧!

2008042123 发表于 2012-10-24 21:34:24

搞定了,定义有问题,把#define IER                                        *((short *)(UART_BASE_ADDR+1*OFFSET))//中断始能寄存器IER
改一下,不然就把系统自带的IER覆盖了
页: [1]
查看完整版本: TL16C550与dsp的异步串口通信