在使用TMS320F28335的串口时,接收采用FIFO,中断进入的方式为匹配中断。发现如果在中断程序中如果不读取SCIRXBUF中的的数据,那么正常情况下只执行一次的中断程序实际上执行了两次;同样的程序,如果在中断程序中添加读取SCIRXBUF的代码,则正常情况下只执行一次的中断程序实际上执行了一次(这种情况下串口接收中断的工作是正常的)。可以确信的是串口接收中断程序是正确的,问题就是在中断中如果不读取接收寄存器,则中断程序执行两次,而且该现象很稳定。三路串口均进行了测试,得到的结论相同:在串口接收中断程序中如果不读取接收寄存器的数据,则串口接收中断程序执行两次;如果读取,则该中断程序的执行正常。求高人解释。
Eric Ma:
Lin,
串口FIFO中断的定义就是当FIFO RX level 大于或等于这个设置的值的时候,就会进入中断。那么如果你在中断里面没有读取SCIRXBUF的数据,也就是没有把FIFO的数据读出来,显示还是满足中断的条件。
我认为如果中断水平设置为2,那么你在中断里面只读取1个数据,那么当只接收到一个数据的时候,它还是会进入中断的。
问题是:如果你没有把数据读取,而且在中断服务函数中有正常清除相关中断标志位的话,那么芯片应该会一直进入中断的才对。
Eric
在使用TMS320F28335的串口时,接收采用FIFO,中断进入的方式为匹配中断。发现如果在中断程序中如果不读取SCIRXBUF中的的数据,那么正常情况下只执行一次的中断程序实际上执行了两次;同样的程序,如果在中断程序中添加读取SCIRXBUF的代码,则正常情况下只执行一次的中断程序实际上执行了一次(这种情况下串口接收中断的工作是正常的)。可以确信的是串口接收中断程序是正确的,问题就是在中断中如果不读取接收寄存器,则中断程序执行两次,而且该现象很稳定。三路串口均进行了测试,得到的结论相同:在串口接收中断程序中如果不读取接收寄存器的数据,则串口接收中断程序执行两次;如果读取,则该中断程序的执行正常。求高人解释。
Lin Wang2:
回复 Eric Ma:
是的,你说得很对。根据实际的测试,没有读取数据的时候,在中断程序中清除标志位后,进中断的次数为两次(正常为一次)。不知道FIFO接收寄存器究竟是如何操作的。我做了相关的实验,将串口接收中断的等级设置为11,使用串口调试助手发送数据,每次发送11个十六进制数,发现每手动发送一次数据,如果在串口接收中断中不读取接收寄存器时,要进两次中断;如果在串口接收中断程序中读取接收寄存器的话,则只会进一次中断。这个现象很稳定,我更换了串口,修改了接收等级,得到的现象很稳定。我怀疑是不是DSP的硬件存在这个bug。以前使用串口接收中断的时候都是在接收中断程序中读取SCIRXBUF,所以没有碰到这个问题。这次为了保证数据访问不出现问题,不能在串口接收中断程序中读取数据,调试的时候就发现了这个问题。
在使用TMS320F28335的串口时,接收采用FIFO,中断进入的方式为匹配中断。发现如果在中断程序中如果不读取SCIRXBUF中的的数据,那么正常情况下只执行一次的中断程序实际上执行了两次;同样的程序,如果在中断程序中添加读取SCIRXBUF的代码,则正常情况下只执行一次的中断程序实际上执行了一次(这种情况下串口接收中断的工作是正常的)。可以确信的是串口接收中断程序是正确的,问题就是在中断中如果不读取接收寄存器,则中断程序执行两次,而且该现象很稳定。三路串口均进行了测试,得到的结论相同:在串口接收中断程序中如果不读取接收寄存器的数据,则串口接收中断程序执行两次;如果读取,则该中断程序的执行正常。求高人解释。
rui liu4:
回复 Lin Wang2:
您好,我最近也在做FIFO中断,结果一直是无法接收,不知道我的配置是不是有问题