【复盘】F280049串口通信SCI实验过程中钻的牛角尖points

6 篇文章 0 订阅

主要记录一下,自己最近处学习的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里出来,就触发了发送中断函数,从而显示了部分中断函数里面的语句。

实验现象:

 【总结】在FIFO深度设置时就达成了相关协议,你设置多少就输多少,不能随心所欲,超过就必然会出现错误。这并不是程序的问题,而是操作者使用不当的问题。换言之,如果要输入多一点,那就让FIFO深度多一点,还要多设置读取SCI数据存放的变量。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值