MSP430 I2C Slave

OP #1193770
Lesenswert?

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
}
OP #1194785
Lesenswert?

Hi!

Ok, setzt stehe ich total auf dem Schlauch. Es sind folgende Bits 
gesetzt (egal ob der Transfer geklappt hat der nicht):
TXRDYIF, RXRDYIF, ALIFG

Insbesondere das ALIFG wundert mich. Der MSP ist doch im Slave-Mode oder 
sehe ich das falsch? Ich komme da irgendwie nicht weiter...

Gruß

Frank
#1194912
Lesenswert?

>erstmal einfach nur ein Byte schreiben.
D.h. der Master schickt dem MSP die Adresse+1Byte, richtig?

>Die ersten Male kommt das Byte korrekt an ...
D.h. komplette Übertragungen haben schon funktioniert?

>...der MSP zieht SDA auf low (nach dem Adressierungszyklus).
D.h. der MSP bleibt beim ACK der Adresse stehen?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren