Carsten Giesen (info@cnau.de)
TWI-Treiber (I2C)
Die gesammte Kommunikation mit der TWI Schnittstelle steckt in TWI_driver.c
und TWI_driver.h.
Angesprochen wird der Treiber �ber "Send_to_TWI(tx_frame)"
daf�r sind aber ein paar Vorarbeiten n�tig.
Zur Vereinfachung hier ein Beispiel am Beispiel vom SRF10:
char
temp[2];
//Array um Platz f�r die Befehle zu schaffen
char
state;
//Platz f�r das Ergebniss der Aktion
tx_type
tx_frame[2]; //Hier wird der Container geschaffen
state = SUCCESS; //Vorbelegen, da manche Aktionen nur Sinn machen, wenn state=SUCCESS
//Jetzt gehts los:
tx_frame[0].slave_adr = address+W; //Die Adresse des
Ziel-Bausteins
tx_frame[0].size = 2; //Wie viele Befehle (Daten) sollen
�bertragen werden
tx_frame[0].data_ptr = temp; //der Pointer f�r die
Befehle
tx_frame[0].data_ptr[0] = SRF10_COMMAND;
//Der erste Befehl ist normaler Weise das
Register,
//welches Angesprochen werden soll
tx_frame[0].data_ptr[1] =
metric_unit;
//Was soll gemacht werden (hier eine Messung in cm)
tx_frame[1].slave_adr =
OWN_ADR;
//Damit wird dem Treiber klar gemachtm das er fertig ist.
state =
Send_to_TWI(tx_frame);
//Und jetzt wird alles �bergeben
In State steht jetzt ob der Befehl
erfolgreich war, oder nicht.
Wie man Daten empf�ngt, am Beispiel Register
auslesen:
uint8 srf10_read_register(unsigned char srf10_register)
{
char
temp;
//Variable um Platz f�r die Befehle zu schaffen
char
value;
//Variable um Platz f�r die Resultate zu schaffen
char
state;
//Platz f�r das Ergebniss der Aktion
tx_type
tx_frame[3]; //Hier wird der Container
geschaffen
state = SUCCESS;
//Vorbelegen, da manche Aktionen nur Sinn machen, wenn state=SUCCESS
value =
0;
tx_frame[0].slave_adr =
address+W; //Die Adresse
des Ziel-Bausteins
tx_frame[0].size =
1;
//Wie viele Befehle (Daten) sollen �bertragen werden
tx_frame[0].data_ptr =
&temp;
//der Pointer f�r die Befehle
tx_frame[0].data_ptr[0] =
srf10_register; //Der erste Befehl ist normaler Weise
das
Register,
//welches Angesprochen werden soll
tx_frame[1].slave_adr =
address+R;
//Die Adresse des Ziel-Bausteins +R f�r lesen
tx_frame[1].size =
1;
//Wie viele Daten sollen gelesen werden
tx_frame[1].data_ptr =
&value;
//der Pointer f�r die Daten
tx_frame[2].slave_adr =
OWN_ADR; //Damit wird dem
Treiber klar gemachtm das er fertig ist.
state =
Send_to_TWI(tx_frame);
//Und jetzt wird alles �bergeben
srf10_state = state;
return
value;
}
Man kann also gut sehen, das beide Aktionen, schreiben und lesen kombiniert werden k�nnen.