3969|2

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

430f5438串口 [复制链接]

#include "msp430x54x.h"
#include
#include
#include
#include "PIN_DEF.H"

#define  FLL_FACTOR     749                                          // FLL_FACTOR: DCO倍频系数   
char  event, RXBuffer[8],temp,i,j = 0                                      ;


//  RS232/485接收中断服务程序                                                //
#pragma vector=USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{
  switch(__even_in_range(UCA3IV,4))
  {
  case 0:break                                                     ; // Vector 0 - no interrupt
  case 2:                                                            // Vector 2 - RXIFG
      RXBuffer[0]  = UCA3RXBUF;
      event           |= 0x01                                      ;
      break   ;      
   
  case 4:break                                                     ;  // Vector 4 - TXIFG
  default: break                                                   ;  
  }                        
}

//                 初始化主时钟: MCLK = XT1×(FLL_FACTOR+1)                  //
void Init_CLK(void)
{
  WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗
  P7SEL     |= 0x03                                       ; // 端口选择外部低频晶振XT1
  UCSCTL6   &=~XT1OFF                                     ; // 使能外部晶振
  UCSCTL6   |= XCAP_3                                     ; // 设置内部负载电容
  UCSCTL3   |= SELREF_2                                   ; // DCOref = REFO
  UCSCTL4   |= SELA_0                                     ; // ACLK   = XT1  
  __bis_SR_register(SCG0)                                 ; // 关闭FLL控制回路
  UCSCTL0    = 0x0000                                     ; // 设置DCOx, MODx
  UCSCTL1    = DCORSEL_7                                  ; // 设置DCO振荡范围
  UCSCTL2    = FLLD__1 + FLL_FACTOR                       ; // Fdco = ( FLL_FACTOR + 1)×FLLRef = (649 + 1) * 32768 = 21.2992MHz
  __bic_SR_register(SCG0)                                 ; // 打开FLL控制回路                                                            
  __delay_cycles(1024000)                                 ;
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                            
    SFRIFG1 &= ~OFIFG                                     ;
  }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志
}

//  Init_Port(void): 设置IO端口                                
void Init_Port(void)
{
  P5DIR  |= POWER                                                  ; // 主电源
  MAIN_POWER_ON                                                    ;
  P7DIR  |= LED_PWR                                                ; // 发光二极管电源
  P7OUT  &=~LED_PWR                                                ;
  INTERNAL_PULL_UP                                                 ; // 使能键盘端口内部上拉电阻
  ROW_IN_COL_OUT                                                   ; // 设置行输入,列输出0
}


//  Init_RSUART(void): 初始化RS232/485端口               
void Init_RSUART(void)
{
  RS_PORT_SEL    |= TXD + RXD                                      ; // 选择引脚功能
  RS_PORT_DIR    |= TXD                                            ; // 选择引脚功能
  UCA3CTL1        = UCSWRST                                        ; // 状态机复位
  UCA3CTL1       |= UCSSEL_1                                       ; // CLK = ACLK
  UCA3BR0         = 0x03                                           ; // 32kHz/9600=3.41
  UCA3BR1         = 0x00                                           ;
  UCA3MCTL        = UCBRS_3 + UCBRF_0                              ; // UCBRSx=3, UCBRFx=0
  UCA3CTL1       &= ~UCSWRST                                       ; // 启动状态机
  UCA3IE         |= UCRXIE                                         ; // 允许接收中断
  RS485_IN                                                         ;
}

//  RS232TX_PROC(void): RS232端口发送程序                              
void RS232TX_PROC(char *tx_buf)
{
  unsigned char i,length                                           ;
  length = strlen(tx_buf)                                          ;
  for(i=0;i   {
    UCA3TXBUF = *tx_buf++                                          ;
    while (!(UCA3IFG&UCTXIFG))                                     ;
  }
}

void main( void )
{
  WDTCTL = WDTPW + WDTHOLD                                         ;
  Init_CLK()                                                       ;
  Init_Port()                                                      ;
  Init_RSUART()                                                    ;
  _EINT()                                                          ;
  while(1)
  {
    if(event)
    {
      __delay_cycles(1000);
      event   = 0x00 ;
      RS232TX_PROC(RXBuffer);   
      __delay_cycles(5000);
    }
   
    if((P6IN&0x0F)!=0x0F)                                            // 检测按键按下
    {
      __delay_cycles(1000);
      if((P6IN&0x0F)!=0x0F)
      {
        while(!((P6IN&0x0F)==0x0F));
        RS232TX_PROC("This is BW-DK5438")                            ;
        __delay_cycles(5000)                                      ;
      }      
    }   
  }
}
串口程序  想cong PC机发送数据并显示数据,但是老是显示最后一个字符,  RXBuffer[0]  = UCA3RXBUF我改了好几次都没有测通 ,帮忙解决一下吧,谢谢了

最新回复

  详情 回复 发表于 2011-10-24 21:05
 
点赞 关注

回复
举报

299

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
能显示最后一个字符表明通信没有问题,
那就是对接收到的数据进行处理显示的逻辑问题了,
建议楼主对该部分进行软仿。
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

强悍

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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