This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FG6626:MSP430:MSP430FG6626:SN75176A

Guru**** 2391705 points
Other Parts Discussed in Thread: SN75176A

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1118034/msp430fg6626-msp430-msp430fg6626-sn75176a

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在配置 UCA1之前、您似乎正在进入 LPM3、因此 UART 不会运行、因此它不会接收任何内容。

    如果删除该行会发生什么情况? (长期而言、您可能希望将其移至 while (1)循环。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sayali、

    除了 Bruce 的评论之外、请确保在将代码发布到论坛时使用代码格式工具。 在发布帖子时,只需单击“插入”,然后单击“ 代码"以显示一个窗口、您可以将代码粘贴到其中。 这将为可读性设置格式。 我已经编辑过您的帖子以反映此类更改。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据您所说的我已经进行了更改、这是 UART 之后的初始化 LPM3模式、但仍然发生了相同的问题、程序将被吸入到这一行中。请检查代码中的时钟配置是否正确? b 因为在数据表 LPM3部分中已经提到->  

    低功耗模式3 (LPM3)–CPU 被禁用–MCLK、FLL 环路控制、和 DCOCLK 被禁用–DCO 的直流发生器被禁用–ACLK 保持激活。我认为时钟设置错误、否则可能会发生这种情况。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) UART 是对称的、因此如果您在发送时看到正确的传输(包括正确的波特率)、则时钟被假定为正常。  

    2) 2)正如您所说、ACLK 在 LPM3中运行、因此 UART 继续运行。 话虽如此:如果您认为这种情况正在发生、请尝试立即移除 LPM (或尝试例如 LPM0)。

    3) 3)这看起来不太正确:

    > P8SEL |= BIT4;//将 P8.4更改为~Ω RE 和...在 P8.4

    因为这会将 P8.4分配给 UCB1CLK、之后您无法对其进行控制。 我怀疑您至少希望/RE 低电平、直到您收到某些内容、因此请尝试将其替换为:

    > P8OUT &=~BIT4;///re、DE 初始为低电平(Rx 模式)

    4) 4)您的 ISR 会将/RE 设置为低电平、但太晚了-/RE 需要为低电平才能接收任何位。 我建议您删除该行(但请参阅下面的(5))。

    5) 5) ISR 会为传输(回波)设置/RE 高电平、但随后会将其保持在高电平、因此您不会收到任何其他内容。 我建议您将(秒)_delay_cycles 替换为:

    > while (UCA1STAT & UCBUSY)/* empty*/; //等待传输完成

    > P8OUT &=~BIT4;  //返回接收模式

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sayali、

    我建议您使用我们实现 TX 和 RX 的标准 UART 代码示例。 这将有助于您继续进行项目。

    https://dev.ti.com/tirex/explore/node?node=ALbd14Q.8l5pR.NohrNbuQ__IOGqZri__LATEST