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.

[参考译文] MSP430FR2475:I2C Tx 工作、但 Rx 不工作

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1054394/msp430fr2475-i2c-tx-working-but-rx-is-not-working

器件型号:MSP430FR2475

大家好、我们正在 TI evo 官方开发板(LP-MSP430FR2476)上开发器件固件、并将 Code Composer Studio 用作 IDE。

我们连接了 TI evo 电路板(I2C 主设备)和 Arduino (I2S 从设备)

我们成功地传输了数据、但 无法读取。 MSP430是主设备、它会请求数据。 Arduino 应该发送 hello 5次、世界再发送5次。 问题在于 Arduino 仅发送 hello 或 world、并且仍处于该状态。 我认为 Arduino 代码没有问题、但 MSP 上的 Rx 仅显示相同的数据。 它卡住了一点。

请参阅以下 MSP430FR 代码;

 

#include <msp430.h>

char RXData[5];

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;

    // Configure GPIO
    P1OUT &= ~BIT0;                         // Clear P1.0 output latch
    P1DIR |= BIT0;                          // For LED
    P1SEL0 |= BIT2 | BIT3;                  // I2C pins

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

    // Configure USCI_B0 for I2C mode
    UCB0CTLW0 |= UCSWRST;                   // Software reset enabled
    UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC; // I2C mode, Master mode, sync

                                            // after UCB0TBCNT is reached
    UCB0BRW = 0x0080;                       // baudrate = SMCLK / 8

    UCB0I2CSA = 0x04;                     // Slave address
    UCB0CTL1 &= ~UCSWRST;
    UCB0IE |= UCRXIE | UCNACKIE | UCBCNTIE;

    while (1)
    {
        __delay_cycles(200000);
        while (UCB0CTL1 & UCTXSTP);         // Ensure stop condition got sent
        UCB0CTL1 |= UCTXSTT;                // I2C start condition

        __bis_SR_register(GIE);   // Enter LPM0 w/ interrupt
    }
}


#pragma vector = USCI_B0_VECTOR
__interrupt void USCIB0_ISR(void)

{
  switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG))
  {
      static int i = 0;

    case USCI_NONE: break;                  // Vector 0: No interrupts
    case USCI_I2C_UCALIFG: break;           // Vector 2: ALIFG
    case USCI_I2C_UCNACKIFG:                // Vector 4: NACKIFG
      UCB0CTL1 |= UCTXSTT;                  // I2C start condition
      break;
    case USCI_I2C_UCSTTIFG: break;          // Vector 6: STTIFG
    case USCI_I2C_UCSTPIFG: break;          // Vector 8: STPIFG
    case USCI_I2C_UCRXIFG3: break;          // Vector 10: RXIFG3
    case USCI_I2C_UCTXIFG3: break;          // Vector 14: TXIFG3
    case USCI_I2C_UCRXIFG2: break;          // Vector 16: RXIFG2
    case USCI_I2C_UCTXIFG2: break;          // Vector 18: TXIFG2
    case USCI_I2C_UCRXIFG1: break;          // Vector 20: RXIFG1
    case USCI_I2C_UCTXIFG1: break;          // Vector 22: TXIFG1
    case USCI_I2C_UCRXIFG0:                 // Vector 24: RXIFG0
      RXData[i] = UCB0RXBUF;                   // Get RX data, add break point
      i++;

      break;
    case USCI_I2C_UCTXIFG0: break;          // Vector 26: TXIFG0
    case USCI_I2C_UCBCNTIFG:                // Vector 28: BCNTIFG
      P1OUT ^= BIT0;                        // Toggle LED on P1.0
      break;
    case USCI_I2C_UCCLTOIFG: break;         // Vector 30: clock low timeout
    case USCI_I2C_UCBIT9IFG: break;         // Vector 32: 9th bit
    default: break;

    if(i==5){
        //UCB0TBCNT = 0x0005;                     // number of bytes to be received
        UCB0CTLW0 |= UCTXSTP;
        i = 0;
    }

  }
}

 

请参阅下面的 Arduino 代码;

e2e.ti.com/.../Arduno-code.txt