最近在调试2440的串口发送中断,遇到了不少的问题,现根据调试的结果总结一下:
不知道是2440的硬件设计问题,还是我没有弄明白它这么设计的根据或者使用方法,总之遇到了不少问题。
根据遇到的问题得出三个结论(我认为的结论),如果你使用了串口的发送中断,并开启了FIFO功能,那么在配置上需要注意
1、UCON的Transmit Mode必须一开始就打开,而且后面不需要关闭,除非你最后确定不再使用串口发送了。
原因是这个位不打开,你没法发送数据,它不仅是个中断标志位,还是发送模式的选择位。如果你打开了串口发送中断
INTSUBMSK &= ~(BIT_SUB_RXD0 | BIT_SUB_TXD0);
又设置了发送中断函数siors_tx_isr()
那么不设置这一位,你中断没法进去,这个很明显,关键是你直接写s3c_utxh也没用。可能有人觉得这是废话,但是一开始我就没有打开,然后直接写s3c_utxh一组数据,
然后再打开这一位,中断打开后,FIFO里面的数据就直接发出去了,不过我发现没有进入中断函数,不知道什么原因,难道跟Triggle Level有关?
2、还是UCON寄存器,是Tx Interrupt Type这一位,关于选择Pulse或者Level的问题,开始我选择了Pulse位,然后单步执行,程序就无休止一直循环于发送中断函数,
就是它一直会进中断,这也可以理解,就是FIFO开始一直为空,而你打开了中断位,所以它一直进入中断。所以选择Level这一位。
3、还有就是UFCON寄存器的Tx FIFO Triggle Level这一位,开始我选择了32byte,每次填32byte,但是每次都发不全。这一位的含义是讲发送FIFO里面剩余32个byte后就会触发中断,
后来根据网上的文章,改成了16byte,它的工作原理是这样的,比如你有100个byte需要发送,你的FIFO是64byte,你一次性写入48个数据,然后FIFO移出了32byte,还剩余16byte,这时触发中断,中断里面再去填48位,然后再移出48byte,还剩16byte再次产生中断。最后还有4byte,直接写入s3c_utxh,这样所以的数据就全部发出去了。我搞不明白的是32byte为什么不行,难道设置成32byte时,需要每次写入的数据要大于这个32吗?我没有去验证。
遇到同样问题的同学请参考以下文章
http://blog.csdn.net/stephen_yu/article/details/19199399