3879|15

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

两个msp430g2553单片机之间的串行通讯 [复制链接]

10芯积分
做了好几天msp430g2553单片机的串口通讯都没有做出来,不知道怎么调试,通讯结果始终不能出来,是两个单片机都要单步调试还是只有发的那个单片机要单步调试阿?本人初学者,希望各位大大帮个忙。加急重赏!!!

最佳答案

查看完整内容

看到G2553,猜测使用的是Launchpad咯。 先看Launchpad的版本号,v1.4之前版本只支持定时器模拟的串口,而不支持USCI。 v1.5才支持USCI。 然后看跳线,跳线横接是使用USCI与仿真器的UART通信,在PC上使用串口助手调试即可。你的情况是使用两块板子,那么应该把跳帽摘掉,将P1.1P1.2交叉互联。 还有,串口是严格的定时时序,每个位需要严格同步,因此不管收或者发单步调试都不好,而应该在代码关键处设置断点,观察寄存器 ...

最新回复

在电脑端用串口助手调试,单独调试接收,单独调试发送,都没问题了,再进行两块板子通讯,  详情 回复 发表于 2016-1-8 15:38
 
点赞 关注(2)

回复
举报

5

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
#include "msp430.h"
#include "in430.h"
void UartPutchar(unsigned char c);
unsigned char UartGetchar();
unsigned char temp=0;
unsigned char number[2]={0};
void main( void )
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
  DCOCTL = CALDCO_1MHZ;
  P1DIR|=BIT6;
  P1OUT&=~BIT6;
  P1SEL = BIT1 + BIT2;                      // P1.1为 RXD, P1.2为TXD
  P1SEL2 = BIT1 + BIT2;                     // P1.1为 RXD, P1.2为TXD
  UCA0CTL1 |= UCSSEL_2;                     // 选择时钟BRCLK
  UCA0BR0 = 106;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
  UCA0MCTL = UCBRS2 + UCBRS0;               // 波特率=BRCLK/(UBR+(M7+...0)/8)
  UCA0CTL1 &= ~UCSWRST;
  // 初始化顺序:SWRST=1设置串口,然后设置SWRST=0,最后设置相应中断
  IE2 |= UCA0RXIE;                          // 使能接收中断
while(1)
  {
   //UartPutchar(9);
   // display_int(temp,0);
    __delay_cycles(10000);
  }
}
/**********************************UART接收中断*************************/
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
  //while (!(IFG2&UCA0TXIFG));                // 等待发送完成
  //UCA0TXBUF = UCA0RXBUF;                    // TX -> RXed character
  temp=UCA0RXBUF;
}

/******************************UART发送字节函数*************************/
void UartPutchar(unsigned char c)
{
while(!(IFG2 & UCA0TXIFG));  //待发送为空
UCA0TXBUF=c;
IFG2 &=~UCA0RXIFG;
}
/*********************************UART接收字节数据******************/
unsigned char UartGetchar()
{
  unsigned char c;
  while(!(IFG2 & UCA0RXIFG)); //等待接收完成
  c=UCA0RXBUF;
  IFG2 &=~UCA0TXIFG;
  return c;
}
这个是楼主的程序,半推半就写的 ,各位大大看看  检查检查  不对的地方帮我改改
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
看到G2553,猜测使用的是Launchpad咯。

先看Launchpad的版本号,v1.4之前版本只支持定时器模拟的串口,而不支持USCI。
v1.5才支持USCI。

然后看跳线,跳线横接是使用USCI与仿真器的UART通信,在PC上使用串口助手调试即可。你的情况是使用两块板子,那么应该把跳帽摘掉,将P1.1P1.2交叉互联。

还有,串口是严格的定时时序,每个位需要严格同步,因此不管收或者发单步调试都不好,而应该在代码关键处设置断点,观察寄存器的变化。

赞赏

1

查看全部赞赏

 
 
 

回复

483

帖子

0

TA的资源

一粒金砂(中级)

4
 
你先用一个单片机进行调试,用电脑的串口调试助手接收数据,看接的对不对。这样的话,程序先走通,再用2个单片机调试。
 
 
 

回复

483

帖子

0

TA的资源

一粒金砂(中级)

5
 
还有就是网上的例程一大把,调测下就OK了
 
 
 

回复

3404

帖子

6

TA的资源

裸片初长成(初级)

6
 
楼上正解,先用调试助手看,确定一个正常后再调另外一个
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

7
 
qiushenghua 发表于 2016-1-7 16:39
看到G2553,猜测使用的是Launchpad咯。

先看Launchpad的版本号,v1.4之前版本只支持定时器模拟的串口, ...

两机通讯的时候要把跳线hw和sw的跳线帽拔掉么?   还有那个串口调试助手怎么搞,断点也不会设置·哭

点评

你的代码看上去没啥问题,目前的调试可以这样: 将跳线接到HW,然后USB连电脑,打开电脑的串口调试助手,选择仿真器虚拟的那个串口,然后将程序跑起来,在串口助手里进行调试。  详情 回复 发表于 2016-1-8 12:09
 
 
 

回复

2万

帖子

341

TA的资源

版主

8
 
单片机的串行通讯测试,让人想起串口调试助手这个万能软件,,,,
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

9
 
qwqwqw2088 发表于 2016-1-7 17:55
单片机的串行通讯测试,让人想起串口调试助手这个万能软件,,,,

怎么用大神教教我

点评

仔细阅读楼上几位的建议 然后给你推荐下面红字体文档,,,参考 MSP430 LaunchPad是TI新推出的一个超值开发板。在需要调试别的系统的目标板上的TTL串口时,可以先取下板上RXD和TXD的短路块,然后通过杜邦线进  详情 回复 发表于 2016-1-7 18:06
 
 
 

回复

2万

帖子

341

TA的资源

版主

10
 
fzfz 发表于 2016-1-7 18:01
怎么用大神教教我

仔细阅读楼上几位的建议
然后给你推荐下面红字体文档,,,参考


MSP430 LaunchPad是TI新推出的一个超值开发板。在需要调试别的系统的目标板上的TTL串口时,可以先取下板上RXD和TXD的短路块,然后通过杜邦线进行连接其他的目标板
不过在使用中发现,外部目标板有时会出现接收数据错误的现象。经过实验发现,如果目标板的RXD引脚没有接上拉电阻,或者没有允许内部上拉电阻时,就会出现这个现象。在原理图上,可以看到虚拟串口是通过MSP430F16X单片机上引出的,估计是内部固件程序在初始化串口时存在bug,造成了这个问题。因为暂时找不到可以升级的固件,为了使这个虚拟串口具有更好的通用性,可以接一个外部的上拉电阻,例如在J3的第2脚和第6脚之间接一个10K左右的电阻,就可以解决这个问题了。
/******************************************************
程序功能:接收来自PC机的字符,然后重新发送给PC机
-------------------------------------------------------
通信格式:N.8.1, 9600
无校验,8个数据位,1个停止位,波特率9600
------------------------------------------------------
测试说明:打开串口调试助手,正确设置通信格式,向学习板
发送一个字符,观察是否收到回发的字符,以及是否
正确
*******************************************************/
#include

/********************主函数********************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗

P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
UCTL0 |= CHAR; // 选择8位字符
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 波特率9600
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // 初始化UART状态机
IE1 |= URXIE0; // 使能USART0的接收中断

while(1)
{
_EINT(); //打开全局中断
LPM1; //进入LPM1模式
while (!(IFG1 & UTXIFG0)); //等待以前的字符发送完毕
TXBUF0 = RXBUF0; //将收到的字符发送出去
}
}
/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数,在这里唤醒
CPU,使它退出低功耗模式
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
LPM1_EXIT; //退出低功耗模式
}


 
 
 

回复

1972

帖子

1

TA的资源

五彩晶圆(初级)

11
 
楼主用楼上版主给你程序调一下看看能不能出来

点评

当然不行啦,用的mcu型号都不一样  详情 回复 发表于 2016-1-8 12:05
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

12
 
bobde163 发表于 2016-1-7 18:26
楼主用楼上版主给你程序调一下看看能不能出来

当然不行啦,用的mcu型号都不一样
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

13
 
fzfz 发表于 2016-1-7 17:36
两机通讯的时候要把跳线hw和sw的跳线帽拔掉么?   还有那个串口调试助手怎么搞,断点也不会设置·哭

你的代码看上去没啥问题,目前的调试可以这样:

将跳线接到HW,然后USB连电脑,打开电脑的串口调试助手,选择仿真器虚拟的那个串口,然后将程序跑起来,在串口助手里进行调试。
 
 
 

回复

1193

帖子

0

TA的资源

纯净的硅(高级)

14
 
刚刚还说看上去没啥问题,因为函数都像模像样的。但是仔细想想,你的代码就没有执行过什么有效的处理语句。串口收到一个字符往temp里放,然后就没有然后了。

主循环里只有延时语句,虽然定义了好些串口数据处理的函数,但是从来就没有调用过。。。
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

15
 
在电脑端用串口助手调试,单独调试接收,单独调试发送,都没问题了,再进行两块板子通讯,
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

16
 
fzfz 发表于 2016-1-7 18:01
怎么用大神教教我

搞好了   谢谢大神~~~
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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