MSP430F6779用485进行串口通信

**

MSP430F6779用485进行串口通信

**
初次使用,一开始只能从上位机接收到指令,无法从MCU上传到PC,经过修改发送查询(while(!(UCA3IFG&UCTXIFG));),基本可以完成发送,给大家参考。

// An highlighted block
#include "msp430.h" 
#include <stdbool.h>
#include <stdint.h>

#define DRE485_out     P2DIR |= BIT7    #485方向选择

unsigned char buffer0[] = {"\nA!545445\n"}; 
unsigned char buffer1[] = {"\r\n12121212!\r\n"};
unsigned char c[]={"ready for receive!"};

void initUART()
{     DRE485_out;                           
      P2OUT &= ~BIT7;						//初始化485为输入
											// Configure USCI_A3 for UART mode 配置串口通信
    UCA3CTLW0 = UCSWRST;                    // Put eUSCI in reset

      UCA3CTLW0 |= UCSSEL__ACLK;              // CLK = ACLK
      UCA3BRW = 3;
      UCA3MCTLW = 0x9200;                     // UCBRSx = 0x92, UCOS16 = 0
      
      
    UCA3CTLW0 &= ~UCSWRST;                    // Initialize eUSCI
    UCA3IE |= UCRXIE + UCTXIE;                         // Enable USCI_A3 interrupt 打开收发中断
 
}

void initGPIO()
{
											  // Setup P4.1 UCA0RXD, P4.2 UCA0TXD
    P4SEL0 |= BIT2 + BIT1;                    // Set P3.0, P3.1 to non-IO
		  
}

void clockSet()
{
    UCSCTL6 &= ~(XT1OFF);                    // XT1 On
    UCSCTL6 |= XCAP_1;                       // Internal load cap
    // Loop until XT1 fault flag is cleared
    do
    {
        UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
        // Clear XT2,XT1,DCO fault flags
        SFRIFG1 &= ~OFIFG;                   // Clear fault flags
    } while (SFRIFG1 & OFIFG); 
    UCSCTL6 &= ~(XT1DRIVE_3);
}

void send_buf(unsigned char *ptr)    //发送字符串
{   
        P2OUT |= BIT7;   //485发出
	while(*ptr != '\0') 
                  { 
                    UCA3TXBUF = *ptr++;
                    while(!(UCA3IFG&UCTXIFG));
                   
                    __delay_cycles(5000);   5ms延时
                  } 

	while(UCA3STATW & UCBUSY) ;
        P2OUT &= ~BIT7;   //485接收
}

void main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  
  P5DIR |= BIT0 + BIT1;  //发送,接收指示灯
  P5OUT |= BIT0 + BIT1; 
  
  initUART();//初始化
  initGPIO();
  clockSet();
  
  unsigned char *p0;
    p0 = c;                                                
   send_buf(p0);                                          //  发送 开始指令
  
   
  __bis_SR_register(LPM3_bits + GIE);
  
}
#pragma vector=USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{  unsigned char *p0,*p1;  
    p0 = buffer0;
    p1 = buffer1;
  unsigned char rxData;
  
  switch(__even_in_range(UCA3IV,4))
  {
  case 0:break;                             // Vector 0 - no interrupt
  case 2:
     P5OUT  ^= BIT0;
     rxData = UCA3RXBUF;               // Vector 2 - RXIFG 接收中断                  
             if(rxData == 'A')
               { P2OUT |= BIT7;           //先发出
                 while(*p0 != '\0')                   
                  {  
                    while(UCA3STATW & UCBUSY) ;   //此处用 while(!(UCA3IFG&UCTXIFG));不行
                    UCA3TXBUF = *p0++;                                       
                    __delay_cycles(5000);  //再接收
                  }  
                 P2OUT &= ~BIT7;
                }
               else
               {   P2OUT |= BIT7;
                 while(*p1 != '\0') 
                  { 
                    while(UCA3STATW & UCBUSY) ;
                    UCA3TXBUF =  *p1++;                                     
                    __delay_cycles(5000);
                  }    
                 P2OUT &= ~BIT7;
               }  
              break;  
  
  case 4: 
     P5OUT  ^= BIT1;
      __delay_cycles(50000);
      P5OUT  ^= BIT1;
    break;                             // Vector 4 - TXIFG  发送指示灯
  default: break;
  }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值