第五讲串行异步通信
一、串行异步通信概念
通信,可以分为串行通信和并行通信两种方式。串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。而并行通信是指使用多条数据线并行地一次传输多位数据。
通常,并行传输的方式可以达到较高的速率,但是需要较多数据线,成本较高。串行通信相比之下,只需要一根或几根数据线,较为适合远距离通信。
从另一方面讲,通信又可以分为同步通信和异步通信。同步通信一般会同时配有时钟线,用于传送发送端的时钟,而接收端通过传送的时钟信号与发送端取得同步,并依次接收数据。异步通信,则没有时钟线,收发双方提前约定好以某种时钟和时序进行数据传送,接收端通过发送消息的某些特点进行同步,提取发送的消息。
同步通信和异步通信的区别我们通常说的串行异步通信UART,是指通用串行异步通信Universal Asynchronous Receiver/Transmitter。此通信协议规定消息按照某一波特率进行传输,并加入起始位、停止位等进行同步。其中,波特率是指传送中符号的传送速率。
在串行通信中,对传输速率有严格的规定。传输速率是衡量串行通信速度的一个技术指标,数值越大,串
行接口电路的性能就越好。其速率单位常用波特率表示,指单位时间传送符号的数目。我们平时接触较多的比特率,是指每秒传送的比特数目。对于我们常用的二进制传输,1符号表示1比特,因此这里比特率和波特率相等。
串行通信的发送方在发送时钟的上升沿或下降沿时,将发送移位寄存器中的数据按位串行移出。发送时钟与选定的波特率对应的周期相等,它是由波特率发生器产生的。
串行数据在传输过程中,由于干扰等原因出现误码是难免的。差错直接影响着系统的可靠性。为了保证高效而无差错的传输,串行通信中往往需要采用差错控制。差错控制可以分为检错和纠错两种。常用的方法是奇偶校验、CRC循环冗余校验等。
uart采用了奇偶校验的方式。发送时,在每个字符的最高位之后,都附加一个奇偶校验位。若是奇校验,则数据位加上这个校验位之后,所有字符中1的个数为奇数;若是偶校验,则数据位加上这个校验位之后,所有字符中1的个数为偶数。
通常,单片机默认的uart通信中,有8位数据位,无校验位。
上图是UART的时序图,传送每一字符时会进行所示的扩展,增加起始停止位,有些单片机还可以设置数据位数以及是否加入奇偶校验位(一般数据8位,无校验位)。
二、串口配置
从msp430g2553的datasheet上面我们可以看到,它配有uart接口,不需要我们对时序进行模拟,只要配置好寄存器,就可直接通过uart发送、接收数据。
uart同样有中断和非中断两种使用方式。采用中断方式,可以使单片机在接收到数据时马上进入中断函数,对接收到的数据进行处理,处理效率高;不采用中断,可以在主程序中查询uart标志位来判断数据是否准备好,进而控制收发。
这里简单介绍一下msp430的时钟问题。时钟频率,对于单片机而言,就像我们通常所说的电脑的CPU频率,时钟周期大约可以认为是处理一条指令所需要的时间(这里说的指令是指汇编指令,通常用C写的一个语句要划分为几条指令)。msp430的时钟源一般有内部数字振荡器DCO,外部的高频石英晶体振荡器和低频石英晶体振荡器。我们的launch pad 板上留有外部晶体的接口,但是默认是没有接的。所以我们练习时一般使用DCO。初学的时候,搞不清楚时钟也没关系,因为msp430的时钟默认为1MHZ的DCO,所以即使不设置一般来说也可以。
如上图,设置时钟为1MHZ的DCO。DCO可以设置的数值不是任意值,在头文件中可以查到它的内容。如下图:
另外还有一些其他配置,这里不做详解。
上面讲了时钟的问题,主要是因为我们要为uart生成特定的波特率,需要对时钟进行分频。通常,我们使用9600bps的波特率,这样在1MHZ时钟的情况下,1000000/9600≈104。
对于uart的具体配置这里就采用了官方例程中的方法。
首先配置1MHZ的时钟,将P1.1,1.2分别设置为第二功能的RXD,TXD(接收端,发送端),要注意,其他引脚不行。下面和定时器类似的,选择SMCLK子系统时钟,设置分频,得到9600的波特率,再设置调制方式。最后打开uart接收中断,即在有数据到达时,使用中断方式接收、并处理数据。
中断函数中,我们读取RXBUF中的数据,即接收到的数据,并将它存在变量re中。它的值就像我们之前所说,是8位数据,因此re设置为unsigned char即可。
同时,我们采用非中断方式发送数据,在while循环中查询标志位,当上一个数据发送完成后马上发送下一个数据。
在这里为了方便,我们连续发送符号a。
三、通过串口调试工具实验
在这里我们先介绍一个常用调制工具USB-TTL(串口)。它从电脑的USB接口接入,另一端有VCC,GND,TXD,RXD几个引脚,我们可以通过它来对我们的uart进行测试。接好USB-TTL,并安装好驱动以后,我们要使用电脑端的串口调试工具对其进行控制。
上图是一种串口调试工具的界面,此类软件较多,但在win7电脑上部分会无法运行,不同电脑或许会适用不同的软件。
现在,我们将之前写好的程序运行,将单片机和USB-TTL的TXD和RXD连接好(对应的RXD接到TXD),从串口调试工具中设置好参数9600bps,打开串口,即接收到我们从单片机发送的数据。
如图,我们可以看到,上面接收到了很多个a,这是因为单片机以很高的频率不停地发送。
现在我们试着将数据发给单片机。
我们在发送区打上字母f,点发送。
从单片机的调试界面点break暂停
下面,大家要试着打开软件的watch窗口,来观察我们设置好的变量re的值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论