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.

[参考译文] MSP430FR2355:I2C 通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1305692/msp430fr2355-i2c-communication

器件型号:MSP430FR2355
主题中讨论的其他器件: USB2ANY

大家好、

我 使用 I2C 通信将 MSP430FR2355作为服务器与 PC 作为主设备进行通信。

使用 Resource Explorer 中的示例程序进行 I2C 通信、当我使用 USB2ANY 与 MSP430进行通信以写入和读取数据(P1.2/P1.3、从器件地址0x48)时、使用 msp430fr235x_eusci_i2c_standard_slave.c。 它始终显示"写入超时"。  还添加了用于 SDA 和 SCL 的4.7k Ω 上拉电阻器。

提前感谢您的帮助。

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

    您好、Yibo、

    您是否有示波器或逻辑探头来捕获 I2C 信号?

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

    您好、Dennis、

    如所附。

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

    谢谢 Yibo、

    好的、观察这些波形、我看到 MSP 已确认或确认(第9个时钟脉冲上的 SDA 为低电平) USB2ANY。  这说明 MSP430正确响应从 USB ANY 发送的数据。  

    不确定在本例中为什么存在超时。  让我来试一下 USB2ANY。

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

    谢谢 Dennis、顺便说一下、在地址0x48 和寄存器0x00之后、根据 USB2ANY 的数据应该为0x02、但根据波形、它为0x01? 它也使我感到困惑。

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

    您好、Yibo、

    否、波形正确。  请参阅下面的注释图。 您可以看到从器件在接收到每个字节后都有/NACK (确认)。

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

    您好、Dennis、

    USB2ANY:USB2ANY 接口适配器-放大器论坛-放大器- TI E2E 支持论坛

    我通过上述论坛修改了程序、从而 添加了一些代码(启用 RX 中断并读取 RXBUF 数据)。 并且写入超时问题似乎得到了解决。

    新问题是... 当我读取数据时、该值与我写入寄存器的值不同。

    以下是我修改后的代码和 USB2ANY 的结果、

    #include <msp430.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <driverlib.h>
    
    volatile unsigned char TXData;
    volatile unsigned char RXData;
    
    
    #define REGISTER_0_ADDRESS 0x00 // Replace with your chosen address
    #define REGISTER_1_ADDRESS 0x01 // Replace with another address
    
    // Define variables to store received values
    double A = 0.0;
    double B = 0.0;
    int i;
    
    uint8_t receivedbyte;
    
    
    int main(void)
    {
        WDTCTL = WDTPW | WDTHOLD;
    
        // Configure GPIO
        P1SEL0 |= BIT2 | BIT3;
        P1SEL1 &= ~(BIT2 | BIT3);
    
        // Disable the GPIO power-o9n default high-impedance mode to activate
        // previously configured port settings
        PM5CTL0 &= ~LOCKLPM5;
    
    
        // Configure USCI_B2 for I2C mode
        UCB0CTLW0 = UCSWRST;                    // Software reset enabled
        UCB0CTLW0 |= UCMODE_3 | UCSYNC;         // I2C mode, sync mode
        UCB0I2COA0 = 0x48 | UCOAEN;             // own address is 0x48 + enable
        UCB0CTLW0 &= ~UCSWRST;                  // clear reset register
        UCB0IE |= UCRXIE0 | UCTXIE0 | UCSTPIE;            // transmit,stop interrupt enable
    
        __bis_SR_register(LPM0_bits | GIE);     // Enter LPM0 w/ interrupts
        __no_operation();
    
        while (1) {
            PMM_unlockLPM5();
            // Toggle P1.0 output
    
            if(A==5){ //green
                P1OUT &= ~BIT0;                         // Clear P1.0 output latch for a defined power-on state
                P1DIR |= BIT0;                          // Set P1.0 to output direction
                P1OUT |= BIT0;
            }
            if(B==7){ //red
                P6OUT &= ~BIT6;                         // Clear P1.0 output latch for a defined power-on state
                P6DIR |= BIT6;                          // Set P1.0 to output direction
                P6OUT |= BIT6;
            }
            for(i=10000; i>0; i--);
            // Your application logic here
            // Process the received value (e.g., update LEDs, perform actions, etc.)
        }
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector = EUSCI_B0_VECTOR
    __interrupt void USCI_B0_ISR(void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(EUSCI_B0_VECTOR))) USCI_B0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
        switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
        {
            case USCI_NONE:          break;     // Vector 0: No interrupts
            case USCI_I2C_UCALIFG:   break;     // Vector 2: ALIFG
            case USCI_I2C_UCNACKIFG: break;     // Vector 4: NACKIFG
            case USCI_I2C_UCSTTIFG:  break;     // Vector 6: STTIFG
            case USCI_I2C_UCSTPIFG:             // Vector 8: STPIFG
                TXData = 0;
                UCB0IFG &= ~UCSTPIFG;           // Clear stop condition int flag
                break;
            case USCI_I2C_UCRXIFG3:  break;     // Vector 10: RXIFG3
            case USCI_I2C_UCTXIFG3:  break;     // Vector 12: TXIFG3
            case USCI_I2C_UCRXIFG2:  break;     // Vector 14: RXIFG2
            case USCI_I2C_UCTXIFG2:  break;     // Vector 16: TXIFG2
            case USCI_I2C_UCRXIFG1:  break;     // Vector 18: RXIFG1
            case USCI_I2C_UCTXIFG1:  break;     // Vector 20: TXIFG1
            case USCI_I2C_UCRXIFG0:
                RXData = UCB0RXBUF;
                if (RXData == REGISTER_0_ADDRESS) {
                    // Combine the received byte into A
                    uint64_t temp_A = *(uint64_t*)&A;
                    temp_A = (temp_A << 8) | receivedbyte;
                    A = *(double*)&temp_A;
    //                receiving_A = 0; // Switch to receiving B next
                }
                else if (RXData == REGISTER_1_ADDRESS) {
                                // Combine the received byte into B
                                uint64_t temp_B = *(uint64_t*)&B;
                                temp_B = (temp_B << 8) | receivedbyte;
                                B = *(double*)&temp_B;
                //                receiving_A = 1; // Switch back to receiving A
                }
                break;     // Vector 22: RXIFG0
            case USCI_I2C_UCTXIFG0:             // Vector 24: TXIFG0
                UCB0TXBUF = TXData++;
                break;
            case USCI_I2C_UCBCNTIFG: break;     // Vector 26: BCNTIFG
            case USCI_I2C_UCCLTOIFG: break;     // Vector 28: clock low timeout
            case USCI_I2C_UCBIT9IFG: break;     // Vector 30: 9th bit
            default: break;
        }
    }
    

    提前感谢您的帮助。

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

    您好、Yibo、

    很抱歉耽误您的时间...您还需要有关新问题的帮助吗?