请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP430FR2672 我正在使用定制板、我已经编写了一些 I2C 代码、查看了许多其他资源、它似乎与一切都相当匹配。 这是一个主器件、用于与从加速计连接。 在 SDA 和 SCL 线路上、我还有两个外部上拉电阻器、每条线路为10K。 当我执行该程序时、它看起来工作正常、因为所有正确的中断都会触发、并且我能够从总线读取一个值作为响应、但每次它都是0xFF。 此外、当我在这两行上放置一个示波器时、它们在整个时间内都处于高电平。 下面是我的代码。 请告诉我其中是否有任何明显的问题。 现在、代码重复尝试从位于0x29的寄存器中读取。 提前感谢!
#include <msp430.h> #include <stdint.h> #include <stdio.h> #include <stdbool.h> #define SLAVE_ADD 0b0011000 /** * main.c */ int value; volatile bool isWrite = false; volatile int stateCounter = 0; void init_i2c(){ P2DIR |= 0x80; P2OUT |= 0x80; //GPIO For LED P1SEL0 &= ~(BIT2 | BIT3); P1SEL1 &= ~(BIT2 | BIT3); P1DIR |= BIT3; P1OUT |= BIT3; //Free up SCL from slave P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; P1OUT |= BIT3; P1OUT &= ~BIT3; __delay_cycles(1000); UCB0CTLW0 |= UCSWRST; UCB0CTLW0 |= UCMODE_3 | UCMST | UCSYNC; UCB0BRW = 320; UCB0CTLW1 = UCASTP_2; UCB0TBCNT = 0x07; UCB0I2CSA = SLAVE_ADD; // I2C pins P1SEL0 |= BIT2 | BIT3; P1SEL1 &= ~(BIT2 | BIT3); UCB0CTLW0 &= ~UCSWRST; UCB0IE |= UCTXIE + UCRXIE + UCNACKIE; _enable_interrupts(); PM5CTL0 &= ~LOCKLPM5; } #pragma vector = USCI_B0_VECTOR __interrupt void USCI_B0_ISR(void){ int interruptValue = 0; switch(__even_in_range(UCB0IV, USCI_I2C_UCBIT9IFG)) { case USCI_NONE: interruptValue = 1; break; // Vector 0: No interrupts case USCI_I2C_UCALIFG: interruptValue = 2; break; // Vector 2: ALIFG case USCI_I2C_UCNACKIFG: // Vector 4: NACKIFG printf("UNACK"); fflush (stdout); break; case USCI_I2C_UCSTTIFG: interruptValue = 3; break; // Vector 6: STTIFG case USCI_I2C_UCSTPIFG: interruptValue = 4; break; // Vector 8: STPIFG case USCI_I2C_UCRXIFG3: interruptValue = 5; break; // Vector 10: RXIFG3 case USCI_I2C_UCTXIFG3: interruptValue = 6; break; // Vector 12: TXIFG3 case USCI_I2C_UCRXIFG2: interruptValue = 7; break; // Vector 14: RXIFG2 case USCI_I2C_UCTXIFG2: interruptValue = 8; break; // Vector 16: TXIFG2 case USCI_I2C_UCRXIFG1: interruptValue = 9; break; // Vector 18: RXIFG1 case USCI_I2C_UCTXIFG1: interruptValue = 10; break; // Vector 20: TXIFG1 case USCI_I2C_UCRXIFG0: // Vector 22: RXIFG0 value = UCB0RXBUF & 0xFF; printf("%x",value); fflush (stdout); UCB0CTLW0 |= UCTXSTP; __bic_SR_register_on_exit(CPUOFF); break; case USCI_I2C_UCTXIFG0: // Vector 24: TXIFG0 if(!isWrite){ UCB0TXBUF = 0x29; UCB0I2CSA = SLAVE_ADD; UCB0CTLW0 &= ~UCTR; UCB0CTLW0 |= UCTXSTT; while((UCB0CTLW0 & UCTXSTT)); UCB0CTLW0 |= UCTXSTP; printf("%x",value); fflush (stdout); }else{ if(stateCounter == 0){ UCB0TXBUF = 0x20; stateCounter++; }else if(stateCounter == 1){ UCB0TXBUF = 0x50; stateCounter++; }else{ UCB0CTLW0 |= UCTXSTP; stateCounter++; printf("HJKFSD"); fflush (stdout); __bic_SR_register_on_exit(CPUOFF); } } break; default: interruptValue = 11; break; } printf("%d:",interruptValue); fflush(stdout); } void initClockTo16MHz() { // Configure one FRAM waitstate as required by the device datasheet for MCLK // operation beyond 8MHz _before_ configuring the clock system. FRCTL0 = FRCTLPW | NWAITS_1; // Clock System Setup __bis_SR_register(SCG0); // disable FLL CSCTL3 |= SELREF__REFOCLK; // Set REFO as FLL reference source CSCTL0 = 0; // clear DCO and MOD registers CSCTL1 &= ~(DCORSEL_7); // Clear DCO frequency select bits first CSCTL1 |= DCORSEL_5; // Set DCO = 16MHz CSCTL2 = FLLD_0 + 487; // DCOCLKDIV = 16MHz __delay_cycles(3); __bic_SR_register(SCG0); // enable FLL while(CSCTL7 & (FLLUNLOCK0 | FLLUNLOCK1)); // FLL locked } int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer initClockTo16MHz(); init_i2c(); printf("Start"); puts("Start1"); putchar('c'); fflush (stdout); while ( UCB0STAT & UCBBUSY ) ; while(1){ __delay_cycles(1000000); UCB0I2CSA = SLAVE_ADD; UCB0IFG &= ~(UCTXIFG + UCRXIFG); /*UCB0CTLW0 |= UCTR; //Setting to transmitt mode UCB0CTLW0 |= UCTXSTT; //Reading and writing here are exact same isWrite = true; __bis_SR_register(LPM0_bits + GIE);*/ UCB0I2CSA = SLAVE_ADD; UCB0IFG &= ~(UCTXIFG + UCRXIFG); UCB0CTLW0 |= UCTR; //Setting to transmitt mode UCB0CTLW0 |= UCTXSTT; isWrite = false; stateCounter = 0; __bis_SR_register(LPM0_bits + GIE); } return 0; }