Forum: Mikrocontroller und Digitale Elektronik TWI Raspberry Empfangsproblem


von ReduX69 (Gast)


Lesenswert?

Abend,

ich habe hier einen Atmega48 und ein Raspberry Pi, welche ich per TWI 
verbinden möchte. Da ich in dem Gebiet noch nicht so bewandert bin, habe 
ich mir via Google diverse Codeschnipsel dazu angesehen. Meine Interrup 
Routine sieht nun folgendermaßen aus (Atmega=Slave):
1
ISR (TWI_vect)
2
{
3
  uint8_t data=0;
4
  switch (TW_STATUS)
5
  {
6
    case TW_SR_SLA_ACK:
7
    TWCR_ACK;
8
    buff_adr = 0xFF;
9
    break;
10
    case TW_SR_DATA_ACK:
11
    data=TWDR;
12
    if(buff_adr == 0xff) {
13
      if(data < buff_size+1) {
14
        buff_adr = data;
15
      }
16
    } else {
17
      switch(buff_adr) {
18
        case 0x00: //Adresse 0x00
19
        twi_data[0] = data; //Schreibe Daten nach 0x00
20
        break;
21
        case 0x01:
22
        twi_data[1] = data;
23
        break;
24
        case 0x02:
25
        twi_data[2] = data;
26
        break;
27
      }
28
    buff_adr = 0xff;
29
    }
30
    TWCR_ACK;
31
    break;
32
    case TW_ST_SLA_ACK:
33
    case TW_ST_DATA_ACK:
34
    if((buff_adr != 0xff) && (buff_adr < buff_size+1)) {
35
      switch(buff_adr) {
36
        case 0x00:
37
        TWDR = twi_data[0];
38
        break;
39
        case 0x01:
40
        TWDR = twi_data[1];
41
        break;
42
        case 0x02:
43
        TWDR = twi_data[2];
44
        break;
45
        default:
46
        TWDR = 0;
47
        break;
48
      }
49
    buff_adr = 0xff;
50
    } else {
51
      TWDR = 0;
52
    }
53
    TWCR_ACK;
54
    break;
55
    case TW_SR_STOP:
56
    TWCR_ACK;
57
    break;
58
    case TW_ST_DATA_NACK:
59
    case TW_SR_DATA_NACK:
60
    case TW_ST_LAST_DATA:
61
    default:
62
    TWCR_RESET;
63
    break;
64
    
65
  } 
66
}

Raspberry seitig nutze ich die i2c-Tools.
Das Schreiben funktioniert ohne Probleme, jedoch wenn ich "i2cget -y 1 
TWI-ADRESSE REGISTER" ausführe, bekomme ich ein "Error: Read failed".
Führe ich dannach den Befehl ohne REGISTER aus, wird der korrekte Wert 
ausgeliefert! Lässt man den ersten Befehl komplett weg, wird die 
Variable buff_adr aber nicht gesetzt. Normalerweise müsste er doch wie 
bei dem Befehl i2cset handeln und zuerst buff_adr setzen und dannach den 
2. Interrupt auslösen?

Wo liegt hier das Problem? Habe ich etwas Elementares beim TWI Protokoll 
übersehen?


MfG ReduX69

von ReduX69 (Gast)


Lesenswert?

Hat den keiner eine Idee woran es liegen könnte?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.