Forum: Mikrocontroller und Digitale Elektronik MSP430 I2C Slave


von Frank B. (frank13)


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
}

von Tobias Korrmann (Gast)


Lesenswert?

Hast du mal geschaut ob die Flags auch zurückgesetzt werden?
Hast du schon einmal in die Device Erratasheet geschaut ob es dort ein 
Problem gibt?

von Frank B. (frank13)


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

von Jörg S. (joerg-s)


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?

von Frank B. (frank13)


Lesenswert?

Genau so sieht es aus!

von Frank B. (frank13)


Lesenswert?

Hat da keiner eine Antwort? Es hörte sich in den vorangegangenen 
Antworten doch so an...

Gruß

Frank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.