Einen wunderschönen Samstag Vormittag wünsche ich euch,
hab da gerade noch ein kleines Verständnissproblem beim TWI. Nach
folgendem Schema von Peter Fleury übertrage ich bisher meine Daten vom
Master zum Slave:
1 | // übertrage Motorgeschwindigkeit
|
2 | i2c_start_wait(Motor_1 + I2C_WRITE); // set device address and write mode
|
3 | i2c_write(Motor_Speed); // write address = 5
|
4 | i2c_write(0x75);
|
5 | i2c_stop(); // set stop conditon = release bus
|
Wie kann ich diese Daten nun mit meinem Slave auslesen? Hier der Code in
dem ich auslese:
1 | ISR (TWI_vect) //Wird ausgelöst wenn der Master etwas senden will.
|
2 | //############################################################################
|
3 | {
|
4 | switch (TWSR & 0xF8) //TW_STATUS
|
5 | {
|
6 | //Adresse empfangen
|
7 | case TW_SR_SLA_ACK: /*TW_SR_SLA_ACK = SLA+W received, ACK returned.
|
8 | Also "MT-Kommando SLA+W" wurde empfangen und
|
9 | es wurde mit Acknowledge geantwortet*/
|
10 | TWCR |= (1<<TWINT); /*Löschen des für die TWI Übertragung nötigen
|
11 | Interruptflags.*/
|
12 | return; //Interrupt verlassen
|
13 |
|
14 | //Daten empfangen
|
15 | case TW_SR_DATA_ACK: /*TW_SR_DATA_ACK = data received, ACK returned.
|
16 | Vom Master gesendete Daten wurden empfangen
|
17 | und es wurde mit Acknowledge geantwortet*/
|
18 |
|
19 | Motor_Speed = TWDR; /*Übertragen der Daten*/
|
20 |
|
21 |
|
22 | TWCR |= (1<<TWINT); /*Löschen des für die TWI Übertragung nötigen
|
23 | Interruptflags.*/
|
24 |
|
25 | i2c_timeout = 0; /*Variable "i2c_timeout" wird auf "0" gesetzt.
|
26 | Also zurückgesetzt.*/
|
27 |
|
28 | return; //Interrupt verlassen
|
Momentan überschreibt er den zuvor übermittelten Wert? Wie also mehere
Bytes nacheinander empfangen?
Sorry falls ich mich grad ein bissel dämlich anstelle, aber ich seh da
grad echt nicht durch.
Gruß Andi