void uart1IsrInit(void)
{
INT16U usFdiv;
U1LCR = 0x87; // 允许设置波特率,8位数据,2位停止位
usFdiv = (FPCLK / 16) / UART_BPS; // 设置波特率
U1DLM = usFdiv / 256;
U1DLL = usFdiv % 256;
U1LCR = 0x07; // 锁定波特率
// U1FCR = 0x87; // 使能FIFO,设置8个字节触发点
U1FCR = 0x07; // 使能FIFO,设置1个字节触发点
U1IER = 0x01; // 使能接收中断
}
上面是我的初始化程序,波特率为38400。先是使用8个字节的触发点,发现接收到16个字节后,U1LSR.0位被清除;然后改为一个字节触发一次,依然是到16个字节后,U1LSR.0位被清除。请各位帮我找找问题所在,谢谢了!以下为我的中断程序。
void uart1Isr (void)
{
while ((U1IIR & 0x01) == 0) // 判断是否有中断挂起
{
switch (U1IIR & 0x0e) // 判断中断标志
{
case 0x04: // 接收数据中断
uc_RcvBuf[uc_RcvNum++] = U1RBR;
if((U1LSR & 0x01) == 0)
{
uc_RcvNewFlag = 1;
uc_RcvNum = 0;
}
break;
case 0x0C: // 字符超时中断
while((U1LSR & 0x01) == 0x01) // 判断数据是否接收完毕
{
uc_RcvBuf[uc_RcvNum++] = U1RBR;
}
uc_RcvNum = 0;
uc_RcvNewFlag = 1;
break;
default:
break;
}
}
}
数据是不定长的。谢谢各位了!
此帖出自
小平头技术问答
U1LSR应该不是这样用的,是接收中断后,循环读取数据判断用的,读完缓冲就退出,但无法判断一帧数据是否接收完成。。。。。。
- switch (U1IIR & 0x0E)
- {
- case 0x0C: // 若为超时中断(注意此处不要加break)
- case 0x04: // 若为接收中断
- while ((U1LSR & 0x01) == 1) // 若U1RBR包含有效数据
- Rec_Buffer[index++] = U1RBR; // 保存接收到的数据
- }
复制代码[ 本帖最后由 zhaojun_xf 于 2012-8-30 13:50 编辑 ]
一周热门 更多>