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-EXP430FR5994:MSP-EXP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/690482/msp-exp430fr5994-msp-exp430fr5994

器件型号:MSP-EXP430FR5994
主题中讨论的其他器件:MSP430FR5994MSP430WARE

亲爱的社区、您好!

我正在尝试管理 MSP430FR5994和来自 Analog Devices 的 ADE7878电能计量 IC 之间的 SPI 通信。 在 LaunchPad 上测试代码时一切都正常。 我将 SIMO 和 SOMI 线连接在一起、可以在逻辑分析仪上看到我发送的数据、并将接收到的数据存储到我的变量中。 当我连接 IC 时、问题就开始了。 我能够写入寄存器、我可以在逻辑分析仪上看到正确的数据、并在评估板上测量更改。 当我尝试执行读取操作时、我可以看到 IC 在 SOMI 线上返回正确的数据。  我的问题是、我从 UCB1RXBUF 读取错误的数据、它几乎总是0xFF。 有时、当我读取1字节寄存器时、我会收到正确的值。 如果有人能告诉我如何处理此问题、我将非常感激。

提前感谢!

伊利亚


   #include
   #include

   #define 虚拟                0x00
   #define CONFIG2             0xEC01
   #define STATUS1             0xE503
   #define run                     0xE228
   #define LAST_OP             0xE7FD
   #define LAST_ADDR          0xE6FE
   #define LAST_RWDATA_8  0xE7FC
   #define LAST_RWDATA_16 0xE6FF
   #define LAST_RWDATA_32 0xE5FF
   #define PGA                    0xE60F
   #define COMPMODE          0xE60E
   #define WTHR1                0x43AB
   #define WTHR0                0x43AA
   #define VLEVEL                0x43B3
   #define iARMS_LRIP         0xE531
   #define VARMS_LRIP         0xE531

   void send (unsigned int addr、char nr_Bytes、unsigned long TX_data);
   unsigned volatile char byte1、byte2、byte3、byte4;

   空读取(unsigned int addr、char nr_Bytes);
   volatile unsigned char rx1、rx2、rx3、RX4;

   unsigned char SPI_8 (unsigned char TXdata);
   unsigned volatile char TXdata;
   unsigned volatile char RXdata;

   void SPI_enable (void);
   void SPI_disable (void);

   void init (void);

   volatile int counter1=0;
   volatile int counter2 = 0;

   int main (空)
   {


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


   P5SEL1 &=~Ω(BIT0 | BIT1 | BIT2);                 // USCI_B1 SCLK、MOSI 和 MISO 引脚
   P5SEL0 |=(BIT0 | BIT1 | BIT2);                  // USCI_B1 SCLK、MOSI 和 MISO 引脚
   P6DIR |= BIT3;                                          // P6.3输出 CSn

   P3DIR &= ~BIT7;                                    // CF3_HSCLK_EXT
   P3DIR &= ~BIT6;                                    // cf2_HREADY_EXT
   P3DIR &= ~BIT4;                                    // cf1_EXT
   P4DIR |=  BIT1;                                       // P4.1 PM0
   P4DIR |=  BIT2;                                      // P4.2 PM1
   P4OUT |=  BIT1;                                      // P4.1 PM0高电平
   P4OUT &= ~BIT2;                                   // P4.2 PM1低电平
   P4DIR &= ~BIT3;                                    // P4.3 IRQ0B
   P2DIR &= ~BIT4;                                         // P2.5 IRQ1B
   P8DIR |=  BIT3;                                      // P8.3 RESB_CTRL 未售出

   PM5CTL0 &=~LOCKLPM5;                        //禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置


   UCB1CTLW0 = UCSWRST;                                          //**将状态机置于重置中**
   UCB1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;     //主器件|同步模式|非活动状态-高电平| MSB 在前
   UCB1CTLW0 &=~UCCKPH;                                         //数据在第一个 UCLK 上发生变化,在以下???

   UCB1CTLW0 |= UCSSEL_ACLK;                                 // ACLK
   UCB1BRW = 0x04;                                                    ///2
   //UCB1MCTLW = 0;                                                    //无调制
   UCB1CTLW0 &=~UCSWRST;                                       //**初始化 USCI 状态机**
   UCB1IE |= UCRXIE;                                                   //启用接收中断
   UCB1IE |= UCTXIE;                                                   //启用发送中断
  

 // //

   init();

   读(status1、   4);     
   读取(COMPMODE,2);   
   读取(运行、          2);
   读取(WHR1、      4);
   读取(WTHR0、       4);
   读取(PGA、           2);
   读取(VLEVEL、      4);


unsigned char SPI_8 (unsigned char TXdata)

   while (UCB1STATW 和 UCBUSY);       
   UCB1TXBUF = TXDATA;

   while (UCB1STATW 和 UCBUSY);       
   RXDATA = UCB1RXBUF;
   返回(RXDATA);


void send (unsigned int addr、char nr_Bytes、unsigned long TX_data)

   unsigned char reg1、reg2;
   reg1 =(addr >> 8)&0xFF;
   reg2 = addr & 0xFF;

   switch (nr_Bytes)
   {
       案例1:
       字节1 = TX_DATA & 0xFF;


       SPI_ENABLE();
       SPI_8 (0x00);
       SPI_8 (reg1);
       SPI_8 (reg2);
       SPI_8 (字节1);
       spi_disable();

       中断;

       案例2:
       字节1 =(TX_DATA >> 8)&0xFF;
       字节2 = TX_DATA & 0xFF;
       SPI_ENABLE();
       SPI_8 (0x00);
       SPI_8 (reg1);
       SPI_8 (reg2);
       SPI_8 (字节1);
       SPI_8 (字节2);
       spi_disable();
       中断;

       案例3:
       字节1 =(TX_DATA >> 16)&0xFF;
       字节2 =(TX_DATA >> 8)&0xFF;
       字节3 = TX_DATA & 0xFF;
       SPI_ENABLE();
       SPI_8 (0x00);
       SPI_8 (reg1);
       SPI_8 (reg2);
       SPI_8 (字节1);
       SPI_8 (字节2);
       SPI_8 (字节3);
       spi_disable();
       中断;

       案例4:
       字节1 =(TX_DATA >> 24)&0xFF;
       字节2 =(TX_DATA >> 16)&0xFF;
       字节3 =(TX_DATA >> 8)&0xFF;
       字节4 = TX_DATA & 0xFF;
       SPI_ENABLE();
       SPI_8 (0x00);
       SPI_8 (reg1);
       SPI_8 (reg2);
       SPI_8 (字节1);
       SPI_8 (字节2);
       SPI_8 (字节3);
       SPI_8 (字节4);
       spi_disable();
       中断;

       默认值:
       中断;
   }


空读取(unsigned int addr、char nr_Bytes)

   unsigned char reg1、reg2;
   reg1 =(addr >> 8)&0xFF;
   reg2 = addr & 0xFF;

   switch (nr_Bytes)
   {
       案例1:
       SPI_ENABLE();
       SPI_8 (0x01);
       SPI_8 (reg1);
       SPI_8 (reg2);
       Rx1 = SPI_8 (虚拟);
       spi_disable();
       中断;

       案例2:
       SPI_ENABLE();
       SPI_8 (0x01);
       SPI_8 (reg1);
       SPI_8 (reg2);
       Rx1 = SPI_8 (虚拟);
       rx2 = SPI_8 (虚拟);
       spi_disable();
       中断;

       案例3:
       SPI_ENABLE();
       SPI_8 (0x01);
       SPI_8 (reg1);
       SPI_8 (reg2);
       Rx1 = SPI_8 (虚拟);
       rx2 = SPI_8 (虚拟);
       rx3 = SPI_8 (虚拟);
       spi_disable();
       中断;

       案例4:
       SPI_ENABLE();
       SPI_8 (0x01);
       SPI_8 (reg1);
       SPI_8 (reg2);
       Rx1 = SPI_8 (虚拟);
       rx2 = SPI_8 (虚拟);
       rx3 = SPI_8 (虚拟);
       RX4 = SPI_8 (虚拟);
       spi_disable();
       中断;

       默认值:
       中断;
   }



void SPI_enable (void)

   P6OUT &=~BIT3;


void SPI_disable (void)

   P6OUT |= BIT3;


空 init (空)

   SPI_ENABLE();        
   spi_disable();
   SPI_ENABLE();
   spi_disable();
   SPI_ENABLE();
   spi_disable();

   for (counter1 = 0;counter1 < 10;counter1 ++)
   {
       SEND (CONFIG2、1、0x00000000);
   }

   SEND (STATUS1、   4、0x00208000);  
   SEND (COMPMODE、2、0x000000FF);    
   发送(运行、          2、0x00000001);
   发送(WHR1、      4、0x00000001);
   发送(WTHR0、       4、0x00FF6A6B);
   发送(PGA、          2、0x00000000);
   发送(VLEVEL、     4、0x000A9B4A);






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

    如果我理解您的描述、一切都可以与 LaunchPad 配合使用、但当您将 LaunchPad 连接到 ADE7858时、您无法读取正确的数据? 当您未连接到 ADE7858时、如何读取正确的数据? 您从什么读取数据?

    这听起来像是时钟相位的问题。
    您是否尝试过 UCB1CTLW0 |=UCCKPH;?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dennis、您好、非常感谢您的留言!

    我的 LaunchPad 连接到 ADE7878评估板、我的逻辑分析仪并联、 因此我可以看到我从 MSP 发送的数据以及 ADE7878的响应。 感谢您提供有关时钟相位的提示、我再次检查了它、我认为它是正确的。 以下是数据表中的一个较短的输出:

    "当主器件将 SS 引脚设置为低电平时、使用 SPI 接口启动读取操作...主器件在 MOSI 线路上发送数据、从 SCLK 的第一个高电平到低电平转换开始。 ADE7878A 的 SPI 在 SCLK 的低电平到高电平转换时对数据进行采样...ADE78A 在 SCLK 的低电平到高电平转换时接收到寄存器地址的最后一位之后、 当下一个 SCLK 高电平到低电平转换发生时、它开始在 MISO 线路上发送寄存器内容;主器件在 SCLK 低电平到高电平转换时对数据进行采样。 在主器件接收到最后一位后、它将 SS 和 SCLK 线路设置为高电平、通信结束。

    我在逻辑分析仪上看到、能量计响应正确、例如、我对表示测量的 RMS 电压的32位寄存器执行读取操作、如果我转换获得的十六进制值、我将获得我施加在 ADE7878上的电压(8.3V)。 下面是逻辑分析仪的屏幕截图:

    这就是我在变量范围内得到的结果:

    我读取的不是0x00 / 0x01 / 0x89 / 0x99 (这是我在逻辑分析仪中看到的)、而是0x00 / 0x01 / 0xFF / 0xFF。  我认为我的代码中有一些错误。 由于写入部分正常工作、我假设读取函数不正确。 我的想法是创建一个发送一个字节的函数 SPI_8、在下一步中、它将 RX 缓冲器的值保存在 RXDATA 变量中。 然后、我将该值保存在全局变量 rx1...RX4中。 我尝试过通过 ISR 执行读取操作、但由于我不熟悉嵌入式编程、因此无法使其正常工作。 如果你能仔细看一下,如果有问题的话,我会非常感谢。 非常感谢您的支持、祝您度过愉快的周末! (P.S.我将能在星期二首次回复)

    以下是我的代码的主要部分:

    #include
    #define CONFIG2 0xEC01
    #define 虚拟    0x00

       空读取(unsigned int addr、char nr_Bytes);
       用于                   存储 RX 缓冲区值的易失性无符号字符 rx1、rx2、rx3、RX4;//全局变量

       unsigned char SPI_8 (unsigned char TXdata);
       unsigned volatile char TXdata;                                 //Transmited 字节
       unsigned volatile char RXdata;                                //received    byte

       void SPI_enable (void);
       void SPI_disable (void);


       int main (空)
       {

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


       P5SEL1 &=~Ω(BIT0 | BIT1 | BIT2);                                               // USCI_B1 SCLK、MOSI 和 MISO 引脚
       P5SEL0 |=(BIT0 | BIT1 | BIT2);                                                   // USCI_B1 SCLK、MOSI 和 MISO 引脚
       P6DIR |= BIT3;                                                                              // P6.3输出 CSn

       PM5CTL0 &=~LOCKLPM5;                                                        //禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置
      
       UCB1CTLW0 = UCSWRST;                                                        //**将状态机置于复位状态**
       UCB1CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;     //主器件|同步模式|非活动状态-高电平| MSB 在前
       UCB1CTLW0 &=~UCCKPH;                                                     //数据在第一个 UCLK 上发生变化,在以下情况下捕获

       UCB1CTLW0 |= UCSSEL_ACLK;                                            // ACLK
       UCB1BRW = 0x02;                                                                       ///2
       UCB1CTLW0 &=~UCSWRST;                                                   //**初始化 USCI 状态机**
       UCB1IE |= UCRXIE;                                                                      //启用接收中断
       UCB1IE |= UCTXIE;                                                                       //启用发送中断

    while (1);

    读取(CONFIG2、1)




    void SPI_enable (void)

       P6OUT &=~BIT3;


    void SPI_disable (void)

       P6OUT |= BIT3;


    unsigned char SPI_8 (unsigned char TXdata)

       while (UCB1STATW 和 UCBUSY);           
       UCB1TXBUF = TXDATA;
      
       while (UCB1STATW 和 UCBUSY);         
       RXDATA = UCB1RXBUF;
       返回(RXDATA);

    空读取(unsigned int addr、char nr_Bytes)

       unsigned char reg1、reg2;
       reg1 =(addr >> 8)&0xFF;
       reg2 = addr & 0xFF;

       switch (nr_Bytes)
       {
           案例1:
           SPI_ENABLE();
           SPI_8 (0x01);
           SPI_8 (reg1);
           SPI_8 (reg2);
           Rx1 = SPI_8 (虚拟);
           spi_disable();
           中断;

           案例2:
           SPI_ENABLE();
           SPI_8 (0x01);
           SPI_8 (reg1);
           SPI_8 (reg2);
           Rx1 = SPI_8 (虚拟);
           rx2 = SPI_8 (虚拟);
           spi_disable();
           中断;

           案例3:
           SPI_ENABLE();
           SPI_8 (0x01);
           SPI_8 (reg1);
           SPI_8 (reg2);
           Rx1 = SPI_8 (虚拟);
           rx2 = SPI_8 (虚拟);
           rx3 = SPI_8 (虚拟);
           spi_disable();
           中断;

           案例4:
           SPI_ENABLE();
           SPI_8 (0x01);
           SPI_8 (reg1);
           SPI_8 (reg2);
           Rx1 = SPI_8 (虚拟);
           rx2 = SPI_8 (虚拟);
           rx3 = SPI_8 (虚拟);
           RX4 = SPI_8 (虚拟);
           spi_disable();
           中断;

           默认值:
           中断;
       }

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

    您好 Iliya、

    我复制了您的代码并对 MSP430FR5994 Launchpad 进行了编程。

    我在主循环中修改了几行:

      while (1)

      {

        读取(CONFIG2、4);

        _delay_cycles (1000);

      }

    主器件写入3个字节(0x01和 Addrs 0xE5E1)、后跟4个虚拟字节。

    然后、我使用 SPI 从设备代码对第二个 MSP430FR5994 Launchpad 进行了编程、该从设备代码始终以7个字节{0x00、0x01、0x02、0x03、0x04 0x05、0x06}(每个接收到的字节一个)。

    下面是我在 SPI 引脚上看到的内容:

    然后、我检查了您的代码中接收到的4个字节、并显示它正确捕获了这些字节。

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

    您好 Dennis、

    非常感谢您花时间帮助我!

    我现在不能弄清楚问题的原因。 我知道我可以向 IC 发送数据、我正在读取逻辑分析仪上 MSP SOMI 引脚上 IC 的正确响应。 出于某种原因、我仍然无法将来自 RX 缓冲区的数据存储到变量中。 基于中断的解决方案可能会更好? 我正在尝试从 msp430ware 修改示例代码、但现在没有成功。 请告诉我我我出了什么问题吗? 我正在尝试发送4个字节、并在转换结束时读取 RX 缓冲区。 非常感谢、感谢您的帮助!

    伊利亚

       #include
       volatile unsigned char RXData = 0;
       volatile unsigned char TXData;
       void SPI_8 (unsigned char TXData);
       volatile unsigned char rx1;
       int main (空)
       {

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


       P5SEL1 &=~(BIT0 | BIT1 | BIT2);                  // USCI_B1 SCLK、MOSI 和 MISO 引脚
       P5SEL0 |=(BIT0 | BIT1 | BIT2);                     // USCI_B1 SCLK、MOSI 和 MISO 引脚
       P6DIR |= BIT3;                                          // P6.3输出 CSn
       PM5CTL0 &=~LOCKLPM5;                           //禁用 GPIO 上电默认高阻抗模式以激活先前配置的端口设置

       UCB0CTLW0 = UCSWRST;                                          //**将状态机置于重置中**
       UCB0CTLW0 |= UCMST | UCSYNC | UCCKPL | UCMSB;     //主器件|同步模式|非活动状态-高电平| MSB 在前
       UCB0CTLW0 &=~UCCKPH;                                         //数据在第一个 UCLK 上发生变化,在以下???

       UCB0CTLW0 |= UCSSEL_ACLK;                                 // ACLK
       UCB0BRW = 0x02;                                                    ///2
       UCB0CTLW0 &=~UCSWRST;                                      //**初始化 USCI 状态机**

       UCB0IE |= UCTXIE;
       _bis_SR_register (GIE);

       while (1)
       {
           UCB1IE |= UCTXIE;
           TXData = 0x01;
           TXData = 0xEC;
           TXData = 0x01;
           TXData = 0x00;
           Rx1 = RXData;
       }
       }



    #pragma vector=EUSCI_B1_Vector
    _interrupt void USCI_B1_ISR (void)

       开关(__evo_in_range (UCB1IV、USCI_SPI_UCTXIFG))
       {
           USCI_NONE 案例:中断;

           USCI_SPI_UCRXIFG 案例:
               RXData = UCB1RXBUF;
               UCB1IFG &=~UCRXIFG;
               中断;

           USCI_SPI_UCTXIFG 案例:
               UCB1TXBUF = TXData;
               UCB1IE &=~UCTXIE;
               中断;
           默认值:break;
       }
    }   

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

    在使用中断尝试执行此操作之前、让我们尝试一个"回送"设置:

    使来自 MSP430的 SOMI 和 MISO 引脚短路。

    修改 switch 语句中的代码、以便向外发送4个有效载荷字节0x01、0x02、0x03、0x04。
    案例4:
    SPI_ENABLE();
    SPI_8 (0x01);
    SPI_8 (reg1);
    SPI_8 (reg2);
    Rx1 = SPI_8 (0x01);
    Rx2 = SPI_8 (0x02);
    rx3 = SPI_8 (0x03);
    RX4 = SPI_8 (0x04);
    spi_disable();
    中断;

    在调用后设置断点(可以使用_no_operation()来设置断点)
    读取(CONFIG2、4);
    _no_operation();

    调用后、检查 rx1、rx2、rx3、RX4。 您应该会看到您传输的值。
    我试过这个、它对我来说很有用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dennis!

    感谢您的回复! 我以前试过它、它也能为我工作。 这就是为什么我想知道为什么我无法从 IC 读取数据、但我可以在 MOSI 和 MISO 短接的情况下接收数据。 来自 IC 的数据在示波器上看起来非常好-无噪声、良好的时序、良好的电压电平。

    此致

    伊利亚

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

    数据的上升/下降时间可能会受到 MSP 和传感器之间连接的额外电容的影响。 当您将 SOMI 和 SIMO 连在一起时、线条非常短。 逻辑分析仪可以对数据进行解码、因为它的输入阈值可能与 MSP430不同。 尝试将时钟速率降低一个系数或2或4、看看这是否会产生差异。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dennis、

    我已将 MISO 引脚直接连接到 IC 输出、并尝试了1到32形式的不同 ACLK 分频器。 如果 MSP 仅为0x00、则会正确读取数据、有时它会正确读取与0x00不同的第二个字节。 在任何情况下、最后2个字节始终为0xFF。

    此致

    伊利亚

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

    您好 Dennis、

    我在 Arduino 中编写了相同的程序、在相同的设置下工作正常、因此我假设我的代码出现了问题。  

    此致

    伊利亚

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

    好的。 我很好奇、为什么我能够让您的代码在我的 LaunchPad 上运行。

    您是否仍然需要帮助才能在 MSP430FR5994平台上进行此工作、或者您是否要继续?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dennis、

    我也很好奇。 当我在 launchpad 上测试我的代码时、它可以正常工作(当我将 MOSI 和 MISO 短接时)、但一旦我将电路板连接到 IC、我就会遇到问题。 我已经成功地根据 ISR 编写了一个新代码。 再说一次、我能够发送数据、我从 ADE7878获得响应、我无法存储这些值。

    我需要帮助才能使其在此平台上工作、Arduino 只是快速检查其是否正常工作的一个可能性。 我只需要能够发送和接收一个字节的程序。

    此致

    伊利亚

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

    您好 Dennis、

    我发现了问题、这不是由于代码造成的。 计量 IC 与 MSP 进行电隔离、如果我将微控制器直接连接到 IC、一切工作正常。 现在、我尝试了解这种行为的原因。 你有什么想法吗? 非常感谢您的帮助!

    此致

    伊利亚

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

    电隔离是通过什么方式提供的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dennis、

    隔离由提供:

    4x -模拟器件/ADuM3401CRWZ

    1x -模拟器件/ADuM1250ARZ

    它们将所有微控制器 IO 与 ADE7878分离

    此致

    伊利亚

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

    我查看了模拟器件数据表、查找了一些电气规格违规(上升/下降、传播时间、时钟速率等)、但没有看到任何明显的情况。 真正令人困惑的是、您的逻辑探头捕获可在 I2C 总线上显示正确的数据(我假设在隔离器的 MSP430侧捕获)。 如果您有示波器、那么您可能尝试的唯一 是对 MSP430侧的 SDA 和 SCL 线路进行示波、并仔细观察 SCL 的上升和下降、观察来自隔离器的 SDA 数据是否稳定、I2C 读取该位的边沿上的逻辑电平是否正确。 我这样说是因为当检测到"1"或"0"时、逻辑探头可能会由于其阈值而使该数据时序发生偏斜。

    除此之外、我不知道要告诉您什么。 也许社区中的其他人可以提供一些建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Dennis、  

    感谢您的帮助和您为此花费的时间。 我将尝试将隔离器更换为不同的隔离器、看看它是否会进行任何更改。

    此致  

    伊利亚