Forum: Mikrocontroller und Digitale Elektronik Fehlersuche bei I2C [MSP430]; UCBBUSY bleibt gesetzt


von I2C Neuling (Gast)


Lesenswert?

Hi,
zurzeit kämpfe ich während der Inbetriebnahme meiner neu 
zusammengebauten Schaltung mit dem I2C - Bus. Am Bus hängen 3 ICs.
Ich weiße die  I2C Pins dem USCI_B0 Modul zu und initialisiere 
anschließend den ersten Baustein (TMP100) entsprechend einem 
Beispielcode von TI zum senden:

  UCB0CTL1 |= UCSWRST;                        // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;       // I2C Master, synchronous 
mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;              // Use SMCLK, keep SW 
reset
  UCB0BR0 = 80;                               // fSCL = SMCLK/80 = 
100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = 0x48;                           // Set slave address
  UCB0CTL1 &= ~UCSWRST;                       // Clear SW reset, resume 
operation
  UCB0I2CIE |= UCNACKIE;
  IE2 |= UCB0TXIE;                            // Enable TX ready 
interrupt

Anschließend frage ich UCBBUSY ab, ob der Bus frei ist, allerdings 
bleibt dieses Bit immer gesetzt.

Hat zufällig jemand einen Tip für mich, wie ich soft- und hardwaremäßig 
dem Fehler auf die Spur kommen kann? Bisher habe ich schon die ICs auf 
richtigen Einbau und korrekten Anschluß hin überprüft.

Danke schon mal im Vorraus,
Martin


P.S. Wo finde ich den Formatierungsbefehl zum einfügen von 
Codeschnipseln in einen Beitrag?

von Jörg S. (joerg-s)


Lesenswert?

>Anschließend frage ich UCBBUSY ab, ob der Bus frei ist, allerdings
>bleibt dieses Bit immer gesetzt.
SDA und SCL sind beide high? Busy wird direkt nach der initialisierung 
abgefragt?
Mit dem Busy hatte ich auch (oder immer noch) so meine Probleme. Wenn 
man auf einen Slave zugreifen will, die Adresse aber ins leere geht, 
bleibt bei mir der I2C Bus vom MSP auch auf Busy stehen und SDA (oder 
war's SCL?) bleibt auf low stehen. Meine bisherige Abhilfe ist in jedem 
Zyklus abzufragen ob der Bus Busy ist und wenn ja den I2C Bus neu zu 
starten (UCB0CTL1 |= UCSWRST;).


>P.S. Wo finde ich den Formatierungsbefehl zum einfügen von
>Codeschnipseln in einen Beitrag?
Steht direkt über dem Eingabefenster :)

von I2C Neuling (Gast)


Lesenswert?

Bei mir bleibt SDA auf low.
Aber bei der Initialisierung wird doch die Adresse noch gar nicht 
gesendet, oder? Die wird doch erst übertragen, wenn ich eine START 
condition sende.
Kann es noch eine andere Ursache dafür geben, dass SDA auf low gezogen 
wird?

von I2C Neuling (Gast)


Lesenswert?

Gerade habe ich SCL und SDA mal ans Oszi gehängt und gesehen, dass der 
Zustand SCL high und SDA low schon beim einschalten herrscht und sich 
gar nichts daran ändert.
Anscheinend funktioniert da etwas grundlegendes nicht. Stimmt eigentlich 
die Initialisierung, wie ich sie oben geschrieben habe?

von Christian R. (supachris)


Lesenswert?

I2C Neuling wrote:
> Bei mir bleibt SDA auf low.
> Aber bei der Initialisierung wird doch die Adresse noch gar nicht
> gesendet, oder? Die wird doch erst übertragen, wenn ich eine START
> condition sende.
> Kann es noch eine andere Ursache dafür geben, dass SDA auf low gezogen
> wird?

Sind denn die externen Pull-Ups an den Leitungen?

von I2C Neuling (Gast)


Lesenswert?

>Sind denn die externen Pull-Ups an den Leitungen?

Ja, jeweils 4k7 Ohm.

von Jörg S. (joerg-s)


Lesenswert?

PxSEL gesetzt?

von I2C Neuling (Gast)


Lesenswert?

>PxSEL gesetzt?

Ja, hier ein Ausschnitt aus meiner Initialisierung:
1
void msp_init(void)
2
{
3
  volatile unsigned int i;
4
  
5
  WDTCTL = WDTPW + WDTHOLD;             // halte watchdog an
6
  
7
//...
8
  
9
  P3DIR |= 0x0f9;                       // Set P3 output direction
10
  P3SEL |= 0x36;                        // Set P3 function
11
  P3OUT |= 0x00;                        // Set P3 initial value
12
  
13
//...
14
  
15
  BCSCTL1 |= XTS + DIVA_3;              // HF XTAL + ACLK/8               
16
  BCSCTL3 |= LFXT1S_3;                  // ext. Taktquelle fuer LFXT1
17
  BCSCTL3 &= ~XCAP0;                    // XCAP ~ 1pF
18
  do {                                  
19
    IFG1 &= ~OFIFG;                     // loesche OSCFault Flag
20
    for (i=0; i<256; i++) _NOP();       // Zeit zum setzen des Flags
21
  } while((IFG1 & OFIFG) != 0);         // warte, bis externer Oszillator angeschwungen (OSCFault Flag noch gesetzt?)
22
  BCSCTL2 = SELM_3 + SELS;              // schalte auf externen Takt
23
}

von I2C Neuling (Gast)


Lesenswert?

AAAAAAAAAArgh!

Gerade habe ich mein Programmier- und Debuginterface (das aus dem 
eZ430-RF2500 Set) abgezogen:
---> Die Schaltung läuft!

Dumme Frage: Warum bekomme ich die Schaltung nicht zum laufen, wenn ich 
das Interface dranlasse? Anscheinend kommt sich da irgendwas ins Gehege. 
Die Schnittstelle zu dem Interface habe ich so beschaltet wie beim 
eZ430-RF2500 Set (lediglich V+ vom Adapter habe ich nicht mit der 
Schaltung verbunden, da diese separat versorgt wird).

von Jörg S. (joerg-s)


Lesenswert?

Um welchen MSP geht's überhaupt?

von I2C Neuling (Gast)


Lesenswert?

>Um welchen MSP geht's überhaupt?

Um einen MSP430F2272.
Das programmieren und debuggen mache ich über Spi-Bi Wire.

von I2C Neuling (Gast)


Lesenswert?

AAAAAAAAAArgh! (Teil2)

Jetzt tritt der oben genannte Fehler auf einmal wieder auf, obwohl ich 
an der I2C - Initialisierung nichts geändert habe.
Hatte schon mal jemand hier ein ähnliches Problem?

von I2C Neuling (Gast)


Lesenswert?

Der Tip in diesem Beitrag hier
Beitrag "PIC I2C Fehler mit CCS Compiler in MPLAB"
scheint geholfen zu haben, jedenfalls funktioniert die Geschichte im 
Moment wieder.

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.