请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号:LP-MSP430FR2476 您好,
我一直在使用启动板连接到 I2C 设备,使用 TI 提供的修改版 I2C 库。
我发现,如果引脚1.0上的 LED 同时亮起,则端口1的引脚2和3上的 I2C 模块将无法工作。 我在主部件的不同部分打开它后,能够验证这一点。 您可以在此处查看相关部分
while(reg!=2) { i2c_master_read(0x41, 0xe0, ®, 1); } reg = 1; i2c_master_write(0x41, 0xe0, ®, 1); P1OUT = BIT0; while(reg != 65) { i2c_master_read(0x41, 0xe0, ®, 1); }
无论我在哪里说,该程序都会停止,因为 I2C 装置不再工作,并且保持在 LPM0中。
我是否缺少任何内容,或者 LED 和低功耗模式是否有某种关联? 如果 LED 亮起,则 I2C 工作所需的中断不会触发。
为此,您可以看到我正在使用的 i2c 库:
I2C_Mode i2c_master_read(uint8_t devAdd, uint8_t regAdd, uint8_t* readBuf, uint8_t count) { rxComplete = 0; /* Initialize state machine */ masterMode = TX_REG_ADDRESS_MODE; transmitRegAddr = regAdd; rxByteCtr = count; txByteCtr = 0; receiveIndex = 0; transmitIndex = 0; receiveBuffer = readBuf; /* Initialize slave address and interrupts */ UCB0I2CSA = devAdd; UCB0IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts UCB0IE &= ~UCRXIE; // Disable RX interrupt UCB0IE |= UCTXIE; // Enable TX interrupt UCB0CTLW0 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupts return 0; } I2C_Mode i2c_master_write(uint8_t devAdd, uint8_t regAdd, const uint8_t* regData, uint8_t count) { txComplete = 0; /* Initialize state machine */ masterMode = TX_REG_ADDRESS_MODE; transmitRegAddr = regAdd; //Copy register data to TransmitBuffer transmitBuffer = regData; txByteCtr = count; rxByteCtr = 0; receiveIndex = 0; transmitIndex = 0; /* Initialize slave address and interrupts */ UCB0I2CSA = devAdd; UCB0IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts UCB0IE &= ~UCRXIE; // Disable RX interrupt UCB0IE |= UCTXIE; // Enable TX interrupt UCB0CTLW0 |= UCTR + UCTXSTT; // I2C TX, start condition __bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupts return 0; }
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector = USCI_B0_VECTOR __interrupt void USCI_B0_ISR(void) #elif defined(__GNUC__) void __attribute__ ((interrupt(USCI_B0_VECTOR))) USCI_B0_ISR (void) #else #error Compiler not supported! #endif { //Must read from UCB0RXBUF uint8_t rx_val = 0; 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: // Vector 4: NACKIFG 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 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: // Vector 22: RXIFG0 rx_val = UCB0RXBUF; if (rxByteCtr) { receiveBuffer[receiveIndex++] = rx_val; rxByteCtr--; } if (rxByteCtr == 1) { UCB0CTLW0 |= UCTXSTP; } else if (rxByteCtr == 0) { UCB0IE &= ~UCRXIE; masterMode = IDLE_MODE; __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 P5OUT |= BIT1; P4OUT &= ~BIT7; // rxComplete = 1; } break; case USCI_I2C_UCTXIFG0: // Vector 24: TXIFG0 switch (masterMode) { case TX_REG_ADDRESS_MODE: UCB0TXBUF = transmitRegAddr; if (rxByteCtr) masterMode = SWITCH_TO_RX_MODE; // Need to start receiving now else masterMode = TX_DATA_MODE; // Continue to transmission with the data in Transmit Buffer break; case SWITCH_TO_RX_MODE: UCB0IE |= UCRXIE; // Enable RX interrupt UCB0IE &= ~UCTXIE; // Disable TX interrupt UCB0CTLW0 &= ~UCTR; // Switch to receiver masterMode = RX_DATA_MODE; // State state is to receive data UCB0CTLW0 |= UCTXSTT; // Send repeated start if (rxByteCtr == 1) { //Must send stop since this is the N-1 byte while((UCB0CTLW0 & UCTXSTT)); UCB0CTLW0 |= UCTXSTP; // Send stop condition } break; case TX_DATA_MODE: if (txByteCtr) { UCB0TXBUF = transmitBuffer[transmitIndex++]; txByteCtr--; } else { //Done with transmission UCB0CTLW0 |= UCTXSTP; // Send stop condition masterMode = IDLE_MODE; UCB0IE &= ~UCTXIE; // disable TX interrupt __bic_SR_register_on_exit(CPUOFF); // Exit LPM0 // txComplete = 1; } break; default: __no_operation(); break; } break; default: break; } }