ATMeaga8 TWI Slave blockiert

OP #1489529
Hallo,
ich habe hier mal wieder ein herbes Problem mit TWI. Kommunizieren 
sollen zwei ATMega8 untereinander (später auch mehr). Für den Master 
verwende ich die Lib von Peter Fleury.
Den Slave habe ich Interruptbasiert selbst geschrieben.

Master:
1
  while(1)
2
  {
3
    uint8_t ret;
4
    ret = i2c_start(0x10+I2C_READ);       // set device address and write mode
5
    if(ret)
6
    {
7
      i2c_stop();
8
      uart_putcc("Failed to read!\r\n");
9
    }
10
    else
11
    {
12
      if(i2c_readAck()!=2) uart_putc('E');
13
      if(i2c_readAck()!=2) uart_putc('E');
14
      if(i2c_readAck()!=2) uart_putc('E');
15
      if(i2c_readAck()!=2) uart_putc('E');
16
      if(i2c_readAck()!=2) uart_putc('E');
17
      if(i2c_readNak()!=2) uart_putc('E');
18
      i2c_stop();
19
      uart_putc('r');
20
    }
21
    sleep_10ms(100);
22
  }

Slave:
1
#include "TWISlave.h"
2

3
uint8_t counter;
4
uint8_t sender;
5
uint8_t volatile watchdog;
6

7
void twi_init()
8
{
9
  TWAR= 0x10; //Adresse setzen
10
  TWCR &= ~(1<<TWSTA)|(1<<TWSTO);
11
  TWCR|= (1<<TWEA) | (1<<TWEN)|(1<<TWIE);
12
  
13
  //fifo_init(&twi_fifo_out,  twi_buffer_out,  TWI_BUFFERSIZE_OUT);
14
  //fifo_init(&twi_fifo_in,  twi_buffer_in,  TWI_BUFFERSIZE_IN);
15
  watchdog=0;
16
  counter=0;
17
  sender=0;
18
}
19

20
ISR(TWI_vect)
21
{
22
  uint8_t data, event;
23
  event=TWSR & 0xF8;
24
  switch (event)
25
  {
26
    case 0x00: // Error detected
27
      counter++;
28
      uart_putcc("TWI: Error!\r\n");
29
      break;
30

31
    /* Transmitter */
32
    case TW_ST_DATA_NACK: // last byte send, NACK received
33
      TWDR=0x01;
34
      TWCR_ACK;
35
      uart_putc('w');
36
      break;
37
    case TW_ST_SLA_ACK:   // slave was adressed, Master wants to read first byte
38
      counter=0;
39
      uart_putc('a');
40
    case TW_ST_DATA_ACK:  // master wants to read next byte...
41
      TWDR=0x02;
42
      counter++;
43
      TWCR_ACK
44
      uart_putc('s');
45
      break;
46
    case TW_ST_LAST_DATA: //0xC8  last data byte in TWDR has been transmitted (TWEA = 0); ACK has been received
47
      //TWDR=0x03;
48
      TWCR_ACK;
49
      uart_putc('l');
50
      break;
51

52
    /* Reciver */
53
    case TW_SR_SLA_ACK: // 0x60 slave was adressed as receiver, no byte send yet
54
      TWCR_ACK;
55
      break;
56
    case TW_SR_DATA_ACK:   // got data from master
57
      data=TWDR;
58
      TWCR_ACK
59
      //fifo_put(&twi_fifo_in, data);
60
      break;
61
    case TW_SR_DATA_NACK: //0x88
62
    case TW_SR_STOP:
63
      TWCR_ACK
64
      break;
65
    default:
66
      counter++;
67
      uart_putcc("TWI: unknown event: ");
68
      uart_puti(event);
69
      uart_putcc("\r\n");
70
      break;
71
  }
72
}

Nach ein paar Übertragungen (i.d.R. 4) friert alles ein und nichts 
passiert mehr. SDA und SCL liegen auf Low, wenn ich den Master rausziehe 
sind sie immernoch auf Low, wenn ich dann noch den Slave rausziehe nicht 
mehr, also muss der Slave Mist bauen würde ich sagen.
Kann jemand da was erkennen? Bin am verzweifeln :(

Edit:
Ausgabe Slave: asssssswasssssswasssssswassssssw
Ausgabe Master: rrrr
Gast #1489598
Moin,

AVR Application Notes AVR311/315 durcharbeiten und Stück für Stück auf 
deine Bedürfnisse anpassen. Auf Basis der 2 Beispiele ist hier ein 
Multimaster System entstanden, das im produktiven Einsatz noch keine 
Probleme machte.

viel Erfolg.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.