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; // 开中断
} 上示波器,看中断信号出来了吗?没出来,就是配置问题,出来了,就是程序问题 就是看相应的的中断信号位的信号跳转情况吧! 搞定了,定义有问题,把#define IER *((short *)(UART_BASE_ADDR+1*OFFSET))//中断始能寄存器IER
改一下,不然就把系统自带的IER覆盖了
页:
[1]