Forum: Mikrocontroller und Digitale Elektronik MSP430 I2C Software hang up


von Martin G. (kptlt)


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

von THC_SIDO (Gast)


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

von Dennis (Gast)


Lesenswert?

Du solltest zuerst mal nennen, mit welchem MSP du arbeitest. Nicht jeder 
hat ein vollständiges Hardware-I²C drin. Hast du ein USI-Modul oder ein 
USCI?

von Peter (Gast)


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).

von Peter (Gast)


Angehängte Dateien:

Lesenswert?

Ein Bild sagt mehr als 1000 Worte.

Ganz rechts beim letzten Transfer sagt der Slave dem Master 'das wars 
soweit' -> NAK.

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.