-         

Ergebnis 1 bis 4 von 4

Thema: I²C ERROR

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2007
    Beiträge
    10

    I²C ERROR

    Anzeige

    Ich habe meinen RP6 jetzt seit ein paar Tagen und wollte jetzt mein eignes Programm mit dem Erweiterungsmodul schreiben. Es sagt ihm lediglich, dass er 10 cm vorwährts fahren soll. Auf dem RP6 läuft das Slave-Programm, dass sich bei den Beispielen befindet. Den Großteil hab ich von den Beispielprogramm kopiert, jedoch kommt immer die Fehlermeldung "I2C ERROR - TWI STATE: 0x20".
    Der Code ist Folgender:
    Code:
    
    #include "RP6ControlLib.h" 		// The RP6 Control Library. 
    								// Always needs to be included!
    #include "RP6I2CmasterTWI.h"	// I2C Master Library
    // Include our new "RP6 Control I2C Master library":
    #include "RP6Control_I2CMasterLib.h"
    
    
    // I2C Requests: 
    
    /**
     * The I2C_requestedDataReady Event Handler
     */
    void I2C_requestedDataReady(uint8_t dataRequestID)
    {
    	checkRP6Status(dataRequestID);
    }
    
    /*****************************************************************************/
    // I2C Error handler
    
    /**
     * This function gets called automatically if there was an I2C Error like
     * the slave sent a "not acknowledge" (NACK, error codes e.g. 0x20 or 0x30).
     */
    void I2C_transmissionError(uint8_t errorState)
    {
    	writeString_P("\nI2C ERROR - TWI STATE: 0x");
    	writeInteger(errorState, HEX);
    	writeChar('\n');
    }
    
    
    
    int16_t main(void)
    {
    	initRP6Control();
    	
    	
    	sound(180,80,25);
    	sound(220,80,25);
    	
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    	
    
    	move(100,FWD,DIST_CM(10),false);
    	
    	while(1)
    	{
    		task_checkINT0();
    		task_I2CTWI();
    	}
    
    	return 0;
    
    }
    Könnt ihr mir sagen, wo ich den Fehler gemacht hab?

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich hab mir mal die Mühe gemacht und die Fehler-Codes aufgedröselt (weil das sonst nervt)
    Das ist zwar Bascom, aber du kennst dich sicher aus so aus
    Code:
    Sub Twi_show_state(byref State As Byte)
       Print Hex(state);
       Select Case State
       Case &H08 : Print " Start "
       Case &H10 : Print " Start Rep "
    
       Case &HA0 : Print " Stop / Rep Start  "
    
       Case &HA8 : Print " Sla R Received Acked "
       Case &H60 : Print " Sla W Received Acked "
       Case &H70 : Print " Gca Received Acked "
    
       Case &H80 : Print " SR Sla Data Received Acked "
       Case &H90 : Print " SR Gca Data Received Acked "
       Case &H88 : Print " SR Sla Data Received Not Acked "
       Case &H98 : Print " SR Gca Data Received Not Acked "
       Case &HB8 : Print " ST Data Transmitted Acked "
       Case &HC0 : Print " ST Data Transmitted Not Acked "
       Case &HC8 : Print " ST Last Data Transm Acked "
       Case &H18 : Print " MT Sla W Transmitted Acked "
       Case &H40 : Print " MT Sla R Transmitted Acked "
       Case &H20 : Print " MT Sla W Transmitted Not Acked"
       Case &H48 : Print " MT Sla R Transmitted Not Acked "
       Case &H38 : Print " MT Lost Or Sla R / W Not Acked "
       Case &H68 : Print " MT Lost / Sla W Received Acked "
       Case &H78 : Print " MT Lost / Gca Received Acked "
       Case &HB0 : Print " MT Lost / Sla R Received Acked "
       Case &H28 : Print " MT Data Transmitted Acked "
       Case &H30 : Print " MT Data Transmitted No Acked "
       Case &H50 : Print " MT Data Received Acked "
       Case &H58 : Print " MT Data Received Not Acked "
       Case Twi_timeout : Print " M  Timeout"
       Case Twi_m_busy : Print " TWI Busy"
       Case Twi_buserr : Print " Bus Error"
       Case Else : Print " ??"
       End Select
    
    End Sub
    In deinem Fall heisst das, das sich dein Slave irgendwie nicht angesprochen gefühlt hat (no ACK)

    (adresse falsch ?)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo ComputerKind,

    beim Slave (also beim RP6) kommt nichts an, weil du nichts sendest.

    Ein Schreibzugriff sähe z.B. so aus:
    I2CTWI_transmitBytes(I2C_RP6_BASE_ADR, transmit_buffer, 6 );

    Da werden 6 Bytes aus dem Buffer an den Slave gesendet. Diese Bytes enthalten dann z.B. die Befehlsfolge für das Fahren oder Rotieren.

    Sieh dir das Beispiel RP6Control_06_I2CMaster.c an! Da gibt es eine Funktion RP6_rotate, die zeigt, wie man ihm eine Rotation über I2C befehlen kann.
    Genauso kannst du auch MOVE Befehle senden! Da sind schon Befehlscodes definiert, z.B. CMD_MOVE_AT_SPEED für den moveAtSpeed Befehl (siehe RP6Control_07_I2CMaster.c).

    Gruß Dirk

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    28.12.2007
    Beiträge
    10
    Hab jetzt ein bisschen herum experimentiert und bin zu dem Ergebniss gekommen, dass wenn ich in dem Beispielprogramm 09 msleep() und setLEDs weglasse, dass das Programm auch nicht mehr funktioniert. Kann mir jemand erklären, warum das so ist?

Berechtigungen

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