PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (eigentlich unwichtige) Fragen zu getCommand aus RP6Base_I2CSlave.c



danimath
25.08.2011, 19:11
Moin *,

nur des Verständnisses wegen (weil ich gerade mit dem I2C-Bus kämpfe ;)).

Zur Funktion:


uint8_t getCommand(void)
{
if(I2CTWI_writeRegisters[I2C_REGW_CMD] && !I2CTWI_writeBusy)
{
cmd = I2CTWI_writeRegisters[I2C_REGW_CMD]; // store command register
I2CTWI_writeRegisters[I2C_REGW_CMD] = 0; // clear command register (!!!)
param1 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM1]; // parameters 1-6...
param2 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM2];
param3 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM3];
param4 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM4];
param5 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM5];
param6 = I2CTWI_writeRegisters[I2C_REGW_CMD_PARAM6];
return true;
}
return false;
}


1. Die if-Bedingung würde ich umdrehen:

if (!I2CTWI_writeBusy && I2CTWI_writeRegisters[I2C_REGW_CMD])
Wenn der Compiler optimiert, braucht der "teure" Indexzugriff nicht ausgeführt werden, wenn die erste Bedingung schon falsch ist. Oder?

2. clear command register

I2CTWI_writeRegisters[I2C_REGW_CMD] = 0;

Wenn ich das richtig verstanden habe, dann dient das Zurücksetzen dazu, dem Master zu signalisieren, dass der Slave den Befehl verstanden und die Parameter gespeichert hat. Sollte das denn nicht am Ende (nach den param-Zuweisungen) stehen? So wie oben könnte doch ein ungeduldiger Master die Parameter schon wieder überschrieben haben. Oder?

Ja - ich weiß - es steht in vielen Kommentaren, dass die Programme Raum für Verbesserungen bieten (und SlyD hat das ja auch mehrfach betont!). Gehört diese Funktion auch dazu?

viele Grüße
Andreas

SlyD
28.08.2011, 11:57
Hallo,

Zu 1:
Das ist relativ egal da beide Variablen sehr selten gesetzt werden aber NUR dann wenn in dem writeRegister was drin steht auch was gemacht werden soll (und nur DANN wird auch geschaut ob das gerade geht oder ob noch ein Schreibvorgang läuft).


Zu 2:

> ... dann dient das Zurücksetzen dazu, dem Master zu signalisieren, ...

Nö. Das ist damit beim nächsten Aufruf von getCommand in

I2CTWI_writeRegisters[I2C_REGW_CMD]

eine 0 drin steht. Sonst würde das gleiche Kommando ja nochmal ausgeführt.
Der Master bekommt davon nix mit der hat auch gar keinen lesenden Zugriff auf die writeRegister (read und write Regsiter sind zwei verschiedene Arrays!)


> So wie oben könnte doch ein ungeduldiger Master die Parameter schon wieder überschrieben haben.

Eigentlich nicht, da vorher getestet wird (writeBusy) ob gerade irgendwas geschrieben wird (die Variable ist solange 0 bis Adresse+W empfangen wurde).
Wenn nicht wird sehr schnell der Code ausgeführt und der aktuelle Befehl in Variablen zwischengespeichert.
Der I2C Bus läuft nur mit maximal 400kHz versus den 8MHz des ATMEGA selbst wenn direkt nach der if Abfrage writeBusy = 1 werden sollte käme
des I2C Bus nicht so schnell hinterher. Der schreibt ja da auch erstmal welches Register überhaupt beschrieben werden soll und erst danach
kommen die Daten und die Register werden tatsächlich geändert...


MfG,
SlyD

danimath
28.08.2011, 18:37
> ... dann dient das Zurücksetzen dazu, dem Master zu signalisieren, ...

Nö. Das ist damit beim nächsten Aufruf von getCommand in

I2CTWI_writeRegisters[I2C_REGW_CMD]

eine 0 drin steht. Sonst würde das gleiche Kommando ja nochmal ausgeführt.


OK - habbich verstanden.



Der Master bekommt davon nix mit der hat auch gar keinen lesenden Zugriff auf die writeRegister (read und write Regsiter sind zwei verschiedene Arrays!)


Ach ja - wenn der danimath mal seine eigenen Eselbrücken anwenden würde ;) "read" und "write" sind ja immer aus Mastersicht.

Danke für die ausführliche Anwort!
Andreas