做项目中发现,CH438芯片第一次接收到数据后,无论数据是什么,总是收到一串0x01的字符,且中断引脚拉低后无法再次自动拉高,MCU也无法强制拉高,无法产生第二次中断。目前只开了接收中断和接收线路错误中断,第一次中断没有进入线路错误中断,关闭线路错误中断现象不变。
请问下这是什么原因?
做项目中发现,CH438芯片第一次接收到数据后,无论数据是什么,总是收到一串0x01的字符,且中断引脚拉低后无法再次自动拉高,MCU也无法强制拉高,无法产生第二次中断。目前只开了接收中断和接收线路错误中断,第一次中断没有进入线路错误中断,关闭线路错误中断现象不变。
请问下这是什么原因?
补充:接收到第一次中断后,读取SSR寄存器,结果为0x01,因为是串口1输入数据,读串口1的IIR寄存器结果为0X0C,进入接收超时中断,因为发送数据没有超过112字节。之后在主循环中不断读取SSR寄存器,发现SSR寄存器始终为0x01,无法清除中断,强制向SSR寄存器写入0x00后,SSR寄存器依旧为0x01.
补充:接收两次后读IIR寄存器,为0x04,数据可用中断,在主循环中不断读取RBR寄存器,读出来的值始终为0x01,无法通过读取RBR寄存器清除IIR寄存器的中断。初步怀疑是RBR寄存器中不断产生0x01的数据导致FIFO溢出,一直产生中断,导致INT引脚无法拉高。
所以这个问题怎么解决啊
您好,您是否将438的INT脚用于外部中断函数触发,并且为下降沿触发?
如果是,您可以在进中断后处理服务函数前加一句INT脚的低电平判断,
因为我们的中断脚是低电平有效,当有连续 的数据进来时,会一直触发中断,此时INT脚一直为低,主控的外部中断服务函数如果请了中断标志位,此时没有下降沿 ,会导致无法再进中断服务函数,从而无法取走数据,无法拉高INT,导致一直为低
while(INT? == 0)
{
处理438接收数据
}
谢谢回答,问题已解决!不过最后发现问题是出在更改波特率以后,忘记将LCR寄存器的DLAB位置零,导致无法读取RBR寄存器,无法取出FIFO中的数据。