[MSP-EXP430G2ET] [MSP430G2 LaunchPad入门系列] 第7篇 - 串行通信

[复制链接]

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
楼主
查看: 15938回复: 14 发表于 2019-3-5 12:19:31   只看该作者
串行通信是嵌入式处理器最常用的通信方法。串行通信还可以分为不同的通信协议,例如UART、SPI、I2C等等。其中UART俗称“串口通信”,是一种最常见的串行通信协议。本章将介绍几种最常见的串行通信协议的区别,并重点讲解如何使用MSP430G2系列的串行通信单元(USCI)来进行UART通信。

关于SPI和I2C两种通信方式,因为一般要配合外围设备来使用,所以我们将不在本系列课程中讲述。感兴趣的同学可以参考我们给出的相关资源链接,其中有关于SPI和I2C的部分。因此本章也是我们系列教程的最后一章了。感谢大家的支持,欢迎大家随时在论坛中交流~


本章目录如下:
章节题目
7.1串行通信概述
7.2UART通信协议
7.3USCI的UART模式


MSP430G2 LaunchPad 相关资源链接:


本章内容PDF下载:
第7章-串行通信.pdf (1.08 MB, 下载次数: 585)


本系列其他章节:
[MSP430G2LaunchPad入门系列]第7篇 - 串行通信

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
沙发
发表于 2019-3-5 13:37:32   只看该作者
本帖最后由 Shuyang 于 2019-3-5 13:38 编辑

7.1 串行通信概述

串行通信是与并行通信相对应的。并行通信是把一个字节的数据在同一时刻传输过去,其优点是快速,但是需要传输几位就要占用几个IO口,占用的信号线多,这是硬伤。而串行通信是通过移位寄存器把所有位的数据通过一根信号线依次传输过去,这样理论上只需要一根信号线就可以完成。而且我们现在有办法把串行通信的速度提升到非常高的水平,例如,现在的计算机的硬盘、光驱等高速设备与主板的连接都是用sata串口而不再使用并口线了。因此现在串行通信的应用场合比并行通信更广。

从最基本的原理来讲,串并信号转换的核心单元就是数字电子技术中的移位寄存器。串行数据,移位寄存后,统一送出,就完成串入转并出。并行数据经移位寄存器依次送出,也就完成了并入串出的原理。

翻阅MSP430G2553单片机的数据手册,会发现其中有2个串行通信模块,可以支持UART、SPI、I2C等模式。同样是串行通信,为什么会有这么多模式?各个模式分别适用于什么场合呢?这就要从串行通信的原理讲起。


7.1.1 同步与异步

同步通信的发送和接收双方拥有共同的时钟信号,由主机提供时钟给从机,从机使用该时钟接收数据或发送数据,即通信双方公用时钟源。例如上面提到的SPI和I2C就属于串行同步通信的。

异步通信的收发双方不使用公共的参考时钟,通信双方分别有自己的时钟源,但必须使用相同的波特率(即通信速率)。UART就是属于串行异步通信。

无论同步通信还是异步通信,都需要起始信号和停止信号,以通知接收方何时开始接收数据。异步通信由于没有公共时钟,因此起始信号和停止信号之间的数据不能太多,否则由于收发双方时钟误差,会造成传输错误。这样的话由于起始信号和停止信号占用了数据帧中的位数,所以传输速率比较慢。而同步通信相对来说传输速率更快。


7.1.2 单工、半双工、全双工

同步通信的发送和接收双方拥有共同的时钟信号,由主机提供时钟给从机,从机使用该时钟接收数据或发送数据,即通信双方公用时钟源。例如上面提到的SPI和I2C就属于串行同步通信的。

在通信中,单工、全双工、半双工这几个词我们经常能看到,什么意思呢?

1)     能同时收发就是全双工,比如打电话,双方可以“对吼”。
2)     数据能收能发,但要分时进行就是半双工,比如对讲机。一方按下按键,只能说话(发送数据),另一方只能收听。当一个人说完必须加一句“over”,然后就得松开按键(接收数据),对方听到“over”知道对方讲完了,这时才能按下按键说话(发送数据)。
3)     只能单向通信就是单工了,比如广播,播音员播音时(发送数据),听众永远只能是听众。

在3种常见串行通信协议中,UART和SPI属于全双工,I2C属于半双工。


7.1.3 串行通信协议对比:UART/SPI/I2C

我们常见的串行通信协议有UART、SPI、I2C。

UART(UniversalAsynchronous Receiver/Transmitter)是通用异步收发器的缩写,一般称为串口。由于不需要时钟线,且为全双工工作,所以UART有两根数据线,发送Tx和接收Rx。


I2C也是由两根线构成的,但其中一根是时钟线,另一根是数据线。I2C最大的特点是可以方便的实现多机通信。例如下图中所有设备都挂在时钟总线SCL和数据总线SDA上,任何一个设备都可以作为主机,其他设备可以作为从机。


UART和I2C都是两线制通信协议。如果再增加一条线,就可以组成全双工同步通信,就是SPI。这样速度可以进一步加快。实际中SPI协议也可能使用四根线,多出来的一根是在多个从机的情况下用来选择从机的。但SPI协议也无法实现多机对等通信,除非给每个主机再增加使能控制线。


总结上述三种协议,可以看出UART/SPI/I2C可以通过同步或异步、全双工或半双工来区分。它们分别有自己的优缺点。

1)     两线:异步+全双工=UART=慢+不能多主机
2)     三线:同步+全双工=SPI=快+不能多主机(再加数据线才行)
3)     两线:同步+半双工=I2C=慢+可以多主机

打赏

参与人数 1赫兹币 +2 收起 理由
迷途羔羊 + 2 很给力!

查看全部打赏

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
板凳
发表于 2019-3-5 13:40:09   只看该作者
7.2 UART通信协议

本章中我们在三种常用串行通信协议中重点讲解UART协议,因为UART有一个其他协议不可比拟的优势,那就是可以与计算机互联(通过免费的超级终端软件)。这意味着我们可以“免费”使用计算机的屏幕和键盘为己所用。

UART通信协议的数据帧格式如下图所示,首先是一个起始位,然后是7-8位可选的数据位,0-1位可选的地址判别位、0-1位可选的奇偶判别位、1-2位可选的高电平停止位。


从通信效率来说,所有非数据位都是额外的“开销”,都影响效率。但是所有通讯协议的数据帧结构都是“千锤百炼”的极品设计,绝没有哪位是多余的。

1)     起始位ST是高电平到低电平的下降沿触发的。也就是每传输7-8位数据都要消耗一个起始位,这是非常肉疼但又必须的。为什么要起始位呢?这是因为异步通信时,设备双方的时钟一定不相等(差别百万分之一也不行),为了消除累计误差,必须引入起始位。
2)     数据位7-8位。为什么会有7或8位的数据长度选择呢?我们知道1个字节是8位,按理说应该都是8位传输才对。其实不是所有类型数据都是8位的,比如ASCII码,7位就够了。假如传输的都是ASCII码,不就赚到了1位吗?能省则省。
3)     地址位Address Bit,0表示前面的7或8位是数据,1表示是地址,这在1主多从通信中有用。在双机通信里肯定是不用的,可以省掉。
4)     奇偶校验位Parity Bit,在数据的发送设备上预先计算本次发送数据中1的个数是奇数还是偶数,并在奇偶校验位标识出来。数据接收端设备收完数据后,也算一下数据中1的个数,与奇偶校验位作对比,如果对不上则传输一定有错误(但即使奇偶校验位对的上,也不代表没错误)。对于非常重要的数据,奇偶校验是远远不够的,比如硬盘数据的存取,采用的是CRC循环冗余校验。我们这里不介绍具体校验的原理,只说明一点“甘蔗没有两头甜”,要误码率低,就要用更多的位来进行校验。校验位比数据位长度还长的情况也是常见的。奇偶校验虽然占位少,但是效果实在不咋地,基本上很鸡肋,所以我们经常见到的串口通信都选择“无校验”。
5)     停止位SP,数据传输完后,需至少维持高电平1-2位才能重新开始下一帧的传输。当然,歇个10天半月都是高电平再开始下一帧也是可以的,也就是说,1-2位是最少需要的“休息”位。为什么会有2位的要求呢?这不是浪费粮食吗。“休息位”也是用来校准异步通信时钟误差的,休息位越长,对两个时钟差值容忍程度越高。根据设备实际数据传输速率和时钟匹配程度的不同,需要最少1位或者2位的停止位。

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
4#
发表于 2019-3-5 13:45:57   只看该作者
本帖最后由 Shuyang 于 2019-3-5 13:48 编辑

7.3 USCIUART模式

MSP430的串行通信外设叫做USCI(universal serialcommunication interface)。USCI又分为两个版本,USCI_A和USCI_B。USCI_A可配置为UART、LIN、IrDA、SPI模式。USCI_B可配置为SPI和I2C模式。MSP430G2553单片机中带1个USCI_A模块和一个USCI_B模块。

用USCI模块实现UART其实很简单,只要配置好初始化参数之后,将要发送的数据写入发送缓冲器TXBUF,或是从接收缓冲期RXBUF中读取收到的数据即可。


7.3.1 USCI_A UART的配置流程

MSP430单片机上电以后,单片机会自动将USCI的复位控制位UCSWRST置为1。这个操作将自动将USCI中断相关的寄存器(包括UCAxRXIE、UCAxTXIE、UCAxRXIFG、UCRXERR、UCBRK、UCPE、UCOE、UCFE、UCSTOE及UCBTOE)复位。我们在使用USCI模块前要手动将UCSWRST置0,然后USCI模块才能正常工作。对USCI进行配置的推荐流程如下。

1)     令UCSWRST=1,对USCI模块进行复位;
2)     改写相关寄存器(UCAxCTL0、UCAxCTL1等),对USCI进行初始化;
3)     配置相关I/O口(MSP430G2553中P1.1/UCA0RXD和P1.2/UCA0TXD);
4)     令UCSWRST=0;
5)     配置UCAxRXIE和UCAxTXIE寄存器,使能USCI中断。


7.3.2 USCI_A UART初始化

对USCI_A模块进行初始化是通过UCAxCTL0和UCAxCTL1这两个寄存器进行的。一般来说,UART数据位设为8位,奇偶校验不选,停止位设为1位。另外需要设置好时钟来源和波特率。

我们来看一下“MSP430x2xxFamily User's guide”中UCAxCTL0的定义:


再来看UCAxCTL1的定义:


1)    配置数据帧格式

我们将数据位设为8位,奇偶校验不选,停止位设为1位。通过上面的寄存器定义可以看出,只要UCAxCTL0和UCAxCTL1全部保持默认即可。其中只有UCSSELx与时钟有关,我们稍后再来介绍。

2)    时钟选择

我们将数据位设为8位,奇偶校验不选,停止位设为1位。通过上面的寄存器定义可以看出,只要UCAxCTL0和UCAxCTL1全部保持默认即可。其中只有UCSSELx与时钟有关,我们稍后再来介绍。

USCI模块的时钟BRCLK可以从MCLK、SCMLK和ACLK中选择。需要注意的是BRCLK的频率与通信波特率有关。如果使用MCLK或SMCLK,可以获得比较高的波特率;但如果使用ACLK,可以获得更低的功耗,这是因为只有在使用ACLK时才能进入更低功耗的LPM3模式。一般来说如果使用32.768kHz的晶振时,最高的波特率是9600。

3)    波特率设置

波特率(Baud rate)是指数据传输的速率(即载波频率)。最常用的标准波特率是110、300、1000、1200、2400、4800、9600、19200及115200。

在USCI模块中,波特率是通过时钟BRCLK得来的。USCI模块中的寄存器UCAxBR0、UCAxBR1和UCAxMCTL负责从不同的时钟频率下产生标准的波特率。



UCOS16可以控制调至模块的两种模式,分别为低频模式和高频模式。一般比较常用的是低频模式。在此模式下波特率和时钟频率的关系由下面公式计算:


算出来的N往往不是整数。不过没关系,UCBRx和UCBRSx分别负责表示N的整数部分和小数部分,以近似得到最接近的波特率。算得N之后,可以分别得到UCBRx和UCBRSx的值如下:

UCBRx= INT(N)
UCBRSx= round( ( N-INT(N) ) x 8 )

其中,INT(N)表示N的整数部分,round()表示对括号里的数进行四舍五入。

通过以上关系式,我们可以得出在常用的时钟频率和波特率情况下,寄存器设置值如下表所示。


例如使用32.768kHz晶振情况下,如果想要设置波特率为9600,通过上式分别计算出UCBRx=3和UCAxMCTL=3,寄存器配置代码如下:
  1.   UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41
  2.   UCA0BR1 = 0x00;                          
  3.   UCA0MCTL = 0x06;                        // Modulation UCBRSx = 3
复制代码


7.3.3 收发数据

使用USCI模块来收发数据只需读写接收缓冲器UCAxRXBUF和发送缓冲期UCAxTXBUF就可以了。

当UCAxRXBUF接收到完整数据后,会触发UCAxRXIFG中断标志位,表明CPU应尽快将UCAxRXBUF中的数据“取走”,否则将会被下一次进来的数据覆盖掉。在程序中需要使能Rx中断。

将数据写入UCAxTXBUF寄存器,USCI模块会自动把数据发出去。当UCAxTXBUF为空时(数据已移入移位寄存器,可以不管了),触发UCAxTXIFG中断标志位,表明可以往UCAxTXBUF里面放下一个数据了。Tx中断同样需要在程序中使能。


7.3.4 使用UART和电脑通信

使用UART协议可以和电脑进行通信,接收电脑键盘的输入并发送数据在电脑屏幕上显示。MSP430G2553LaunchPad的USB口带有虚拟串口功能,可以通过USB接口虚拟串口,与电脑连接。

要在电脑上读取串口数据,还需要一个串口调试软件。市面上有很多类似的软件,在这里推荐使用PuTTY,它是一个免费软件,下载链接为www.putty.org

在LaunchPad上,我们需要将右侧5个跳线帽中左边2个横过来插,这样就可以使能硬件UART。


接好跳线帽后将LaunchPad通过USB线与电脑连接,然后需要确定LaunchPad的虚拟串口在电脑上的端口号。打开设备管理器,在Ports(COM& LPT)下找到MSP430 Application UART,后面括号中的COMx就是端口号。把这个端口号记下来,稍后会用到。


下面打开PuTTY软件,在软件中选择Serial,在Serial line中填入刚才记下来的端口号,在Speed一栏填写波特率,然后点击“Open”,就可以打开串口调试界面。


打开后会看到一个命令行界面,现在就可以与LaunchPad进行通信了。用电脑键盘输入字符,会以ASCII码的形式发给单片机,单片机发过来的数据也会显示在调试窗口中。ASCII码和字符的转换表请见www.asciitable.com


17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
5#
发表于 2019-3-5 13:48:43   只看该作者
本章参考资料:     
  
1.     《从零开启大学生电子设计之路--基于MSP430 LaunchPad口袋实验平台》,杨艳,傅强编著,北京航空航天大学出版社,2014年8月第1版。
2.     “MSP Design Workshop” by TexasInstruments, Version 4.60, May 2016, http://processors.wiki.ti.com/index.php/MSP_Design_Workshop
3.     “Getting Started with the MSP430G2553Value-Line LaunchPad Workshop” by Texas Instruments, Version 2.22, July 2013, http://processors.wiki.ti.com/in ... _LaunchPad_Workshop
4.     MSP430G2553 datasheet (Rev.J), May2013, http://www.ti.com/mcu/docs/litab ... 2&familyId=1937
5.     MSP430x2xxFamily User's Guide, SLAU144J, http://www.ti.com/cn/lit/pdf/slau144
6.     MSP-EXP430G2LaunchPad Evaluation Kit User's Guide, SLAU318G, March 2016, http://www.ti.com/cn/lit/pdf/slau318

0

主题

14

帖子

53

积分

一粒轻沙

Rank: 1

积分
53
6#
发表于 2019-4-21 18:39:33   只看该作者
好!谢谢分享

0

主题

3

帖子

57

积分

一粒轻沙

Rank: 1

积分
57
7#
发表于 2019-5-20 18:59:02   只看该作者
Shuyang 发表于 2019-3-5 13:48
本章参考资料:     
  
1.     《从零开启大学生电子设计之路--基于MSP430 LaunchPad口袋实验平台》,杨艳 ...

努力学习中

0

主题

1

帖子

16

积分

一粒轻沙

Rank: 1

积分
16
8#
发表于 2019-6-26 15:03:26   只看该作者

谢谢分享~

0

主题

6

帖子

232

积分

二氧化硅

Rank: 2

积分
232
9#
发表于 2019-7-17 09:40:06   只看该作者
努力学习

0

主题

1

帖子

5

积分

一粒轻沙

Rank: 1

积分
5
10#
发表于 2019-7-25 11:34:21   只看该作者
Shuyang 发表于 2019-3-5 13:48
本章参考资料:     
  
1.     《从零开启大学生电子设计之路--基于MSP430 LaunchPad口袋实验平台》,杨艳 ...

请问您有这一章的例程代码吗?我按照书上的代码做了,少了几个头文件。

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
11#
发表于 2019-7-25 13:51:21   只看该作者
电动车没电了 发表于 2019-7-25 11:34
请问您有这一章的例程代码吗?我按照书上的代码做了,少了几个头文件。 ...

是哪个头文件呢?这一章的程序应该只要msp430.h就可以了
下面的代码可以参考:
  1. #include <msp430.h>

  2. // Function declaration
  3. void initGPIO(void);
  4. void initUART(void);

  5. int main(void)
  6. {
  7.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  8.   initGPIO();
  9.   initUART();

  10.   __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3, interrupts enabled
  11. }

  12. // Echo back RXed character, confirm TX buffer is ready first
  13. #pragma vector=USCIAB0RX_VECTOR
  14. __interrupt void USCI0RX_ISR(void)
  15. {
  16.   while (!(IFG2&UCA0TXIFG));                 // USCI_A0 TX buffer ready?
  17.   UCA0TXBUF = UCA0RXBUF;                     // TX -> RXed character
  18. }

  19. // Initialize GPIO
  20. void initGPIO(void)
  21. {
  22.   P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  23.   P1SEL2= BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD
  24. }

  25. // Initialize USCI as UART mode
  26. void initUART(void)
  27. {
  28.   UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK
  29.   UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41
  30.   UCA0BR1 = 0x00;                           //
  31.   UCA0MCTL = 0x06;                                       // Modulation UCBRSx = 3
  32.   UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  33.   IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt
  34. }
复制代码


2

主题

17

帖子

96

积分

一粒轻沙

Rank: 1

积分
96
12#
发表于 2019-8-1 15:06:16   只看该作者
Shuyang 发表于 2019-3-5 13:45
7.3 USCI的UART模式

MSP430的串行通信外设叫做USCI(universal serialcommunication interface)。USCI又 ...

为什么前面都有例程,到这里就没有了呢?最关键的部分没了?

17

主题

137

帖子

553

积分

单晶硅锭

Rank: 3Rank: 3

积分
553
13#
发表于 2019-8-1 19:04:19   只看该作者
木叶留春 发表于 2019-8-1 15:06
为什么前面都有例程,到这里就没有了呢?最关键的部分没了?

楼上贴了例程:lol
也可以参照mspware里的例程

2

主题

17

帖子

96

积分

一粒轻沙

Rank: 1

积分
96
14#
发表于 2019-8-2 08:55:01   只看该作者
本帖最后由 木叶留春 于 2019-8-2 08:56 编辑
Shuyang 发表于 2019-8-1 19:04
楼上贴了例程
也可以参照mspware里的例程

void main(void)
{
    WDT_A_hold(WDT_A_BASE);
      

        CS_setDCOFreq(CS_DCORSEL_1, CS_DCOFSEL_3 );//本来想在这里设置16Mhz的,但是8m以下才能正常工作,16m时钟系统直接崩溃了,我也郁闷了半天,所以设成了8m的!
       CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);
       CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);


//      CS_setDCOFreq(CS_DCORSEL_1, CS_DCOFSEL_4 );
       PM5CTL0 &= ~LOCKLPM5;                           //解锁单片机io口
//
//
// //   CS_bypassHFXT();
//    CS_setDCOFreq(CS_DCORSEL_1 ,CS_DCOFSEL_4 );     //设置系统时钟16m
//    CS_setExternalClockSource(32768,0);             //辅助时钟
//
//
//    delay(1);
//
//    CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1 );//配置系统时钟
//    CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1 );//配置辅助时钟
    CS_turnOnSMCLK();
////    CS_initClockSignal(CS_MCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1 );//配置系统时钟


    Init_LCD();
    display(CS_getSMCLK()/100);

//    CS_setExternalClockSource(32768,0);             //设置aclk时钟
                                                               //串口io口初始化
    GPIO_setAsPeripheralModuleFunctionInputPin(
        GPIO_PORT_P4,
        GPIO_PIN2 + GPIO_PIN3,
        GPIO_SECONDARY_MODULE_FUNCTION
        );
    GPIO_setAsPeripheralModuleFunctionInputPin(
    GPIO_PORT_P2,
    GPIO_PIN0 + GPIO_PIN1,
    GPIO_SECONDARY_MODULE_FUNCTION
    );











    EUSCI_A_UART_initParam param = {0};
    //115200
    param.selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK;
    param.clockPrescalar = 4;
    param.firstModReg = 3;
    param.secondModReg = 5;
    param.parity = EUSCI_A_UART_NO_PARITY;
    param.msborLsbFirst = EUSCI_A_UART_LSB_FIRST;
    param.numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT;
    param.uartMode = EUSCI_A_UART_MODE;
    param.overSampling = 1;

    EUSCI_A_UART_init(EUSCI_A0_BASE, ¶m);

    EUSCI_A_UART_enable(EUSCI_A0_BASE);

    EUSCI_A_UART_clearInterrupt(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG|EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG);

    EUSCI_A_UART_enableInterrupt(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG|EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG);

    __enable_interrupt();



    GPIO_setAsOutputPin(GPIO_PORT_P1,GPIO_PIN0);



//
//    Init_LCD();
//    displayScrollText("WELCOME TO THE FR6989 LAUNCHPAD");
    for(;;)
    {
        GPIO_setOutputHighOnPin(GPIO_PORT_P1,GPIO_PIN0);
        delay(100);
        GPIO_setOutputLowOnPin(GPIO_PORT_P1,GPIO_PIN0);
        delay(100);
        EUSCI_A_UART_transmitData(EUSCI_A0_BASE,'a');
    }
}

#pragma vector=USCI_A0_VECTOR
__interrupt void uarl(void)
{
    uint8_t sta;
    uint8_t dat;
//    sta=EUSCI_A_UART_getInterruptStatus(EUSCI_A0_BASE,EUSCI_A_UART_TRANSMIT_COMPLETE_INTERRUPT_FLAG);
//    EUSCI_A_UART_clearInterrupt(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG|EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG);
    if(EUSCI_A_UART_getInterruptStatus(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)==EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG)
    {

        EUSCI_A_UART_clearInterrupt(EUSCI_A0_BASE,EUSCI_A_UART_RECEIVE_INTERRUPT_FLAG);





        dat=EUSCI_A_UART_receiveData(EUSCI_A0_BASE);
        EUSCI_A_UART_transmitData(EUSCI_A0_BASE,dat);

    }
    if(EUSCI_A_UART_getInterruptStatus(EUSCI_A0_BASE,EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG)==EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG)
    {
        EUSCI_A_UART_clearInterrupt(EUSCI_A0_BASE,EUSCI_A_UART_TRANSMIT_INTERRUPT_FLAG);



    }


}

这是我写的,但是就是串口不出数据,这是哪里的问题?求大神指导

0

主题

6

帖子

4

积分

一粒轻沙

Rank: 1

积分
4
15#
发表于 2020-12-7 21:02:56   只看该作者
请问还有后面的吗?
快速回复 返回顶部 返回列表