Guten Abend,
ich habe nun schon einige Projekte auf dem MSP430G2553 realisiert und
wollte mich nun mal mit I2C befassen. Dazu habe ich die Beispielcodes
von TI ausprobiert, unter anderem den hier:
1 | #include <msp430.h>
|
2 |
|
3 | unsigned char TXData;
|
4 | unsigned char TXByteCtr;
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT
|
9 | P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
|
10 | P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
|
11 | UCB0CTL1 |= UCSWRST; // Enable SW reset
|
12 | UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
|
13 | UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
|
14 | UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
|
15 | UCB0BR1 = 0;
|
16 | UCB0I2CSA = 0x48; // Slave Address is 048h
|
17 | UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
|
18 | IE2 |= UCB0TXIE; // Enable TX interrupt
|
19 |
|
20 | TXData = 0x00; // Holds TX data
|
21 |
|
22 | while (1)
|
23 | {
|
24 | TXByteCtr = 1; // Load TX byte counter
|
25 | while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
|
26 | UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
|
27 | __bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
|
28 | // Remain in LPM0 until all data
|
29 | // is TX'd
|
30 | TXData++; // Increment data byte
|
31 | }
|
32 | }
|
33 |
|
34 | //------------------------------------------------------------------------------
|
35 | // The USCIAB0TX_ISR is structured such that it can be used to transmit any
|
36 | // number of bytes by pre-loading TXByteCtr with the byte count.
|
37 | //------------------------------------------------------------------------------
|
38 | #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
|
39 | #pragma vector = USCIAB0TX_VECTOR
|
40 | __interrupt void USCIAB0TX_ISR(void)
|
41 | #elif defined(__GNUC__)
|
42 | void __attribute__ ((interrupt(USCIAB0TX_VECTOR))) USCIAB0TX_ISR (void)
|
43 | #else
|
44 | #error Compiler not supported!
|
45 | #endif
|
46 | {
|
47 | if (TXByteCtr) // Check TX byte counter
|
48 | {
|
49 | UCB0TXBUF = TXData; // Load TX buffer
|
50 | TXByteCtr--; // Decrement TX byte counter
|
51 | }
|
52 | else
|
53 | {
|
54 | UCB0CTL1 |= UCTXSTP; // I2C stop condition
|
55 | IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
|
56 | __bic_SR_register_on_exit(CPUOFF); // Exit LPM0
|
57 | }
|
58 | }
|
Die SDA und SCL Leitungen (P1.6 und P1.7) habe ich mir auf einem
Oszilloskop angeguckt und festgestellt das lediglich ununterbrochen die
Slave Addresse (0x48) gesendet wird, aber nicht das zu sendende Byte
(0x00 ++).
Interpretiere ich da etwas falsch oder muss ich den TI Sourcecode noch
abändern?
Beste Grüße,
Michael