**
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;
}
}