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.