This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

2812串口使用心得(主要是关于中断)

  2812串口的接收和发送都有16个字节深度的FIFO,这个FIFO可以启用或者关闭,接收和发送都有5位来指示FIFO现存的字节量。

  同时2812的串口还有通常串口常见的标志位,例如TXRDYRXRDY等等。

  问题出现了,发现2812是这样的,当你开了串口的FIFO功能时候,TXRDY RXRDY的标志位功能失效了,即,当接收到字符的时候(假如1个),开了FIFO功能,这个时候,RXRDY不指示满(此位不为1),而FIFOTXFIFST会等于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){ }


 

看上面,datasheet里面这个表也很清楚了,开FIFO和关FIFO,中断的标志位是不一样的。

 

这个笔记记在OneNote里面好久,这次正好拿来交流一下,呵呵~~~