|
- #include <msp430.h>
-
- 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
- P4SEL|=BIT1+BIT2; // Assign I2C pins to USCI_B1
- UCB1CTL1 |= UCSWRST; // Enable SW reset
- UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
- UCB1CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
- UCB1BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
- UCB1BR1 = 0;
- UCB1I2CSA = 0x49; // Slave Address is 048h
- UCB1CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
- UCB1IE |= UCRXIE; // Enable RX interrupt
-
- while (1)
- {
- PRxData = (unsigned char *)RxBuffer; // Start of RX buffer
- RXByteCtr = 5; // Load RX byte counter
- while (UCB1CTL1 & UCTXSTP); // Ensure stop condition got sent
- UCB1CTL1 |= UCTXSTT; // I2C start condition
-
- __bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable 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 = USCI_B1_VECTOR
- __interrupt void USCI_B1_ISR(void)
- {
- switch(__even_in_range(UCB0IV,12))
- {
- case 0: break; // Vector 0: No interrupts
- case 2: break; // Vector 2: ALIFG
- case 4: break; // Vector 4: NACKIFG
- case 6: break; // Vector 6: STTIFG
- case 8: break; // Vector 8: STPIFG
- case 10: // Vector 10: RXIFG
- RXByteCtr--; // Decrement RX byte counter
- if (RXByteCtr)
- {
- *PRxData++ = UCB1RXBUF; // Move RX data to address PRxData
- if (RXByteCtr == 1) // Only one byte left?
- UCB1CTL1 |= UCTXSTP; // Generate I2C stop condition
- }
- else
- {
- *PRxData = UCB1RXBUF; // Move
- }
- }
- }
复制代码
|
|