2812串口的接收和发送都有16个字节深度的FIFO,这个FIFO可以启用或者关闭,接收和发送都有5位来指示FIFO现存的字节量。
同时2812的串口还有通常串口常见的标志位,例如TXRDY和RXRDY等等。
问题出现了,发现2812是这样的,当你开了串口的FIFO功能时候,TXRDY 和 RXRDY的标志位功能失效了,即,当接收到字符的时候(假如1个),开了FIFO功能,这个时候,RXRDY不指示满(此位不为1),而FIFO的TXFIFST会等于1;发送也一样道理。
而当你关闭了串口FIFO的时候,接到字符,RXRDY就会置1了,但是TXFIFST没反应了。
所以,根据以上,假如要用串口的话,用查询的方法,就要根据FIFO是否开启,来查询不同的标志位了(例如接收,开了的话查RXFIFST是否大于等于1,关了的话查RXRDY)!假如用中断的方法的话,就要注意在串口的寄存器里面开哪个中断了,假如开了FIFO,就要开FIFO中的匹配中断;假如关了的话就要开Tx INT ENA等中断位,当然,两边的中断都开也可以的。
看上面,FIFO打开了,接收FIFO里面有一个字节了,但是RXRDY不置位,此时,由于FIFO匹配中断没打开,中断服务程序也不会进入了。
接收的查询用:while(ScibRegs.SCIFFRX.bit.RXFIFST != 1) { }
发送的查询用:while (ScibRegs.SCIFFTX.bit.TXFFST != 0) { }
这里,FIFO关闭了,RXFIFST就不会增了,但是RXRDY置位了,同时,中断也进去了。
接收的查询用:while(ScibRegs.SCIRXST.bit.RXRDY !=1) { }
发送的查询用:while (ScibRegs.SCICTL2.bit.TXRDY != 1){ }