在一个项目中,?用CH559L的UART1进行只发不收(1s发送100次左右的数据串),?和能发能收(60s使能一次);
#define? uart1_EnRxd? IE_UART1=?1? ? ? ? ? ?// 开启 接收中断, 这个60s使能一次
#define? uart1_UnRxd? IE_UART1=0? ? ? ? ?// 关闭 接收中断, 收一次数据就关闭中断
void uart1_init()
{
unsigned int x;
SER1_LCR |= bLCR_DLAB;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 停 设置屏蔽
SER1_DIV = 12;
x = 10 * 12000000 * 2 / 12 / 16 / 115200;? ? ? ? ? ? ? ? ? ? ? ? ? // 默认时钟, 12分频, 115200bps
if ( x % 10 >= 5) x += 10;
x /= 10;
SER1_DLM = x >> 8;
SER1_DLL = x;
SER1_LCR &= ~bLCR_DLAB;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 启 设置屏蔽
XBUS_AUX |= bALE_CLK_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // UART 功能
SER1_LCR = bLCR_WORD_SZ1 | bLCR_WORD_SZ0;? ? ? ? ? ? ? // 8bit, NONE, 1stop
SER1_IER = bIER_PIN_MOD1 | bIER_RECV_RDY;? ? ? ? ? ? ? ? ? ? // P2.6, P2.7, RDY这个中断是必须要使能吗, 不使能好像都不能发送
SER1_FCR = MASK_U1_FIFO_TRIG | bFCR_T_FIFO_CLR | bFCR_R_FIFO_CLR | bFCR_FIFO_EN;? ? ? ? // SER1_FCR = 0xC7
SER1_MCR = bMCR_OUT2;
SER1_ADDR |= 0xff;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 点对点?
}
void UART1_Interrupt(void) interrupt INT_NO_UART1 using 1 ? ? ? ? ? ? ? ?//UART1中断服务程序,使用寄存器组1
{
u8 _tmp = 0;
u8 _int = SER1_IIR & 0x0f; // SER1_IIR 低4位, 组成7个中断标志
switch(_int){
case U1_INT_RECV_RDY:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 数据可用 中断
? ? _tmp = UART1_Rxd(&UART1_RecBuff[CNT_Rxd1]);? ? //? 7位 FIFO 数据
? ? CNT_Rxd1 += _tmp;
? ? FLAG_RecFull = 1;? ? ? ? ? ? ? ? ? ? ?
break;
case U1_INT_RECV_TOUT:? ? ? ?// 接收超时 中断?
? ? _tmp = UART1_Rxd(&UART1_RecBuff[CNT_Rxd1]);? ? ?// 1~6 位 FIFO 数据
? ? CNT_Rxd1 += _tmp;
? ? FLAG_RecHalf = 1;
break;
case U1_INT_LINE_STAT://线路状态中断
break;
case U1_INT_SLV_ADDR://设备地址match中断
break;
case U1_INT_NO_INTER://无中断
break;
case U1_INT_MODEM_CHG:? ? //MODEM中断
_tmp = SER1_MSR;? ? // 读 SER1_MSR 清中断
break;
case U1_INT_THR_EMPTY:? ? //发送空中断,可以启动下次发送或者等待接收
break;
default:? ? break;
}
}
发现的问题:
uart1_init()初始化后,? 读SER1_FCR为 0xC1,? 显示bFCR_FIFO_EN,? 这个是对的,? 但收了几次数据(未开启UART1中断)后, SER1_FCR变为了 0xC4;? ? 这是什么原因,?有什么影响呢;
开启uart1_EnRxd后,? 从UART1中断接收数据,? ?经常会跑飞(程序死机).? ?外部main函数是根据FLAG_RecFull? ?和? ?FLAG_RecHalf标志位,? ?判断长度是否满足总数据长度15位,? ?再读取进行判断.?
关于U1_INT_RECV_TOUT,? ?接收超时中断;? ? 如果接收的数据正好是7位(使能7位FIFO),? ?那这个时候响应的应该是U1_INT_RECV_RDY中断还是U1_INT_RECV_TOUT中断呢(或者是2个都响应);?
这个是我这个函数有问题吗? 有没有完善一点的UART1接收函数例程呢, 多谢了
帖子修改之后,?空格?会被识别成"?",?这个问题...