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.

[参考译文] MSP430FR5969:只有当微控制器由 USB 供电时、与 ZigBee 的 UART 通信才有效

Guru**** 2538950 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1034941/msp430fr5969-uart-communication-with-zigbee-works-only-when-microcontroller-is-powered-by-usb

器件型号:MSP430FR5969

您好!

我不熟悉此论坛、也是 MSP430架构的初学者。 我希望使用 UART 协议 MSP430将数据(内部温度传感器数据在启动时仅传输一次)发送到远程 ZigBee。 通过将 ZigBee 连接到2.0和2.1 UART 引脚进行通信、我使用 launchpad 成功地做到了这一点。 但是、当我尝试使用外部电源(3.3V 端子连接到 VCC、-ve 端子连接到 GND)执行同样的操作时、它不起作用。 当我使用 PC 上的 USB 给微控制器上电时、它似乎才起作用。 我是不是做错了、还是在提供外部电源时需要使用引脚2.5和2.6 (eUCSIA1)。 我附上以下代码:  

#include <msp430.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

char temp_int_char[5];
char temp_rm_char[5];
char mv_char[5];
char charmemval[] = "ADC12MEM0 Value: ";
char temperature[] = "The Temperature in degree is: ";
char newline[] = " \r\n";
char dot[] = ".";

#define CALADC12_12V_30C  *((unsigned int *)0x1A1A)   // Temperature Sensor Calibration-30 C
                                                      //See device datasheet for TLV table memory mapping
#define CALADC12_12V_85C  *((unsigned int *)0x1A1C)   // Temperature Sensor Calibration-85 C

unsigned int temp;
volatile float temperatureDegC;
volatile float temperatureDegF;

void ser_output(char *str);


int main(void)
{
    volatile float voltage;
    int i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  CSCTL0_H = CSKEY_H;
  CSCTL2 |= SELA__VLOCLK; //Select ACLK to use VLO which runs at about 10KhZ
  CSCTL0_H = 0;

  P1DIR |= BIT0;      //set pin 1.0 as output
  P1OUT &= ~BIT0;         // set pin 1.0 as low

 // P1DIR |= BIT3;      //set pin 1.3 as output
 //     P1OUT |= BIT3;      //set pin 1.3 as high

 //     P1DIR |= BIT2;      //set pin 1.2 as output
 //     P1OUT |= BIT2;      //set pin 1.2 as high

 //     P1DIR |= BIT4;      //set pin 1.4 as output
 //     P1OUT &= ~BIT4;     //set pin 1.4 as low

//  P4DIR |= BIT6;      //set pin 4.6 as output
//  P4OUT |= BIT6;      //set pin 4.6 as high
  initialize_UART();


  // Initialize the shared reference module
  // By default, REFMSTR=1 => REFCTL is used to configure the internal reference
  while(REFCTL0 & REFGENBUSY);              // If ref generator busy, WAIT
  REFCTL0 |= REFVSEL_0 + REFON;             // Enable internal 1.2V reference

  /* Initialize ADC12_A */
  ADC12CTL0 &= ~ADC12ENC;                   // Disable ADC12
  ADC12CTL0 = ADC12SHT0_8 + ADC12ON;        // Set sample time
  ADC12CTL1 = ADC12SHP;                     // Enable sample timer
  ADC12CTL3 = ADC12TCMAP;                   // Enable internal temperature sensor
  ADC12MCTL0 = ADC12VRSEL_1 + ADC12INCH_30; // ADC input ch A30 => temp sense
  ADC12IER0 = ADC12IE0;                         // ADC_IFG upon conv result-ADCMEMO

  while(!(REFCTL0 & REFGENRDY));            // Wait for reference generator
                                            // to settle
  ADC12CTL0 |= ADC12ENC;
  ADC12CTL0 |= ADC12SC;                   // Sampling and conversion start
  __bis_SR_register(LPM0_bits | GIE);     // LPM0 with interrupts enabled
 // __no_operation();
  //while(ADC12CTL1 & ADC12BUSY);
  int memval = ADC12MEM0;
     // Temperature in Celsius. See the Device Descriptor Table section in the
     // System Resets, Interrupts, and Operating Modes, System Control Module
     // chapter in the device user's guide for background information on the
     // used formula.
     temperatureDegC = (float)(((long)temp - CALADC12_12V_30C) * (85 - 30)) /
             (CALADC12_12V_85C - CALADC12_12V_30C) + 30.0f;

     //print temp value to UART terminal
     int temp_int = floor(temperatureDegC);
     int temp_rmndr = floor((temperatureDegC - temp_int) * 1000);
     ltoa(memval, mv_char, 10);
     ltoa(temp_int,temp_int_char, 10);
     ltoa(temp_rmndr,temp_rm_char, 10);
     ser_output(charmemval); ser_output(mv_char); ser_output(newline);
     ser_output(temperature); ser_output(temp_int_char); ser_output(dot); ser_output(temp_rm_char); ser_output(newline);
//     P1OUT &= ~BIT2;        // stop driving pmos source
 //    P1OUT |= BIT4;         //PMOS gate high to disconnect from the circuit
     P1OUT |= BIT0;         // set pin 1.0 as high indicating completion of zigbee communication
 while(1)
  {


    __no_operation();


    //for(i=0; i<30000;i++){}
    // Temperature in Fahrenheit Tf = (9/5)*Tc + 32
    //temperatureDegF = temperatureDegC * 9.0f / 5.0f + 32.0f;

   // __no_operation();                       // SET BREAKPOINT HERE
  }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
#else
#error Compiler not supported!
#endif
{
  switch(__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
  {
    case ADC12IV_NONE:        break;        // Vector  0:  No interrupt
    case ADC12IV_ADC12OVIFG:  break;        // Vector  2:  ADC12MEMx Overflow
    case ADC12IV_ADC12TOVIFG: break;        // Vector  4:  Conversion time overflow
    case ADC12IV_ADC12HIIFG:  break;        // Vector  6:  ADC12BHI
    case ADC12IV_ADC12LOIFG:  break;        // Vector  8:  ADC12BLO
    case ADC12IV_ADC12INIFG:  break;        // Vector 10:  ADC12BIN
    case ADC12IV_ADC12IFG0:                 // Vector 12:  ADC12MEM0 Interrupt
      temp = ADC12MEM0;                     // Move results, IFG is cleared
      __bic_SR_register_on_exit(LPM0_bits); // Exit active CPU
      break;
    case ADC12IV_ADC12IFG1:   break;        // Vector 14:  ADC12MEM1
    case ADC12IV_ADC12IFG2:   break;        // Vector 16:  ADC12MEM2
    case ADC12IV_ADC12IFG3:   break;        // Vector 18:  ADC12MEM3
    case ADC12IV_ADC12IFG4:   break;        // Vector 20:  ADC12MEM4
    case ADC12IV_ADC12IFG5:   break;        // Vector 22:  ADC12MEM5
    case ADC12IV_ADC12IFG6:   break;        // Vector 24:  ADC12MEM6
    case ADC12IV_ADC12IFG7:   break;        // Vector 26:  ADC12MEM7
    case ADC12IV_ADC12IFG8:   break;        // Vector 28:  ADC12MEM8
    case ADC12IV_ADC12IFG9:   break;        // Vector 30:  ADC12MEM9
    case ADC12IV_ADC12IFG10:  break;        // Vector 32:  ADC12MEM10
    case ADC12IV_ADC12IFG11:  break;        // Vector 34:  ADC12MEM11
    case ADC12IV_ADC12IFG12:  break;        // Vector 36:  ADC12MEM12
    case ADC12IV_ADC12IFG13:  break;        // Vector 38:  ADC12MEM13
    case ADC12IV_ADC12IFG14:  break;        // Vector 40:  ADC12MEM14
    case ADC12IV_ADC12IFG15:  break;        // Vector 42:  ADC12MEM15
    case ADC12IV_ADC12IFG16:  break;        // Vector 44:  ADC12MEM16
    case ADC12IV_ADC12IFG17:  break;        // Vector 46:  ADC12MEM17
    case ADC12IV_ADC12IFG18:  break;        // Vector 48:  ADC12MEM18
    case ADC12IV_ADC12IFG19:  break;        // Vector 50:  ADC12MEM19
    case ADC12IV_ADC12IFG20:  break;        // Vector 52:  ADC12MEM20
    case ADC12IV_ADC12IFG21:  break;        // Vector 54:  ADC12MEM21
    case ADC12IV_ADC12IFG22:  break;        // Vector 56:  ADC12MEM22
    case ADC12IV_ADC12IFG23:  break;        // Vector 58:  ADC12MEM23
    case ADC12IV_ADC12IFG24:  break;        // Vector 60:  ADC12MEM24
    case ADC12IV_ADC12IFG25:  break;        // Vector 62:  ADC12MEM25
    case ADC12IV_ADC12IFG26:  break;        // Vector 64:  ADC12MEM26
    case ADC12IV_ADC12IFG27:  break;        // Vector 66:  ADC12MEM27
    case ADC12IV_ADC12IFG28:  break;        // Vector 68:  ADC12MEM28
    case ADC12IV_ADC12IFG29:  break;        // Vector 70:  ADC12MEM29
    case ADC12IV_ADC12IFG30:  break;        // Vector 72:  ADC12MEM30
    case ADC12IV_ADC12IFG31:  break;        // Vector 74:  ADC12MEM31
    case ADC12IV_ADC12RDYIFG: break;        // Vector 76:  ADC12RDY
    default: break;
  }
}

void ser_output(char *str){
    while(*str != 0){
        while (!(UCA0IFG&UCTXIFG));
        UCA0TXBUF = *str++;
    }
}

void initialize_UART(void)
{
    // Configure GPIO
     P2SEL1 |= BIT0 | BIT1;                    // USCI_A0 UART operation
     P2SEL0 &= ~(BIT0 | BIT1);
     //P4DIR |= BIT6;
     //P4OUT &= ~BIT6;

     // Disable the GPIO power-on default high-impedance mode to activate
     // previously configured port settings
     PM5CTL0 &= ~LOCKLPM5;

     // Startup clock system with max DCO setting ~8MHz
     CSCTL0_H = CSKEY >> 8;                    // Unlock clock registers
     CSCTL1 = DCOFSEL_3 | DCORSEL;             // Set DCO to 8MHz
     CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
     CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1;     // Set all dividers
     CSCTL0_H = 0;                             // Lock CS registers

     // Configure USCI_A0 for UART mode
     UCA0CTLW0 = UCSWRST;                      // Put eUSCI in reset
     UCA0CTLW0 |= UCSSEL__SMCLK;               // CLK = SMCLK
     // Baud Rate calculation
     // 8000000/(16*9600) = 52.083
     // Fractional portion = 0.083
     // User's Guide Table 21-4: UCBRSx = 0x04
     // UCBRFx = int ( (52.083-52)*16) = 1
     UCA0BR0 = 52;                             // 8000000/16/9600
     UCA0BR1 = 0x00;
     UCA0MCTLW |= UCOS16 | UCBRF_1;
     UCA0CTLW0 &= ~UCSWRST;
    // UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}

提前感谢。

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

    如何为 Zigbee 供电? 是否需要5V 电压?

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

    我尝试通过 USB 和微控制器提供 ZigBee 电源。 当我使用微控制器时、我将 ZigBee 的1、2、3和10引脚(穿孔引脚)连接到微控制器。 我正在使用带有 s2c XBee 的凹槽开发板。 XBee 需要3.3V 电源、但由于有一个稳压器、因此可以将5V 电源连接到电路板。 在所连接链路的第15页中、它显示 XBee 的电源应为3.3V。 这就是我尝试的操作。 但是、当微控制器由直流电源驱动时、什么也不起作用。
    https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&ved=2ahUKEwjCkPL49_HyAhW3SfEDHVxZClwQFnoECAIQAQ&url=https%3A%2F%2Fwww.digi.com%2Fresources%2Fdocumentation%2Fdigidocs%2Fpdfs%2F90001457-13.pdf&usg=AOvVaw3l3IYaiAufQ_rSkg_dikQg

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

    您是否在其中添加了范围? 串行通信是双向的吗?

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

    不、我不是很遗憾。 我经常无法访问范围。 我明天会尝试检查它。 感谢您的建议。 顺便说一句、我不确定、但可以肯定的是、当微控制器使用其底部的 VCC 和 GND 引脚供电时、也需要在同一侧进行串行通信(通过使用引脚2.5和2.6的 UCSA1)? 很抱歉、如果它看起来像个愚蠢的问题、但不能帮助、而是想知道!

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

    是的、这些引脚应该是相同的。 但是、如果您有不同的供电方案、请确保 MCU 和 Zigbee 之间连接了接地端!

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

    谢谢、我将切换到使用 UCSIA1、并在明天重试。 我将告诉您发生了什么。

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

    当您访问示波器时、最好检查问题的来源。  您可以使用 eUSCIA0或 eUSCIA1、只需确保初始化正确的引脚即可。 (A0使用2.0和2.1、A1使用2.5和2.6)。

    1. MSP430FR5969是否未发送或 ZigBee 是否未接收?
    2. 此外、当您通过 USB 进行连接时、接地平面是如何设置的? Keith 在检查接地是否正确时提出了一个很好的问题。 系统供电方式的切换可能会改变您的接地连接。