主题中讨论的其他器件: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;
}
}
/*****************************************************************************************************************************/