我在用中断的方式处理CH432接收数据时,发现一个奇怪的问题,详细如下:
CH432初始化:
void InitCH432(void) /* 初始化CH432 */
{
UINT16 CH432div;
UINT8 DLM;
UINT8 CH432DLL;
/**************************************************************************
设置CH432串口0的寄存器
**************************************************************************/
CH432div = ( Fpclk >> 4 ) / CH432_BPS;
DLM = CH432div >> 8;
CH432DLL = CH432div & 0xff;
WriteCH432Data( CH432_IER_PORT, BIT_IER_RESET); //端口复位//
WriteCH432Data( CH432_LCR_PORT, BIT_LCR_DLAB ); /* 设置DLAB为1 */
WriteCH432Data( CH432_DLL_PORT, CH432DLL ); /* 设置波特率 */
WriteCH432Data( CH432_DLM_PORT, DLM );
WriteCH432Data( CH432_FCR_PORT, BIT_FCR_FIFOEN ); /* 设置FIFO模式,触发点为1 */
WriteCH432Data( CH432_LCR_PORT, BIT_LCR_WORDSZ1
| BIT_LCR_WORDSZ0 ); /* 字长8位,1位停止位、无校验 */
/**************************************************************************
设置CH432串口1的寄存器
**************************************************************************/
CH432div = ( Fpclk >> 4 ) / CH432_BPS1;
DLM = CH432div >> 8;
CH432DLL = CH432div & 0xff;
WriteCH432Data( CH432_IER1_PORT, BIT_IER_RESET); //端口复位//
WriteCH432Data( CH432_LCR1_PORT, BIT_LCR_DLAB ); /* 设置DLAB为1 */
WriteCH432Data( CH432_DLL1_PORT, CH432DLL ); /* 设置波特率 */
WriteCH432Data( CH432_DLM1_PORT, DLM );
WriteCH432Data( CH432_FCR1_PORT, BIT_FCR_RECVTG1 | BIT_FCR_FIFOEN ); /* 设置FIFO模式,触发点为8 bytes */
WriteCH432Data( CH432_LCR1_PORT,
BIT_LCR_WORDSZ1
| BIT_LCR_WORDSZ0 ); /* 字长8位,1位停止位、无校验 */
WriteCH432Data( CH432_IER1_PORT, BIT_IER_IERECV ); /* 允许接收到数据中断 */
WriteCH432Data( CH432_MCR1_PORT, BIT_MCR_OUT2 ); /* 允许中断输出,DTR,RTS为1 */
}
中断处理子程序:
void CH432Interrupt(void) /* 中断方式处理 */
{
UINT8 InterruptStatus;
UINT8 RcvNum = 0;
UINT8 i;
// UINT8 Status;
InterruptStatus = ReadCH432Data( CH432_IIR_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED );
if( ( InterruptStatus & 0x01 ) ) /* 没有中断转到串口1 */
{
InterruptStatus = ReadCH432Data( CH432_IIR1_PORT ) & ( ~ CH432_IIR_FIFOS_ENABLED ); /* 读串口1的中断状态 */
if( ( InterruptStatus & 0x01 ) ) return; /* 没有中断退出 */
else
{
Delay_ms(30);//必须加上
ReadCH432Data( CH432_FCR1_PORT ); //这句不知什么意思,必须加上才接收正常
ReadCH432Data( CH432_LSR1_PORT ); //这句不知什么意思,必须加上才接收正常
ReadCH432Data( CH432_MCR1_PORT ); //这句不知什么意思,必须加上才接收正常
switch( InterruptStatus )
{
case INT_MODEM_CHANGE:
ReadCH432Data(CH432_MSR1_PORT); //不处理
break;
case INT_NOINT: /* 没有中断 */
break;
case INT_THR_EMPTY: /* 发送保持寄存器空中断 */
ReadCH432Data(CH432_IIR1_PORT); //不处理
break;
case INT_RCV_SUCCESS: /* 串口接收可用数据中断 */
case INT_RCV_OVERTIME: /* 接收数据超时中断 */
RcvNum = CH432Seril1Rcv( buf );
for(i=0;i {
if(rb_can_write(&u_ring_buff) > 0)
{
rb_write(&u_ring_buff, &buf[i], 1);
}
}
print_buf((U8 *)u_ring_buff.rb_buff,RcvNum,"RcvData");
break;
case INT_RCV_LINES: /* 接收线路状态中断 */
ReadCH432Data( CH432_LSR1_PORT); //不处理
break;
default: /* 不可能发生的中断 */
break;
}
}
}
else
{
switch( InterruptStatus )
{
case INT_MODEM_CHANGE:
ReadCH432Data( CH432_MSR_PORT ); //不处理
break;
case INT_NOINT: /* 没有中断 */
break;
case INT_THR_EMPTY: /* 发送保持寄存器空中断 */
ReadCH432Data(CH432_IIR_PORT); //不处理
break;
case INT_RCV_SUCCESS: /* 串口接收可用数据中断 */
RcvNum = CH432Seril0Rcv( buf );
for(i=0;i {
if(rb_can_write(&u_ring_buff) > 0)
{
rb_write(&u_ring_buff, &buf[i], 1);
}
}
break;
case INT_RCV_LINES: /* 接收线路状态中断 */
ReadCH432Data( CH432_LSR_PORT); //不处理
break;
case INT_RCV_OVERTIME: /* 接收数据超时中断 */
RcvNum = CH432Seril0Rcv( buf );
for(i=0;i {
if(rb_can_write(&u_ring_buff) > 0)
{
rb_write(&u_ring_buff, &buf[i], 1);
}
}
break;
default: /* 不可能发生的中断 */
break;
}
}
}
现在问题就是,在中断子程序里必须加上下面这四个语句,接收数据才正常,不加的话就无法接收到任何数据:
Delay_ms(30);//必须加上
ReadCH432Data( CH432_FCR1_PORT ); //这句不知什么意思,必须加上才接收正常
ReadCH432Data( CH432_LSR1_PORT ); //这句不知什么意思,必须加上才接收正常
ReadCH432Data( CH432_MCR1_PORT ); //这句不知什么意思,必须加上才接收正常
不加上这四句,LSR的数值就一直为0xE3,而且INT中断引脚一直被拉低,无法恢复到高电平,不知是什么原因,有哪位大神知道原因的,麻烦帮解答一下,谢谢了