主题中讨论的其他器件:SN75176A
Hiii 这是 Amol Gholap、
我有一个与 RS485通信相关的问题。在这里、我使用 SN75176A IC 进行通信。我尝试通过中断基址从微控制器传输和接收数据、 在这里、我观察到在以 Buad 速率9600传输 dada 时没有问题。但是在接收时间代码停留在" _bis_SR_register (LPM3_bits + GIE)"内; //启用常规中断 并进入低功耗模式3 "
我的代码中的这一行。为我提供适当的解决方案、以便将数据接收到微控制器。此外、我将在下面共享我的代码以供参考。
呈绿色突出显示、出现卡滞问题!
源代码:
//****************************************************************************** // MSP430FG662x Demo - eUSCI_A0, Ultra-Low Pwr UART 9600 Echo ISR, 32kHz ACLK // // Description: Echo a received character, RX ISR used. Normal mode is LPM3, // eUSCI_A0 RX interrupt triggers TX Echo. // ACLK = 32768Hz crystal, MCLK = SMCLK = DCO ~1.045MHz // Baud rate divider with 32768Hz XTAL @9600 = 32768Hz/9600 = 3.41 // See User Guide for baud rate divider table // // Note that UCA0RXD and UCA0TXD need to be assigned pins via the PMAP // controller. // // MSP430FG662x // ----------------- // /|\ | XIN|- // | | | 32kHz // ---|RST XOUT|- // | | // | P2.0/UCA0TXD|------------> // | | 9600 - 8N1 // | P2.1/UCA0RXD|<------------ // // M. Swanson // Texas Instruments Inc. // April 2014 // Built with Code Composer Studio v5.5 //****************************************************************************** #include <msp430.h> int ReceiveData; int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop WDT CTSD16CCTL0 |= CTSD16SC; // Workaround for CTSD16OFFG errata do { CTSD16CTL &= ~CTSD16OFFG; } while (CTSD16CTL&CTSD16OFFG); // End of CTSD16OFFG workaround while(BAKCTL & LOCKBAK) // Unlock XT1 pins for operation BAKCTL &= ~(LOCKBAK); UCSCTL6 &= ~(XT1OFF); // XT1 On UCSCTL6 |= XCAP_3; // 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); // Test oscillator fault flag __enable_interrupt(); // enable all interrupts __bis_SR_register(LPM3_bits + GIE); // General interrupts enabled // (LPM3_bits +) __no_operation(); // For debugger //----------------------------------------- Configuring MAX485 Control Lines ---------------------------------------// P8SEL |= BIT4; // COMMON P8.4 to ~RE DE and...at P8.4 P8DIR |= BIT4; // common P8.4 -> DE,-> ~RE output P8.4 // P8OUT &= ~(BIT4); // ~RE & DE SET TO ZERO IN RECEIVING MODE P8SEL |= 0x0C; // Assign P8.2 to UCA0TXD and... P8DIR |= 0x0C; // P8.3 to UCA0RXD UCA1CTL1 |= UCSWRST; // **Put state machine in reset** UCA1CTL1 |= UCSSEL_1; // CLK = ACLK UCA1BR0 = 0x03; // 32kHz/9600=3.41 (see User's Guide) UCA1BR1 = 0x00; // UCA1MCTL = UCBRS_3|UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0 UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt //-----------------------------------******************************--------------------------------------------------------// /*************************************************************************************************/ while(1) { // while (!(UCA1IFG&UCTXIFG)); // USCI_A1 TX buffer ready? // UCA1TXBUF = 0xAA; // __delay_cycles (48000); } } /************************************RS485 ISR SETUP***************************/ // Echo back RXed character, confirm TX buffer is ready first// #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(USCI_A1_VECTOR))) USCI_A1_ISR (void) #else #error Compiler not supported! #endif { switch(__even_in_range(UCA1IV,4)) { case 0:break; // Vector 0 - no interrupt case 2: // Vector 2 - RXIFG P8OUT &= (~BIT4); // ~RE & DE SET TO ZERO IN RECEIVING MODE while (!(UCA1IFG&UCTXIFG)); // USCI_A1 TX buffer ready? ReceiveData=UCA1RXBUF; P8SEL |= BIT4; __delay_cycles (4800); UCA1TXBUF = ReceiveData; // TX -> RXed character __delay_cycles (4800); break; case 4:break; // Vector 4 - TXIFG default: break; } } /*****************************************************************************************************************************/