MSP430 I2C Software hang up

OP #2927196
Lesenswert?
• ▲
▼
Hallo

Ich möchte gerne eine Fehlermeldung generieren, wenn der I2C Bus nicht 
funktioniert -> sprich der abgefragte Slave nicht anwortet.
Mein Problem ist, dass mein Programm nicht weiter abgearbeitet wird wenn 
der Bus nicht fehlerfrei funktioniert.

Ich habe mir schon gedanken über dieses NACK bit gemacht. Aber dieses 
kann der Master ja nicht erhalten, wenn der Slave nicht antwortet. Oder 
wie funktioniert das???

Stehe echt im dunkeln und weiß nicht wie ich das Problem lösen kann.

Gruß Martin
Gast #2927209
Lesenswert?
• ▲
▼
#pragma vector = USCI_B0_VECTOR
__interrupt void USCI_B0_ISR(void)
{
  switch(__even_in_range(UCB0IV, 12))
  {
    case 0:
      break;
    case 2:
      break;
    case 4:    //NACK IFG
      UCB0CTL1 |= UCTXSTP;
      lcd_clrScr();// Transmit a stop
      //lcd_setCursor(0,0);
      uart_A0_tx_str("I2C_ERROR_NOT_CONNECTED!\r");
      uart_A1_tx_str("I2C_ERROR_NOT_CONNECTED!\r");
      //lcd_setCursor(0,0);
      lcd_putStr("SMBUS_ERROR:");
      lcd_setCursor(1,0);
      lcd_putStr("NOT_CONNECTED   ");
      UCB0IFG &= ~UCNACKIFG;

      break;
    case 6:
      break;
    case 8:
      break;
    case 10:  //RXIFG

      RXByteCtr--;

      if (RXByteCtr){
        *PRxData++= UCB0RXBUF;
      }
      else{
        *PRxData= UCB0RXBUF;
        }

      if (RXByteCtr == 1){
        //while(UCB0CTL1 & UCTXSTT);
        UCB0CTL1 |= UCTXSTP;
        //lcd_setCursor(0,0);
        //lcd_putStr("I2C_GOO:");
        //lcd_setCursor(1,0);
        //lcd_putStr("NO_ERROR");
      }
      break;
    case 12:   //TXIFG
       if (TXByteCtr){
         UCB0TXBUF = command;
           TXByteCtr--;
      }
       else{
        UCB0CTL1 &= ~UCTR;
        UCB0IFG &= ~UCTXIFG;
        UCB0CTL1 |= UCTXSTT;
         if(byte){
             while(UCB0CTL1 & UCTXSTT);
             UCB0CTL1 |= UCTXSTP;
             }
       }
      break;
    default:
      break;
  }
}




So kann man das z.B mit der ISR machen. Wenn der SLave nicht antwortet 
wird die NACKIFG ausgelöst. Ist für nen MSP430F5529.

glgl
Gast #2927852
Lesenswert?
• ▲
▼
Also der Master bekommt das NAK-Bit schon. Bei einer I2C-Übertragung 
werden immer 9 Takte übetragen. Der 9. ist dann das ACK (Slave zieht den 
Pegel auf low) oder NAK (Slave macht garnix -> Pegel bleibt auf high).

Antwort schreiben

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.

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.