6926|13

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

超出FIFO空间的串口数据收发 [复制链接]

大家好,正在做一个项目,通信芯片接收区FIFO大小为8word,数据收发通过调用一个函数完成,每次接收一个字节,通过调试发现,当一包数据大小在13、14个字节以内时,收发正常。现在需要通过串口做大数据量的收发,每包数据都在1000字节以上,因为我觉得FIFO每次取出一个数据后会自动在顶进来一个新数,所以我想通过在while(1)中不断地循环调用数据接收函数,接收到之后先放到一个自建的缓冲区中,等全部接收成功之后再做处理,现在通过调试发现当一包数据大于16个字节时,丢数现象严重,大概只能接收一半左右的数据(具体现象就是每次连续接收7、8个字节,然后会丢掉7、8个字节,接着再接收到7、8个字节,整体下来可能只能接到一半左右),我觉得可能是处理速度跟数据接收速度(baud率)匹配出了问题
大家帮我分析一下什么原因呢,还有该怎么解决

最新回复

至于你的定时器是干什么的,我帮不了你咯,因为我又没看过你的datasheet。并不是单单看个称呼就可以知道它实际的功能。所以,我还是建议你好好看看这个寄存器,确定它是什么用的,然后,让我们来问你这个是干什么用的,这样才对,呵呵。 这里的DSP读fifo的时间怎么算呢?首先要有示波器,用过测试IO,然后再读前和读后,分别翻转一下电平,示波器看这两次翻转的时间间隔。  详情 回复 发表于 2010-5-13 18:57
点赞 关注

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帮你顶
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
还有一个问题,串口接收/发送定时器是干什么用的,它的接收/发送周期寄存器的值是怎么设置的,跟baud有什么关系呢,现在在调这个,发现效果好了一些
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

4
 
是不是你的主程序了还开了其他的中断之类的?该接数的时候,跑去响应中断了。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 peasant_lee 的回复:
是不是你的主程序了还开了其他的中断之类的?该接数的时候,跑去响应中断了。


这个我也考虑到了,现在的主程序已经是最简化的了,只有串口读写程序程序,没有其他任何操作,而且串口读写也没有用中断方式,只是通过while(1)里面循环调用串口接收函数不断轮询,只要有数就接收,而且DSP的处理速度远大于串口收发速率,不应该出这样的问题啊
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 2 楼 haoxuesheng1106 的回复:
还有一个问题,串口接收/发送定时器是干什么用的,它的接收/发送周期寄存器的值是怎么设置的,跟baud有什么关系呢,现在在调这个,发现效果好了一些



串口接收/发送定时器应该是用来设置波特率的吧?具体看你的datasheet。想问问,你的系统是 DSP读串口数据,放到FIFO中吗?
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 peasant_lee 的回复:
引用 2 楼 haoxuesheng1106 的回复:
还有一个问题,串口接收/发送定时器是干什么用的,它的接收/发送周期寄存器的值是怎么设置的,跟baud有什么关系呢,现在在调这个,发现效果好了一些



串口接收/发送定时器应该是用来设置波特率的吧?具体看你的datasheet。想问问,你的系统是 DSP读串口数据,放到FIFO中吗?


串口接收/发送定时器是用来设置波特率?那他们是什么关系呢,有没有计算公式呢。
另外不是dsp读串口数据放到FIFO中,而是DSP接到串口数据之后先放到FIFO中(自动完成,类似一个buffer),现在需要从FIFO中把相应数据读出来做进一步处理。
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

8
 
发送时检测一下发送fifo是否为空,写发送数据时一次不能超过fifo大小,否则数据还没来得及发送就被覆盖了,接收同样要设置接收中断(几个字节),避免接收太多字节后再中断,如果软件响应中断处理的不及时,后续接收的数据就把接收fifo覆盖了!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 guolh 的回复:
发送时检测一下发送fifo是否为空,写发送数据时一次不能超过fifo大小,否则数据还没来得及发送就被覆盖了,接收同样要设置接收中断(几个字节),避免接收太多字节后再中断,如果软件响应中断处理的不及时,后续接收的数据就把接收fifo覆盖了!


谢谢guolh
我也认为可能是一次发的数据过大,前面的还没处理完,就被后面的数据覆盖掉了,不过DSP处理器的速度远大于串口数据发送的速率,不应该出现这样的情况啊。
而且现在的问题是这样的,首先是关于数据发送那部分已经确定,不可更改,一包数据远大于FIFO大小,现在能做的就是在接收这里想想办法,看能不能更好的接收。其次我的程序里数据接收的时候没有用中断(硬件限制,用不了中断),只是不断的轮询,只要FIFO中有数就接收
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

10
 
既然数据发送那部分已经确定,那么波特率估计已经也定死了。所以考虑波特率的设置也没用的。串口接收/发送定时器是不是用来设置波特率,要具体看芯片手册,有些是用定时器来做波特率发生器的,比如常用的51单片机,,你所说的一包数据有多大?相比你的fifo大多少?你现在的波特率是多少,算算理论值,看看能不能处理的过来。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

11
 
引用 9 楼 peasant_lee 的回复:
既然数据发送那部分已经确定,那么波特率估计已经也定死了。所以考虑波特率的设置也没用的。串口接收/发送定时器是不是用来设置波特率,要具体看芯片手册,有些是用定时器来做波特率发生器的,比如常用的51单片机,,你所说的一包数据有多大?相比你的fifo大多少?你现在的波特率是多少,算算理论值,看看能不能处理的过来。


发送也是我自己通过一个软件发送的,波特率也是可调的,只是具体的协议定死了,也就是每包数据的大小及内容已经确定,不能更改了。
我的FIFO是8word的,一包数据最多的时候可能会到达1000字节以上
现在的波特率是115200,DSP用的是TMS320VC33,计数器每条指令时钟周期为33.3ns,应该是能处理过来的
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 
        刚算了一下,你的波特率下,1 bit数据需要8us,1 btye 需要大概80us,应该够时间的。你DSP读fifo的速度应该很快的吧?还有,一旦读取fifo的一个数据,会不会误造成损害fifo的所有数据?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 peasant_lee 的回复:
刚算了一下,你的波特率下,1 bit数据需要8us,1 btye 需要大概80us,应该够时间的。你DSP读fifo的速度应该很快的吧?还有,一旦读取fifo的一个数据,会不会误造成损害fifo的所有数据?


读好意思,这里的DSP读fifo的时间怎么算呢,是不是跟串口收发定时器有关系呢,那个定时器的意思是不是就是每这么长时间读一次呢,计数器每记一次数应该是33.3ns,我现在计数器设的值是0x40,再大就会丢数
另外读fifo应该对后面的数据没有影响吧,该芯片支持的读写只是每次收或发一个字节,连续收发,我现在也是让它while(1)里面循环调用数据接收函数,连续性接收
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
至于你的定时器是干什么的,我帮不了你咯,因为我又没看过你的datasheet。并不是单单看个称呼就可以知道它实际的功能。所以,我还是建议你好好看看这个寄存器,确定它是什么用的,然后,让我们来问你这个是干什么用的,这样才对,呵呵。

这里的DSP读fifo的时间怎么算呢?首先要有示波器,用过测试IO,然后再读前和读后,分别翻转一下电平,示波器看这两次翻转的时间间隔。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表