欢迎来到天天文库
浏览记录
ID:38668225
大小:113.17 KB
页数:5页
时间:2019-06-17
《MSP430_串口异步通讯原理与实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、MSP430串行异步通讯原理与实现南京航空航天大学魏小龙本讲讲述串口功能与连接的实现。大多数MSP430芯片都有硬件异步通讯功能,有一些器件有两个通讯端口,也有少数没有。没有硬件串口的芯片可以实现软件(模拟)串口。下面表格为430系列芯片串口的情况。系列芯片F11系列F12系列F13系列F14系列F15系列F16系列串口数量011212芯片系列F2系列C31系列C32系列C33系列F41系列F42系列串口数量100101芯片系列FW42系列FE42系列FG43系列F43系列F44系列串口数量0111
2、2对于没有硬件串口的芯片也可以实现软件串口,这里先讲硬件串口,后讲软件串口。然后再讲串口的链路实现。先看串口功能的实现。下图是MSP430系列芯片硬件串口的框图。在该框图中,串口通讯由3部分构成:通讯速度的控制(数据位流的产生)、接收控制部分、发送控制部分。波特率生成部分由时钟输入选择与分频、波特率发生器、调整器、波特率寄存器等组成。串行通信时,接收与发送以什么样的速率将数据位收进或送出呢,这个速率就由波特率生成构件控制。下图为其较为详细的结构。整个模块的时钟源来自内部3时钟或外部输入时钟,由SSE
3、L1、SSEL0选择,以决定最终进入模块的时钟信号BRCLK的频率。时钟信号BRCLK送入一个15位的分频器,通过一系列的硬件控制,最终输出移出与移进两移位寄存器使用的移位位时钟BITCLK信号。那么这个信号(BITCLK)究竟是怎样产生的呢,该图的下半部分的一个波特率产生例子可以看出,是分频器在起作用。当计数器减计数到“0”时,输出触发器翻转,送给BITCLK信号。所以BITCLK信号周期的一半就是定时器(分频计数器)的定时时间。接收控制部分与发送控制部分分别由两个移位寄存器构成。接收时,当接收到
4、一个完整数据,产生一个信号(URXIFG0=1),表示接收到完整数据,可以将此数据取走。而在发送时,当一个数据正在发送过程中,UTXIFG0=1,此时,不能再发送数据,必须等当前数据发送完毕(UTXIFG0=0)时,方可继续发送。串口接收一般采用中断方式,而发送数据则多采用主动方式。下面是一段简单的完整通讯程序,实现功能:将接受的数据原样送回。#includevoidmain(void){WDTCTL=WDTPW+WDTHOLD;//停止看门狗UTCTL0=SSEL0;/
5、/UCLK=ACLK,选择时钟来源UBR00=0x03;//32k/9600-3.41波特率寄存器低字节UBR10=0x00;//32k/9600波特率寄存器高字节UMCTL0=0x51;//由于波特率计算有余数,填写波特率调整寄存器UCTL0=CHAR;//数据格式为8位数据ME1
6、=UTXE0+URXE0;//使能串口TXD与RXDIE1
7、=URXIE0;//让串口接收到数据后能产生中断P2SEL
8、=0x30;//定义P2.4,P2.5为串口功能引脚P2DIR
9、=0x10;//串口发送数据端口为
10、输出,接收数据端口为输入_EINT();//整个系统使能中断(开总中断)_BIS_SR(LPM3_bits);//初始化完毕,进入睡眠状态,主程序完毕}interrupt[UART0RX_VECTOR]voidusart0_rx(void){while((IFG1&UTXIFG0)==0);//当发送缓存为空时TXBUF0=RXBUF0;//发送数据到串口}而对于没有硬件串口的型号,如何实现异步串口功能?先分析异步串口的原理。下图是异步串口的时序图。可以看出异步串口由一根口线构成:数据线,在数据发送
11、时,数据线严格按照其时序将数据移位送至数据线,就可以了。图中的时钟是隐含的,由波特率确定。比如串口波特率为9600,则时钟的周期为1/9600秒。在数据线上的数据按照:起始位、数据位、停止位等格式顺序排列。而起始位、数据位、停止位等的多少由通讯双方定义的通讯规约决定。这样在没有硬件串口的情况下,完全可以模拟以上时序发送异步串行数据。下面的工作将完成上图的数据传送。首先产生波特率。下面的延时程序可以完成此工作,延时时间为1/9600秒(系统时钟为1M时的延时循环参数)。voidDelay_9600(v
12、oid){unsignedintv=104;while(v!=0)v--;}以上的延时程序用于产生通讯位率。下面定义P1.0为通讯数据发送端,P2.0为通讯数据接收端。则按照通讯规约的时序图,每发送一位数据,调用一次延时程序:调用以下程序之前已经进行了相应的端口方向设置。voidsend_byte(charin)//输入变量为即将发送的数据{charI=0;//定义一个循环变量,循环发送8个数据位P1OUT&=~BIT0;//发送起始位Delay_9600();for
此文档下载收益归作者所有