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?
>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 :)
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?
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?
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?
>Sind denn die externen Pull-Ups an den Leitungen?
Ja, jeweils 4k7 Ohm.
>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 | }
|
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).
>Um welchen MSP geht's überhaupt? Um einen MSP430F2272. Das programmieren und debuggen mache ich über Spi-Bi Wire.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.