71 lines
6.1 KiB
HTML
71 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>
|