代码如下,不知道为什么开的是RX中断,却用TX中断向量接受,我下到片子里,发现连时钟都没有输出,我用的G2553的LaunchPad
- //******************************************************************************
- // MSP430G2xx3 Demo - USCI_B0 I2C Master RX multiple bytes from MSP430 Slave
- //
- // Description: This demo connects two MSP430's via the I2C bus. The slave
- // transmits to the master. This is the master code. It continuously
- // receives an array of data and demonstrates how to implement an I2C
- // master receiver receiving multiple bytes using the USCI_B0 TX interrupt.
- // ACLK = n/a, MCLK = SMCLK = BRCLK = default DCO = ~1.2MHz
- //
- // *** to be used with "msp430g2xx3_uscib0_i2c_11.c" ***
- //
- // /| /|
- // MSP430G2xx3 10k 10k MSP430G2xx3
- // slave | | master
- // ----------------- | | -----------------
- // -|XIN P3.1/UCB0SDA|<-|---+->|P3.1/UCB0SDA XIN|-
- // | | | | |
- // -|XOUT | | | XOUT|-
- // | P3.2/UCB0SCL|<-+----->|P3.2/UCB0SCL |
- // | | | |
- //
- // D. Dang
- // Texas Instruments Inc.
- // February 2011
- // Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10
- //******************************************************************************
- #include
- unsigned char *PRxData; // Pointer to RX data
- unsigned char RXByteCtr;
- volatile unsigned char RxBuffer[128]; // Allocate 128 byte of RAM
- int main(void)
- {
- WDTCTL = WDTPW + WDTHOLD; // Stop WDT
- P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
- UCB0CTL1 |= UCSWRST; // Enable SW reset
- UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
- UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
- UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
- UCB0BR1 = 0;
- UCB0I2CSA = 0x02; // Slave Address is 048h
- UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
- IE2 |= UCB0RXIE; // Enable RX interrupt
- while (1)
- {
- PRxData = (unsigned char *)RxBuffer; // Start of RX buffer
- RXByteCtr = 5; // Load RX byte counter
- while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
- UCB0CTL1 |= UCTXSTT; // I2C start condition
- __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
- // Remain in LPM0 until all data
- // is RX'd
- __no_operation(); // Set breakpoint >>here<< and
- } // read out the RxBuffer buffer
- }
- //-------------------------------------------------------------------------------
- // The USCI_B0 data ISR is used to move received data from the I2C slave
- // to the MSP430 memory. It is structured such that it can be used to receive
- // any 2+ number of bytes by pre-loading RXByteCtr with the byte count.
- //-------------------------------------------------------------------------------
- #pragma vector = USCIAB0TX_VECTOR
- __interrupt void USCIAB0TX_ISR(void)
- {
- RXByteCtr--; // Decrement RX byte counter
- if (RXByteCtr)
- {
- *PRxData++ = UCB0RXBUF; // Move RX data to address PRxData
- if (RXByteCtr == 1) // Only one byte left?
- UCB0CTL1 |= UCTXSTP; // Generate I2C stop condition
- }
- else
- {
- *PRxData = UCB0RXBUF; // Move final RX data to PRxData
- __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
- }
- }
复制代码
此帖出自
小平头技术问答
一周热门 更多>