mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit i2c beim msp430f5438 und digipoti


Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich versuche ein digitales POti ad5241 per i2c von einem 
msp430f5438 anszusteuern. Ich nutze dazu einen beispielcode von ti.
Es schein als kommt kein ack. Wenn ich am Pin den takt Oszillografieren 
moechte, dann geht diese bei einer Start Condition auf low und sonst 
nix. Also ich kann da dann keinen takt erkennen. Die SDA bleibt auf 
high. jemand ne idee?
P3SEL |= 0x06;                            // Assign I2C pins to USCI_B0
  UCB0CTL1 |= UCSWRST;                      // Enable SW reset
  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode
  UCB0CTL1 = UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset
  UCB0BR0 = 12;                             // fSCL = SMCLK/12 = ~100kHz
  UCB0BR1 = 0;
  UCB0I2CSA = 88;                         // Slave Address is 088
  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation
  UCB0IE |= UCTXIE;                         // Enable TX interrupt

  TXByteCtr = sizeof TxData;              // Load TX byte counter

  while (1)
  {
    __delay_cycles(50);                     // Delay required between transaction
    PTxData = (unsigned char *)TxData;      // TX array start address
                                            // Place breakpoint here to see each
                                            // transmit operation.
    UCB0CTL1 |= UCTR + UCTXSTT;             // I2C TX, start condition

    __bis_SR_register(LPM0_bits + GIE);     // Enter LPM0, enable interrupts
    __no_operation();                       // Remain in LPM0 until all data
                                            // is TX'd
    while (UCB0CTL1 & UCTXSTP);             // Ensure stop condition got sent


#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV,12))
  {
  case  0: break;                           // Vector  0: No interrupts
  case  2: break;                           // Vector  2: ALIFG
  case  4: break;                           // Vector  4: NACKIFG
  case  6: break;                           // Vector  6: STTIFG
  case  8: break;                           // Vector  8: STPIFG
  case 10: break;                           // Vector 10: RXIFG
  case 12:                                  // Vector 12: TXIFG
    if (TXByteCtr)                          // Check TX byte counter
    {
      UCB0TXBUF = *PTxData++;               // Load TX buffer
      TXByteCtr--;                          // Decrement TX byte counter
    }
    else
    {
      UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
      UCB0IFG &= ~UCTXIFG;                  // Clear USCI_B0 TX int flag
      __bic_SR_register_on_exit(LPM0_bits); // Exit LPM0
    }
  default: break;
  }
}

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht denn die Software? Bleibt er im Interrupt hängen? Oder wird 
der Interrupt erst gar nicht aufgerufen? Was sagt das Statusregister im 
Fehlerfall?

>Es schein als kommt kein ack.
So wie du es schreibst, kommt noch nicht mal die Startbedingung korrekt 
raus. SDA müsste VOR SCL auf low gehen.

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es funktioniert jetzt, allerdings mit dem Phaenomen, dass ich die Slave 
Adresse um 1 Bit nach rechts schiften muss. Habs einfach mal 
ausprobiert, wieso weiss ich gar nicht ;). Verrechnet hab ich mich auch 
nicht bei der darstellung der Adresse eine 01011000 duerfte eine 0x58 
bzw. eine 88 sein.
Hatte jemand schonmal das selbe? Vielleicht hab ich nur vergessen ein 
Bit zu setzen? Ich find aber nix, hab schon alles dreimal durchgesehen.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manchmal wird das unterste Adressbit als Read/Write-Bit verwendet, 
vielleicht hat es mit dem zu tun.

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wird es hier auch aber es ist dann ja immer noch das erste Byte, also 
die Slave-Adresse, die auch enthaelt ob gelesen oder geschrieben werden 
soll

Autor: Jörg S. (joerg-s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hatte jemand schonmal das selbe? Vielleicht hab ich nur vergessen ein
>Bit zu setzen? Ich find aber nix, hab schon alles dreimal durchgesehen.
Das ist Normal. Bei Hardware I2C wie bei dem MSP ist es i.d.R. immer so 
das man die Slave Adresse komplett OHNE R/W Bit angibt.
Aus der 01011000 (0x58) wird dann also 00101100 (0x2C).

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha, das wusste ich nicht, danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.