70 lines
6.1 KiB
HTML
70 lines
6.1 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||
<HTML><HEAD><TITLE></TITLE>
|
||
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
|
||
<META content="MSHTML 6.00.2900.2873" name=GENERATOR></HEAD>
|
||
<BODY><!-- Converted from text/plain format --><FONT face=Arial
|
||
size=2></FONT><FONT size=2>
|
||
<P>Carsten Giesen (info@cnau.de)</P>
|
||
<P>TWI-Treiber (I2C)</P>
|
||
<P>Die gesammte Kommunikation mit der TWI Schnittstelle steckt in TWI_driver.c
|
||
und TWI_driver.h.<BR>Angesprochen wird der Treiber <20>ber "Send_to_TWI(tx_frame)"
|
||
daf<EFBFBD>r sind aber ein paar Vorarbeiten n<>tig.</P>
|
||
<P>Zur Vereinfachung hier ein Beispiel am Beispiel vom SRF10:</P>
|
||
<P><BR>char
|
||
temp[2];
|
||
//Array um Platz f<>r die Befehle zu schaffen<BR>char
|
||
state;
|
||
//Platz f<>r das Ergebniss der Aktion<BR>tx_type
|
||
tx_frame[2]; //Hier wird der Container geschaffen</P>
|
||
<P></P>
|
||
<P>state = SUCCESS;
|
||
//Vorbelegen, da manche Aktionen nur Sinn machen, wenn state=SUCCESS</P>
|
||
<P>//Jetzt gehts los:<BR>tx_frame[0].slave_adr = address+W; //Die Adresse des
|
||
Ziel-Bausteins <BR>tx_frame[0].size = 2; //Wie viele Befehle (Daten) sollen
|
||
<EFBFBD>bertragen werden<BR>tx_frame[0].data_ptr = temp; //der Pointer f<>r die
|
||
Befehle<BR>tx_frame[0].data_ptr[0] = SRF10_COMMAND;
|
||
//Der erste Befehl ist normaler Weise das
|
||
Register, <BR>
|
||
//welches Angesprochen werden soll<BR>tx_frame[0].data_ptr[1] =
|
||
metric_unit;
|
||
//Was soll gemacht werden (hier eine Messung in cm)<BR>tx_frame[1].slave_adr =
|
||
OWN_ADR;
|
||
//Damit wird dem Treiber klar gemachtm das er fertig ist.<BR>state =
|
||
Send_to_TWI(tx_frame);
|
||
//Und jetzt wird alles <20>bergeben<BR><BR>In State steht jetzt ob der Befehl
|
||
erfolgreich war, oder nicht.<BR><BR>Wie man Daten empf<70>ngt, am Beispiel Register
|
||
auslesen:</P>
|
||
<P>uint8 srf10_read_register(unsigned char srf10_register)<BR>{<BR>char
|
||
temp;
|
||
//Variable um Platz f<>r die Befehle zu schaffen<BR>char
|
||
value;
|
||
//Variable um Platz f<>r die Resultate zu schaffen<BR>char
|
||
state;
|
||
//Platz f<>r das Ergebniss der Aktion<BR>tx_type
|
||
tx_frame[3]; //Hier wird der Container
|
||
geschaffen<BR>state = SUCCESS;
|
||
//Vorbelegen, da manche Aktionen nur Sinn machen, wenn state=SUCCESS<BR>value =
|
||
0;<BR>tx_frame[0].slave_adr =
|
||
address+W; //Die Adresse
|
||
des Ziel-Bausteins<BR>tx_frame[0].size =
|
||
1;
|
||
//Wie viele Befehle (Daten) sollen <20>bertragen werden<BR>tx_frame[0].data_ptr =
|
||
&temp;
|
||
//der Pointer f<>r die Befehle<BR>tx_frame[0].data_ptr[0] =
|
||
srf10_register; //Der erste Befehl ist normaler Weise
|
||
das
|
||
Register,<BR>
|
||
//welches Angesprochen werden soll<BR>tx_frame[1].slave_adr =
|
||
address+R;
|
||
//Die Adresse des Ziel-Bausteins +R f<>r lesen<BR>tx_frame[1].size =
|
||
1;
|
||
//Wie viele Daten sollen gelesen werden<BR>tx_frame[1].data_ptr =
|
||
&value;
|
||
//der Pointer f<>r die Daten<BR>tx_frame[2].slave_adr =
|
||
OWN_ADR; //Damit wird dem
|
||
Treiber klar gemachtm das er fertig ist.<BR>state =
|
||
Send_to_TWI(tx_frame);
|
||
//Und jetzt wird alles <20>bergeben<BR>srf10_state = state;<BR>return
|
||
value;<BR>}</P>
|
||
<P>Man kann also gut sehen, das beide Aktionen, schreiben und lesen kombiniert
|
||
werden k<>nnen.</P></FONT></BODY></HTML>
|