msp430串列埠接收除錯
阿新 • • 發佈:2019-02-16
一、串列埠調試出錯
串列埠接收配置需要注意的是開啟總中斷( __enable_interrupt(); ),不能僅開啟串列埠接收中斷。
#include <msp430f5438a.h> //********************************************** //RS485晶片方向控制 //*********************************************** void set_rs485_dir(char tx_rx) { //1---傳送,0接收 if (tx_rx==1) { P9OUT|=(BIT6+BIT7); } else { P9OUT&=~(BIT6+BIT7); } P9DIR|=(BIT6+BIT7); } void delay(char num) { while(num--); } int main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT //串列埠2 初始化 P9SEL|= BIT4+BIT5; //對於P5 6,7為模組功能 P9DIR|=BIT4; P9DIR&=~BIT5; UCA2CTL1 |= UCSWRST; // **Put state machine in reset** UCA2CTL1 |= UCSSEL_2; // SMCLK UCA2BR0 = 109; UCA2BR1 = 0; UCA2MCTL |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0 UCA2CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA2IE |= UCRXIE; // Enable USCI_A0 RX interrupt __enable_interrupt();//容易忽略 set_rs485_dir(1);//傳送 delay(3000); while (!(UCA2IFG&UCTXIFG)); // USCI_A2 TX buffer ready? UCA2TXBUF = 0x55; // TX -> RXed character delay(3000); set_rs485_dir(0);//接收 delay(3000); while(1) { delay(2000); } } #pragma vector=USCI_A2_VECTOR __interrupt void USCI_A2_ISR(void) { switch(__even_in_range(UCA2IV,4)) { case 0:break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG set_rs485_dir(1);//傳送 delay(30); while (!(UCA2IFG&UCTXIFG)); // USCI_A0 TX buffer ready? UCA2TXBUF = UCA2RXBUF; // TX -> RXed character set_rs485_dir(0);//接收 delay(30); break; case 4:break; // Vector 4 - TXIFG default: break; } }