Hi, für einen alten Hasen ist das sicherlich ganz easy, ich dageben
bräuchte mal wieder kurze Starthilfe.
Es geht um folgende Funktion:
1 | void TWI_read(u08 TWI_adr, u08 *val, u08 count)
|
2 | //------------------------------------------------
|
3 | // Read n=count bytes from I2C-Bus in polled mode
|
4 | // needs about 200us for reading addr + one byte
|
5 | //------------------------------------------------
|
6 | {
|
7 | u08 i=0;
|
8 | TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // send START condition
|
9 | while (!(TWCR & (1<<TWINT))); // wait for response
|
10 | if ((TWSR & 0xF8) == TW_START) // if START was successful
|
11 | {
|
12 | TWDR = (TWI_adr | 0x01); // put slave address+READ to TWDR
|
13 | TWCR = (1<<TWINT)|(1<<TWEN); // and start transmission
|
14 | while (!(TWCR & (1<<TWINT))); // wait for response
|
15 | if ((TWSR & 0xF8) == TW_MR_SLA_ACK) // if acknowledge ok
|
16 | {
|
17 | count--;
|
18 | while (count>i) // while more than one byte to read
|
19 | {
|
20 | TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN); // then start transfer with acknowledge
|
21 | while (!(TWCR & (1<<TWINT))); // wait for response
|
22 | val[i++]=TWDR; // read databyte from TWDR
|
23 | }
|
24 | TWCR=(1<<TWINT)|(1<<TWEN); // start last byte transfer without acknowledge
|
25 | while (!(TWCR & (1<<TWINT))); // wait for response
|
26 | val[i]=TWDR; // read databyte from TWDR
|
27 | }
|
28 | else
|
29 | {
|
30 | printf_P("Error: I2C[R] Addr\n");
|
31 | }
|
32 | }
|
33 | else
|
34 | {
|
35 | printf_P("Error: I2C[R] Start\n");
|
36 | }
|
37 | TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); // transmit STOP condition
|
38 | delay_us(10); // wait until STOP is transmitted
|
39 | }
|
Der Aufruf der Funktion geschieht hiermit: void TWI_read(0x30, u08 *val,
4)
Hierbei möchte ich 4 Bytes von der Adresse 0x30 lesen. Doch was mache
ich mit dem Funktionszeiger an der Stelle?
Beim ausführen der Funktion füllt sich das Array val[] mit den Werten
des Slaves, wozu muss ich den Wert des Zeigers mitgeben?
Danke, Gruß
Matthias