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.

[参考译文] MSP-TS430PZ100E:使用 SN75176B 差动收发器的 UART (RS-485)不起作用

Guru**** 2561150 points
Other Parts Discussed in Thread: MSP-TS430PZ100E, MSP430F5528

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/902171/msp-ts430pz100e-uart-rs-485-using-sn75176b-differential-transceiver-doesn-t-work

器件型号:MSP-TS430PZ100E
主题中讨论的其他器件: MSP430F5528

你好!

我使用 MSP-TS430PZ100E (MSP450FR6047)和 SN5176B 差动收发器通过 RS485/USB 转换器与 PC 进行通信。  

我以前从未使用过 SN5176B。 更准确地说、我没有将 UART 用于 RS485接口的经验。 使用 UART 的唯一成功经验是通过 TDS7200EVEM ( MSP430F5528)与 TTL 通信。

我必须使用 UCA2 (P5.0 - TXD、P5.1 - RXD、P5.2 - RE/DE)、因为 UCA0和 UCA1要么已经用于 JTAG、要么离试验电路板太远。 原理图如下所示;

在如下修改后、我使用了 TI 的"msp430fr60x7_euscia0_UART_01.c"示例代码;

 

#include

 

int main (空)

  WDTCTL = WDTPW | WDTHOLD;              //停止看门狗

 

  //配置 GPIO

  P5SEL0 &=~(BIT0 | BIT1);

  P5SEL1 |= BIT0 | BIT1;                // USCI_A0 UART 操作

 

  P5DIR |= BIT2;// P5.2 -> DE、~RE、输出

          P5OUT  &=~ BIT2;      //

 

  //禁用 GPIO 上电默认高阻抗模式以激活

  //先前配置的端口设置

  PM5CTL0 &=~LOCKLPM5;

 

  //最大 DCO 设置~8MHz 的启动时钟系统

  CSCTL0_H = CSKKEY_H;                    //解锁 CS 寄存器

  CSCTL1 = DCOFSEL_3 | DCORSEL;          //将 DCO 设置为8MHz

  CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;

  CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;  //设置所有分频器

  CSCTL0_H = 0;                          //锁定 CS 寄存器

 

  //将 USCI_A0配置为 UART 模式

  UCA2CTLW0 = UCSWRST;                  //将 eUSCI 置于复位状态

  UCA2CTLW0 |= UCSSEL_SMCLK;            // CLK = SMCLK

  //波特率计算

  // 800000000 /(16*9600)= 52.083

  //分数部分= 0.083

  //用户指南表24-4:UCBRSx = 0x04

  // UCBRFx = int ((52.083-52)*16)= 1.

  UCA2BRW = 52;                          // 8000000/16/9600

  UCA2MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

  UCA2CTLW0 &=~UCSWRST;                //初始化 eUSCI

  UCA2IE |= UCRXIE;                      //启用 USCI_A0 RX 中断

 

  _bis_SR_register (LPM3_bits + GIE);    //输入 LPM3、中断被启用

  __no_operation();                      //用于调试器

 

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

#pragma vector=EUSCI_A2_vector

_interrupt void USCI_A2_ISR (void)

#Elif defined (_GNU_)

void __attribute__((中断(EUSCI_A2_vector)) USCI_A2_ISR (void)

其他

错误编译器不受支持!

#endif

  switch (__evo_in_range (UCA2IV、USCI_UART_UCTXCPTIFG))

  {

      USCI_NONE 案例中断

      USCI_UART_UCRXIFG 案例

          while (!(UCA2IFG&UCTXIFG));

          UCA2TXBUF = UCA2RXBUF;

          __no_operation()

          中断;

      案例 USCI_UART_UCTXIFG:中断

      案例 USCI_UART_UCSTTIFG:中断

      案例 USCI_UART_UCTXCPTIFG:中断

      默认值:break

  }

如下所示、我通过使用示波器持续发送一个字符来检查 TXD 端口是否提供输出、并确认它提供输出。

while (1)

  {

//      if (i>0)

      {

 

          一----;

          P1OUT ^=(BIT0|BIT1);                    //切换 LED

 

          _DELAY_CYCLES (100000);

          _DELAY_CYCLES (100000);

          _DELAY_CYCLES (100000);

          _DELAY_CYCLES (100000);

          _DELAY_CYCLES (100000);

                  _DELAY_CYCLES (100000);

                  _DELAY_CYCLES (100000);

                  _DELAY_CYCLES (100000);

                  _DELAY_CYCLES (100000);

      }

      if (bButton_menu)

          {

              显示("按下按钮菜单");

          }

      其他

      {

          show ("MaxiFlo 热量计");

      }

 

      UCA2TXBUF ='A';

      UCA2TXBUF ="b";

//      _ bis_SR_register (LPM4_bits | GIE);//输入 LPM4并带有中断

        __no_operation();                  //用于调试器

 

  }

请帮我!!!

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

    器件型号:MSP-TS430PZ100E

    你好!

    我使用 MSP-TS430PZ100E (MSP450FR6047)和 SN5176B 差动收发器通过 RS485/USB 转换器与 PC 进行通信。  

    我以前从未使用过 SN5176B。 更准确地说、我没有将 UART 用于 RS485接口的经验。 使用 UART 的唯一成功经验是通过 TDS7200EVEM ( MSP430F5528)与 TTL 通信。

    我必须使用 UCA2 (P5.0 - TXD、P5.1 - RXD、P5.2 - RE/DE)、因为 UCA0和 UCA1要么已经用于 JTAG、要么离试验电路板太远。 原理图如下所示;(A 和 B 两端有一个120欧姆的电阻器、但此处未显示)

    在如下修改后、我使用了 TI 的"msp430fr60x7_euscia0_UART_01.c"示例代码;

     

    #include

     

    int main (空)

      WDTCTL = WDTPW | WDTHOLD;              //停止看门狗

     

      //配置 GPIO

      P5SEL0 &=~(BIT0 | BIT1);

      P5SEL1 |= BIT0 | BIT1;                // USCI_A0 UART 操作

     

      P5DIR |= BIT2;// P5.2 -> DE、~RE、输出

              P5OUT  &=~ BIT2;      //

     

      //禁用 GPIO 上电默认高阻抗模式以激活

      //先前配置的端口设置

      PM5CTL0 &=~LOCKLPM5;

     

      //最大 DCO 设置~8MHz 的启动时钟系统

      CSCTL0_H = CSKKEY_H;                    //解锁 CS 寄存器

      CSCTL1 = DCOFSEL_3 | DCORSEL;          //将 DCO 设置为8MHz

      CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;

      CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;  //设置所有分频器

      CSCTL0_H = 0;                          //锁定 CS 寄存器

     

      //将 USCI_A0配置为 UART 模式

      UCA2CTLW0 = UCSWRST;                  //将 eUSCI 置于复位状态

      UCA2CTLW0 |= UCSSEL_SMCLK;            // CLK = SMCLK

      //波特率计算

      // 800000000 /(16*9600)= 52.083

      //分数部分= 0.083

      //用户指南表24-4:UCBRSx = 0x04

      // UCBRFx = int ((52.083-52)*16)= 1.

      UCA2BRW = 52;                          // 8000000/16/9600

      UCA2MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

      UCA2CTLW0 &=~UCSWRST;                //初始化 eUSCI

      UCA2IE |= UCRXIE;                      //启用 USCI_A0 RX 中断

     

      _bis_SR_register (LPM3_bits + GIE);    //输入 LPM3、中断被启用

      __no_operation();                      //用于调试器

     

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

    #pragma vector=EUSCI_A2_vector

    _interrupt void USCI_A2_ISR (void)

    #Elif defined (_GNU_)

    void __attribute__((中断(EUSCI_A2_vector)) USCI_A2_ISR (void)

    其他

    错误编译器不受支持!

    #endif

      switch (__evo_in_range (UCA2IV、USCI_UART_UCTXCPTIFG))

      {

          USCI_NONE 案例中断

          USCI_UART_UCRXIFG 案例

              while (!(UCA2IFG&UCTXIFG));

              UCA2TXBUF = UCA2RXBUF;

              __no_operation()

              中断;

          案例 USCI_UART_UCTXIFG:中断

          案例 USCI_UART_UCSTTIFG:中断

          案例 USCI_UART_UCTXCPTIFG:中断

          默认值:break

      }

    如下所示、我通过使用示波器持续发送一个字符来检查 TXD 端口是否提供输出、并确认它提供输出。

    while (1)

      {

    //      if (i>0)

          {

     

              一----;

              P1OUT ^=(BIT0|BIT1);                    //切换 LED

     

              _DELAY_CYCLES (100000);

              _DELAY_CYCLES (100000);

              _DELAY_CYCLES (100000);

              _DELAY_CYCLES (100000);

              _DELAY_CYCLES (100000);

                      _DELAY_CYCLES (100000);

                      _DELAY_CYCLES (100000);

                      _DELAY_CYCLES (100000);

                      _DELAY_CYCLES (100000);

          }

          if (bButton_menu)

              {

                  显示("按下按钮菜单");

              }

          其他

          {

              show ("MaxiFlo 热量计");

          }

     

          UCA2TXBUF ='A';

          UCA2TXBUF ="b";

    //      _ bis_SR_register (LPM4_bits | GIE);//输入 LPM4并带有中断

            __no_operation();                  //用于调试器

     

      }

    请帮我!!!

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

    我看不到您的终端。

    示波器说什么?

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

    Barkley 先生;

    感谢您的参与。

    A 和 B 两端有120欧姆的电阻器、但我没有在图片中展示。 这是正确的答案吗?

    示波器探针直接从 P5.0/UCA2TXD 进行测量。 波形是一致的。

    Sukho

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

    这是正确的答案。

    您是否从装置中获得任何差分信号?

    您能清楚地描述问题吗?

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

    首先、我建议您阅读1999年7月发行的 Circuit Cellar 中的"RS-485的艺术和科学"。 (Google 通常会显示副本。)

    其次、75176的使能输入将输出三态、这意味着当接收器被禁用时、UART 的 RX 输入悬空。 您必须使用上拉电阻器以确保可靠运行。

    第三、如上面的文章所示、端接不仅仅是一个120欧姆的电阻器。

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

    但是、120欧姆电阻器在第一次切断时应该可以正常工作、但它不会实现失效防护。

    至 OP:确保您正在正确驾驶*RE 和 DE。

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

    情况略有变化。 我以某种方式开始接收来自器件的信号。 我不知道发生了什么。 我发送"M"、"a"、"x"、"i"、"f"、 'l'、'o'、并在我的 PC TeraTerm 中接收它、但我必须在字符开头和字符之间插入长延迟。 否则、我只收到部分消息。

    我没有设置任何关于去/去的内容。

    但器件未接收到 PC 发送的任何内容。 似乎从未触发 ISR。

    这是完整的代码。

    #include

     

    int main (空)

      WDTCTL = WDTPW | WDTHOLD;              //停止看门狗

     

     //配置 GPIO

      P5SEL0 &=~(BIT0 | BIT1);

      P5SEL1 |= BIT0 | BIT1;                // USCI_A0 UART 操作

     

      //禁用 GPIO 上电默认高阻抗模式以激活

      //先前配置的端口设置

      PM5CTL0 &=~LOCKLPM5;

     

      //最大 DCO 设置~8MHz 的启动时钟系统

      CSCTL0_H = CSKKEY_H;                    //解锁 CS 寄存器

      CSCTL1 = DCOFSEL_3 | DCORSEL;          //将 DCO 设置为8MHz

      CSCTL2 = SELA_VLOCLK | SELESS__DCOCLK | SELM_DCOCLK;

      CSCTL3 = DIVA__1 | DIVM_1 | DIVM__1;  //设置所有分频器

      CSCTL0_H = 0;                          //锁定 CS 寄存器

     

      //将 USCI_A0配置为 UART 模式

      UCA2CTLW0 = UCSWRST;                  //将 eUSCI 置于复位状态

      UCA2CTLW0 |= UCSSEL_SMCLK;            // CLK = SMCLK

      //波特率计算

      // 800000000 /(16*9600)= 52.083

      //分数部分= 0.083

      //用户指南表24-4:UCBRSx = 0x04

      // UCBRFx = int ((52.083-52)*16)= 1.

      UCA2BRW = 52;                          // 8000000/16/9600

      UCA2MCTLW |= UCOS16 | UCBRF_1 | 0x4900;

      UCA2CTLW0 &=~UCSWRST;                //初始化 eUSCI

      UCA2IE |= UCRXIE;                      //启用 USCI_A0 RX 中断

     

      _DELAY_CYCLES (100000);

      _DELAY_CYCLES (100000);

      _DELAY_CYCLES (100000);

     

      UCA2TXBUF='M';

      _DELAY_CYCLES (100000);

      UCA2TXBUF='A';

      _DELAY_CYCLES (100000);

      UCA2TXBUF='x';

      _DELAY_CYCLES (100000);

      UCA2TXBUF='I';

      _DELAY_CYCLES (100000);

      UCA2TXBUF='F';

      _DELAY_CYCLES (100000);

      UCA2TXBUF='l';

      _DELAY_CYCLES (100000);

      UCA2TXBUF='o';

     

      _bis_SR_register (LPM3_bits + GIE);    //输入 LPM3、中断被启用

      __no_operation();                      //用于调试器

     

    #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)

    #pragma vector=EUSCI_A2_vector

    _interrupt void USCI_A2_ISR (void)

    #Elif defined (_GNU_)

    void __attribute__((中断(EUSCI_A2_vector)) USCI_A2_ISR (void)

    其他

    错误编译器不受支持!

    #endif

      switch (__evo_in_range (UCA2IV、USCI_UART_UCTXCPTIFG))

      {

          USCI_NONE 案例中断

          USCI_UART_UCRXIFG 案例

              while (!(UCA2IFG&UCTXIFG));

              UCA2TXBUF = UCA2RXBUF;

              __no_operation()

              中断;

          案例 USCI_UART_UCTXIFG:中断

          案例 USCI_UART_UCSTTIFG:中断

          案例 USCI_UART_UCTXCPTIFG:中断

          默认值:break

      }

    请告诉我如何从 PC 接收数据。 我不知道如何使用 P5REN 和 DE/RE。

    我下载了"RS-485的艺术和科学"、现在正在阅读。 但我认为我的技能不足以吸收其中的必要信息。 但我会一直读到它

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

    “我没有对这一点做任何调整,所以我不想说了。”

    这就是您无法接收的原因。  发送时,*DE/RE (连接在一起)必须为低电平才能激活发送器和禁用接收器。 接收时、必须将其设置为高电平才能激活接收器和禁用发送器。

    是否确实要在相同的数据线路上发送和接收? 我认为,运行2组 RS485是一个*好得多*的计划,一组用于传输,另一组用于接收,因此可以同时执行这两组操作。 现在、您必须协调谁在讲话和倾听、这样您就不会尝试让 MCU 和 PC 同时发送数据。

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

    你(们)好 Barkley 先生;

    就是这样。  

    TI 示例代码对*de/re 没有任何作用。 为什么他们会提供这样"无用的示例代码"? 对于像我这样的年轻球员来说,这是一个严重的陷阱。

    无论如何、我在传输前添加了该内容;

      P5DIR |=BIT2;

      P5OUT |=BIT2;

    发射后;

     P5OUT &=~BIT2;

    然后、在接收并回传至 PC 后;

      P5OUT |=BIT2;

    它现在正在工作。 谢谢你。

    但我现在看到另一个问题。  

    是的

    1.如果我不插入'__delay_cycles (20000);'的长延迟,则只接收部分字节,或者更糟糕的是根本不接收数据。 在这里、示例代码再次失败。

    2.最后一个字节未发送或似乎不存在。 例如

       如果我发送'M'、'A'、'x'、'I'、'F'、 'l'和'o'、我只接收"MaxiFl"。 最后一个字节"o"不会通过。

      如果 PC 仅发送一个字节、则器件会发出接收中断并执行 ISR (如打开/关闭 LED)。 但没有字节回传到 PC。

    请再给我一个帮助。 或者、您认为启动新问题线程更好吗?

    _DELAY_CYCLES (20000);

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

    TI 对*de/re 行不做任何操作的原因是该示例适用于 UART,而 TI 不知道连接了什么硬件。 大多数人不需要它、因为他们具有全双工。 我永远不需要它、因为我永远不会尝试通过相同的线路发送和接收。

    考虑到您共享用于 RX 和 TX 的422行、您无法真正回显字符、因为您不知道另一个字符是否出现在该行中。 您确实需要某种方式来仲裁 RS422总线。 通常、它是作为主器件/从器件完成的、只有当主器件要求它时、一个器件(从器件)才做出响应。

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

    根据定义、RS-485是半双工。 它是最广泛使用的工业标准。  

    我知道在这种网络中必须有主/从方案、对此我没有任何疑虑。

    但是"如果您共享用于 RX 和 TX 的422行、则无法真正回显字符、因为您不知道是否有另一个字符出现在该行中。" 未反映触发了"接收到的数据"中断的事实。 接收器部分接收到数据、只有在这之后才会产生中断。 至少这是我的理解方式。 我不是在和你争论。 我只是想了解您的陈述之间有哪些内容。

    我想延迟部分必须与波特率有关。 我将深入探究它。

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

    正确、您接收字符并获得中断、但您不能回显字符、除非您知道 PC 不会在您刚刚收到的字符之后发送另一个字符。