请教专家,我在使用SCI通讯时,发送采用普通查讯方式不中断,接收采用FIFO 增强功能 1字节就中断,在长时间通讯过程中偶尔会出现接收中断进不去的现像,请问有何办法解决,我没有使能RX ERR INT ENA,是否是通讯出错SCI接收中断就进不去了,如果这样,我使能RX ERR INT ENA 在中断接收里查RX ERROR位,如为1则先将 SW RESET清零 NOP 30后再将SW RESET置1来重新使能SCI,这样不管出现什么问题SCI都可以正常工作了吗?或者必须要重新上电复位?(使用的是例程序)
Eric Ma:
LOFTY,
从下面这张图可以看到,让RX FIFO功能使能后,即SCIFFENA,普通RX的中断就已经没有产生作用了。正常来讲,应该不会出现你说的这种问题,因为RXFFIL4−0设置为1,只要接收到1个字符,就可以进入FIFO rx中断。会不会是调试过程中没有接收到数据,或是数据受干扰了?
请教专家,我在使用SCI通讯时,发送采用普通查讯方式不中断,接收采用FIFO 增强功能 1字节就中断,在长时间通讯过程中偶尔会出现接收中断进不去的现像,请问有何办法解决,我没有使能RX ERR INT ENA,是否是通讯出错SCI接收中断就进不去了,如果这样,我使能RX ERR INT ENA 在中断接收里查RX ERROR位,如为1则先将 SW RESET清零 NOP 30后再将SW RESET置1来重新使能SCI,这样不管出现什么问题SCI都可以正常工作了吗?或者必须要重新上电复位?(使用的是例程序)
LOFTY DVRE:
回复 Eric Ma:
哦!也就是只要使能了SCIFFENA 接收和发送都是通过FIFO来进行的,至于发送和接收是否用中断方式,是可以分别设置的!普通的方式SCICTL2和SCIRXST都不起作用了?
请教专家,我在使用SCI通讯时,发送采用普通查讯方式不中断,接收采用FIFO 增强功能 1字节就中断,在长时间通讯过程中偶尔会出现接收中断进不去的现像,请问有何办法解决,我没有使能RX ERR INT ENA,是否是通讯出错SCI接收中断就进不去了,如果这样,我使能RX ERR INT ENA 在中断接收里查RX ERROR位,如为1则先将 SW RESET清零 NOP 30后再将SW RESET置1来重新使能SCI,这样不管出现什么问题SCI都可以正常工作了吗?或者必须要重新上电复位?(使用的是例程序)
Eric Ma:
回复 LOFTY DVRE:
LOFTY,
是的,如果你FIFO使能之后,你如果不设置中断的话,那么要查询FIFO的状态位了,而非是RXRDY。
Eric
请教专家,我在使用SCI通讯时,发送采用普通查讯方式不中断,接收采用FIFO 增强功能 1字节就中断,在长时间通讯过程中偶尔会出现接收中断进不去的现像,请问有何办法解决,我没有使能RX ERR INT ENA,是否是通讯出错SCI接收中断就进不去了,如果这样,我使能RX ERR INT ENA 在中断接收里查RX ERROR位,如为1则先将 SW RESET清零 NOP 30后再将SW RESET置1来重新使能SCI,这样不管出现什么问题SCI都可以正常工作了吗?或者必须要重新上电复位?(使用的是例程序)
LOFTY DVRE:
回复 Eric Ma:
这样的话也就是说接收不可能出错误导致无法进入FIFO接收中断!我接收是采用中断方式的,发送不中断,发送查TXFFST,但是就是出现时间久了有时就会有SCI好像当机了一样,必须重新上电void scib_loopback_init(){ ScibRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback 通讯控制寄存器 ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, ScibRegs.SCICTL2.bit.TXINTENA =1; ScibRegs.SCICTL2.bit.RXBKINTENA =1; ScibRegs.SCIHBAUD =0x0000; ScibRegs.SCILBAUD =0x0028;//115200 ScibRegs.SCICCR.bit.LOOPBKENA =0; // Disable loop back 自测试模式禁用与使能如使能则发送引脚与接收引脚在内部相连 ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset }
// Initalize the SCI FIFOvoid scib_fifo_init(){ ScibRegs.SCIFFTX.all=0xE040; ScibRegs.SCIFFRX.all=0x0021;//0x00214 1个数据中断一次 ScibRegs.SCIFFCT.all=0x0; ScibRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset ScibRegs.SCIFFRX.bit.RXFIFORESET=1;//FIFO接收寄存器 写0复位FIFO指针到0保持复位状态
}
void scib_xmit(int b){ while (ScibRegs.SCIFFTX.bit.TXFFST != 0) {} ScibRegs.SCITXBUF=b; }