MSP430 I2C Slave

OP #1193770
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
}
Gast
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?
OP
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
>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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.