MSP430 I2C Software hang up

#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren