- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于DSP2812的双缓冲串口程序设计
摘要
以DSP2812为例,分析了常用串口程序的缺点,提出了一种工程上实用的串口通讯程序的设计方法。利用DSP2812的FIFO和队列数据结构,对串行数据进行了两级双向缓冲,在中断中完成数据收发,高效可靠的实现了DSP的串行通讯。
关键词:DSP2812 串行通讯 FIFO 队列
引言
TMS320F2812是国内广大的工程技术人员非常熟悉一种DSP芯片,它速度快,功能强,广泛应用于电机控制,电力电子等领域。如何高效可靠的实现DSP与上位PC机或其它从机间的串行通讯,是DSP系统开发的一个基本问题。本文将以DSP2812为例,针对这一问题展开讨论,并给出一种切实可行的解决方案。
1、常用串口收发程序及其存在的问题
常用的串口发送程序如下所示,以DSP2812的SCIA发送一字节数据为例:
void SCIASendChar(unsigned char schar) { //schar为待发送的数据
SciaRegs.SCITXBUF=schar; //将数据送入发送数据缓冲寄存器
while(SciaRegs.SCICTL2.bit.TXRDY==0); //等待发送器缓冲寄存器就绪
while(SciaRegs.SCICTL2.bit.TXEMPTY==0); //等待发送器数据为空
}
这是一种查询等待标志位的方式。由于有while循环存在,CPU要等待一个字节发送才能其它工作其它模块的时间保证interrupt void SCIA_RXINT(void) {
DINT;
rxdata=SciaRegs.SCIRXBUF.bit.RXDT; //读取数据
PieCtrl.PIEACK.all |= (19); //响应同组其他中断
EINT; }
DSP每收到一个字节的数据都会进入中断,当接收的数据量较大时,会占用较多的CPU资源,效率低。
2、FIFO控制寄存器设置和使用队列数据结构的说明
DSP2812含有一个16级深度的发送/接收FIFO。使用FIFO可以减少收发数据的延迟和对CPU资源的占用,高效的实现串口数据收发。
FIFO是一个缓冲寄存器,通过FIFO发送数据时,可以一次性连续写入多个数据(最多16个),DSP会自动将这些数据发送出去,无需CPU干预,还可以设置发送完成后进中断;通过FIFO接收数据时,经由设置SCIFFRX寄存器,可以实现接收若干个字节的数据后(最多16个)进入中断,在中断中处理这些数据,这就减少了接受多个数据时,CPU进中断的次数,提高了效率。
使用FIFO时,有两个问题需要明确:
(1)、如何访问FIFO
写发送FIFO通过SCITXBUF寄存器,读接收FIFO通过SCIRXBUF寄存器。
(2)、FIFO中断
FIFO模式有两个中断,一个用于FIFO发送,一个用于FIFO接收。对于FIFO发送中断来说,当使能FIFO,且使能TXFIFO中断后,标准的TXINT将不再起作用,该中断仅作为SCI FIFO发送中断工作;对于串行接收中断而言,RXINT中断是SCI FIFO接收、接收错误和接收FIFO溢出的共同中断。
FIFO发送和接收中断都可以设置为匹配中断。对FIFO发送来说,SCIFFTX寄存器中的位TXFFST4-0表明当前的发送FIFO中有多少个字节的数据,位TXFFIL4-0为用户设定的接收FIFO中断匹配级别,当TXFFST4-0的值小于或等于TXFFIL4-0的值时,产生发送匹配中断;对FIFO接收来说,SCIFFRX寄存器中的位RXFIFST4-0表明当前接收FIFO中有多少个字节的数据,位RXFFIL4-0为用户设定的发送FIFO中断匹配级别,当RXFIFST4-0的值大于或等于RXFFIL4-0的值时,产生接收匹配中断。
FIFO寄存器可以设置为:
/*使能FIFO,发送FIFO空,禁用TXFIFO中断,清除TXFIFO中断标志,使能TXFFIVL匹配中断,匹配值为0,即:当TXFIFO中数据为0时进入发送中断。*/
SciaRegs.SCIFFTX.all=0xe060;
/*清RXFFOVF标志,使能FIFO接收,接收FIFO空,清除RXFFINT中断标志,使能RXFFIVL匹配中断,匹配值为16,即:FIFO中的数据大于等于16时进入发送中断*/
SciaRegs.SCIFFRX.all=0x6070;
/*禁止串口自动检测波特率SciaRegs.SCIFFCT.all=0;
程序使用队列数据结构,可以更好的将串口程序模块化。同时,利用队列对串行数据再做一级缓冲,不仅
文档评论(0)