Hi ACU,
gehen wir mal Schritt für Schritt die betreffenden Teile des Beispielprogramms durch - ich denke so sollte es etwas klarer werden.
Das ist wieder deshalb etwas komplexer, weil man so eben noch andere Sachen machen kann während die Daten vom Bus abgerufen werden.
Es geht auch einfacher indem man einfach readRegister verwendet und nicht requestRegister (also register *auslesen* (read) oder register *anfordern* (request))
Als erstes registriert man in der Main Funktion eine passende Funktion als Event Handler für den Fall, dass vom I2C Bus angeforderte Daten angekommen sind (wie die Event Handler für Bumper und ACS auf
dem Mainboard):
Code:
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
Die Funktion definiert man folgendermaßen:
Code:
#define TOLLE_REQUEST_ID 1 // Das brauchen wir später noch - siehe weiter unten
void I2C_requestedDataReady(uint8_t dataRequestID)
{
if(dataRequestID == TOLLE_REQUEST_ID) // siehe unten
{
uint8_t messageBuf[3]; // die "3" verändern je nachdem wieviele Bytes man auslesen möchte...
I2CTWI_getReceivedData(messageBuf, 3);
// ... irgendwas damit machen.
}
// else if ...
}
Jetzt kann man irgendwo anders im Program Daten anfordern ("request") und zwar so:
Code:
#define I2C_RP6_BASE_ADR 10 // Die I2C Bus Adresse vom RP6 Mainboard
I2CTWI_requestRegisterFromDevice(I2C_RP6_BASE_ADR, TOLLE_REQUEST_ID, 0, 3);
// Hier die "3" wieder ändern je nachdem wieviele Daten man braucht.
Jetzt werden die Daten angefordert und sobald alles empfangen wurde die Funktion I2C_requestedDataReady
von oben aufgerufen und man kann die Daten weiterverarbeiten. Anhand der requestID kann man erkennen welche art von Daten angefragt wurden - also z.B. für die Bumper, das ACS o.ä. und anhand dessen passend verarbeiten.
MfG,
SlyD
Lesezeichen