主要记录一下,自己最近处学习的DSP的SCI模块钻了牛角尖的两点问题。
(自用记录,防止遗忘!!)
如果有什么地方不对,欢迎指正,共同进步~
问题1. 为什么在错误情况下,出现的现象与预期不同?
答:时间差的问题。当开发板上点程序烧录后,会实现对PC机发送“Hello......”字符串,全部发送至FIFO寄存器后,程序继续向下运行,直到使能发送中断函数、使能接收中断函数,打开全局变量等,此时给上位发送的字符串还没有全部从FIFO寄存器经移位寄存器发送完,就导致了后面的这一部分未发完的字符串,触发了发送中断函数,将中断函数中的“Enter.....”显示出来,这就解释通了为什么与预期的错误现象不同。
背景:在使用FIFO寄存器进行SCI通信时,出现了上电后显示的字符串与预期的不同,经过分析后,发现是进入了发送中断函数中。
具体可通过实验过程中的图进行理解:
1)按理说,刚上电应该只显示如下两句话:
2)实际上电后串口显示如下:
3)多显示了一行Enter....,此句正好是发送中断函数里的句子,因此可知,是进到了中断函数中。
解决方法:
设置FIFO时,将如下语句进行修改,关闭发送中断。
更改后的语句如下:
实验现象:
此时,就不会进到发送中断函数中了,那么有人就会疑惑,后面发送数据的时候怎么发送呢,中断函数不是进不去了吗?
答:其实在例程中已经进行了处理。如下:
在进到接收中断函数时,就先将发送中断打开了,然后在进入到发送中断函数时将其关闭,防止一直陷在这个中断函数中。
到这里,第一个问题就得到了解答。
【总结】由此可知,官方例程中之所以使用了中断发送函数与接收函数内容的嵌套,就是因为考虑到了这里的时间差,使程序运行时,可以直接多显示一句“Enter....(输入XX个字符)”作为提示语句。所以结论是,官方例程这是有意为之,也是一种可取的方法。后面可以使用示波器直接测量一下其数据流的时间差。
问题2. 为什么在PC给下位发送数据的时候,发送数据X>=5时,上位接收到的数据就会产生错误,会有发送中断函数的部分语句?
答:首先,“发送数据X>=5时,上位接收到的数据就会产生错误”,是因为这里接收FIFO深度设置的是3,就与通讯达成了协议,规定了只能发送3个数据,若超出该规定数据量,就有可能会产生错误。其次,“PC接收数据中,会有发送中断函数的部分语句”,是因为与问题1是相同的原因,从FIFO发送至移位寄存器,再发送到PC显示出来,这里有一个时间差。具体算法如下:
波特率设置9600,发送一位数据的时间是(1/9600)s,我们设置的一个数据字符含有是10位(8个数据位,一个起始位,一个暂停位),因此发送一个字符的时间是10*(1/9600)s=10.42ms,这就是接收一个字符的时间,从接收到一个字符再到发送给上位就需要20.84ms。
这就是我们发送与接收完一个字符所需的时间,当在发送长一点的字符串时,就会产生一个不可忽略的时间差,从而就导致了,数据发完了,但是还有一部分没从FIFO里出来,就触发了发送中断函数,从而显示了部分中断函数里面的语句。
实验现象: