Hallo allerseits!
Ich bin (mal wieder) an einem Punkt angelangt, an dem ich die Hilfe des
Forums in Anspruch nehmen möchte (hat bisher immer gut geklappt).
Ich habe einen MSP430F169 und möchte diesen per I2C ansprechen (Slave),
erstmal einfach nur ein Byte schreiben. Der Code funktioniert allerdings
nur teilweise: Die ersten Male kommt das Byte korrekt an und dann bleibt
der I2C-Bus hängen, bzw. der MSP zieht SDA auf low (nach dem
Adressierungszyklus).
Hat jemand eine Idee, woran das liegen könnte?
Viele Grüße
Frank
1 | #include <msp430x16x.h>
|
2 | #include <stdbool.h>
|
3 |
|
4 | char TXData = 0;
|
5 | char RXData = 0;
|
6 | char x=0xFF;
|
7 |
|
8 | void main (void)
|
9 | {
|
10 | WDTCTL = WDTPW + WDTHOLD; // Stop WDT
|
11 |
|
12 | P4DIR=0xFF;
|
13 | P4OUT=x;
|
14 |
|
15 | P3SEL |= 0x0A; // Select I2C pins
|
16 | U0CTL |= I2C + SYNC; // Recommended init procedure
|
17 | U0CTL &= ~I2CEN; // Recommended init procedure
|
18 | I2CTCTL |= I2CSSEL1; // SMCLK
|
19 | I2COA = 0x0030; // Own Address is 048h
|
20 | I2CIE = RXRDYIE; // Enable TXRDYIFG interrupt
|
21 | U0CTL |= I2CEN; // Enable I2C
|
22 |
|
23 | _BIS_SR(GIE);
|
24 | while(1);
|
25 | }
|
26 |
|
27 |
|
28 | #pragma vector=USART0TX_VECTOR
|
29 | __interrupt void I2C_ISR(void)
|
30 | {
|
31 | volatile unsigned int i = 0;
|
32 | switch( I2CIV )
|
33 | {
|
34 | case 2: break; // Arbitration lost
|
35 | case 4: break; // No Acknowledge
|
36 | case 6: // Own Address
|
37 | break;
|
38 | case 8: break; // Register Access Ready
|
39 | case 10:
|
40 | RXData = I2CDRB; // RX data
|
41 | P4OUT=RXData;
|
42 | break; // Receive Ready
|
43 | case 12: // Transmit Ready
|
44 | break;
|
45 | case 14: break; // General Call
|
46 | case 16: break; // Start Condition
|
47 | }
|
48 | }
|