-         

Ergebnis 1 bis 2 von 2

Thema: AT90CAN128: Bus-Off erkennen und Senden abbrechen?

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987

    AT90CAN128: Bus-Off erkennen und Senden abbrechen?

    Anzeige

    Moin.

    Auf nem AT90CAN128 läuft eine Software, die immer wieder mal über den CAN-Bus Daten sendet. Nun gibts das Problem, dass sich die Send-Funktion aufhängt, wenn das Teil nicht am Bus dranhängt.

    Eigentlich auch verständlich, da die Funktion in einer while-Schleife wartet, bis die Übertragung abgeschlossen wurde. Ohne Bus wird nix abgeschlossen und TXOK bleibt 0.

    Die Send-Funktion:
    Code:
    ui8_t CAN_SendDataWait(ui8_t mob, ui8_t * data, ui8_t len)
    {
      ui8_t mode;
      ui8_t canstmob;
      ui8_t retval = ERR_GLOBAL_ERROR;
    
    
      // Choose object
      CAN_SelectMsgObj(mob);
    
      // store current mode
      mode  = CAN_GetMode();
    
      // Copy data
      CAN_SetData(data, len);
    
      // Start transfer
      CAN_SetMode(CANMODE_TRANSMIT_DATA);
    
      // Wait until transmission is completed
    
      //while (!getbit(CANSTMOB, TXOK));    
      while ((CANSTMOB & (1 << TXOK)) == 0)
      {
        // TODO: Implement timeout here
        // also: Set retval to ERR_OK or ERR_CAN_TX_ERROR, depending on success
      }
    
      // Read-Modify-Write (Datasheet p. 261)
      canstmob =  CANSTMOB;
      CANSTMOB =  canstmob & ~(1<<TXOK);
    
      // No restoring of old mode!
    
      return retval;
    }
    Ich möchte nun irgendwie erreichen, dass bei fehlender Verbindung zum Bus einfach die Übertragung abgebrochen und ein entsprechender Fehlercode zurückgegeben wird.

    Bisherige Versuche scheiterten aber:
    -CANSTMOB abfragen, ob eines der Error-Bits gesetzt wird: Negativ, Register bleibt vor und in der while auf 0x00.
    - CANTEC (Tx Error Counter) abfragen; Ebenfalls kein Ergebnis; Wert bleibt vor und in der while auf 0.

    Wenn ich nen einfachen Timeout-Counter einbau, bleibt diese noch nicht gesendete Nachricht ja trotzdem noch aktiv und wartet, bis sie rausgeht.

    Es müsste also irgendwie abgebrochen werden, die Funktion sollte melden, dass die Übertragung nicht möglich ist und es sollten dann auch weitere Übertragungen (z.B. über ein eigenes Bus-Off-Bit) unterbunden werden.

    Kennt jemand ne Möglichkeit, dieses Problem zu lösen?

    mfG
    #ifndef MfG
    #define MfG

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Du könntest versuchen, nach einem Timeout den CAN-Controller über das SWRES-Bit im CANGCON-Register zu resetten. Ich habe im Datenblatt nichts darüber gefunden, ob das wirklich auch die aktuell laufende Übertragung unterbricht - der Logik nach sollte es aber so sein.

    Gruß,
    askazo

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •