请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 代码;