www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMeaga8 TWI Slave blockiert


Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
  while(1)
  {
    uint8_t ret;
    ret = i2c_start(0x10+I2C_READ);       // set device address and write mode
    if(ret)
    {
      i2c_stop();
      uart_putcc("Failed to read!\r\n");
    }
    else
    {
      if(i2c_readAck()!=2) uart_putc('E');
      if(i2c_readAck()!=2) uart_putc('E');
      if(i2c_readAck()!=2) uart_putc('E');
      if(i2c_readAck()!=2) uart_putc('E');
      if(i2c_readAck()!=2) uart_putc('E');
      if(i2c_readNak()!=2) uart_putc('E');
      i2c_stop();
      uart_putc('r');
    }
    sleep_10ms(100);
  }

Slave:
#include "TWISlave.h"

uint8_t counter;
uint8_t sender;
uint8_t volatile watchdog;

void twi_init()
{
  TWAR= 0x10; //Adresse setzen
  TWCR &= ~(1<<TWSTA)|(1<<TWSTO);
  TWCR|= (1<<TWEA) | (1<<TWEN)|(1<<TWIE);
  
  //fifo_init(&twi_fifo_out,  twi_buffer_out,  TWI_BUFFERSIZE_OUT);
  //fifo_init(&twi_fifo_in,  twi_buffer_in,  TWI_BUFFERSIZE_IN);
  watchdog=0;
  counter=0;
  sender=0;
}

ISR(TWI_vect)
{
  uint8_t data, event;
  event=TWSR & 0xF8;
  switch (event)
  {
    case 0x00: // Error detected
      counter++;
      uart_putcc("TWI: Error!\r\n");
      break;

    /* Transmitter */
    case TW_ST_DATA_NACK: // last byte send, NACK received
      TWDR=0x01;
      TWCR_ACK;
      uart_putc('w');
      break;
    case TW_ST_SLA_ACK:   // slave was adressed, Master wants to read first byte
      counter=0;
      uart_putc('a');
    case TW_ST_DATA_ACK:  // master wants to read next byte...
      TWDR=0x02;
      counter++;
      TWCR_ACK
      uart_putc('s');
      break;
    case TW_ST_LAST_DATA: //0xC8  last data byte in TWDR has been transmitted (TWEA = 0); ACK has been received
      //TWDR=0x03;
      TWCR_ACK;
      uart_putc('l');
      break;

    /* Reciver */
    case TW_SR_SLA_ACK: // 0x60 slave was adressed as receiver, no byte send yet
      TWCR_ACK;
      break;
    case TW_SR_DATA_ACK:   // got data from master
      data=TWDR;
      TWCR_ACK
      //fifo_put(&twi_fifo_in, data);
      break;
    case TW_SR_DATA_NACK: //0x88
    case TW_SR_STOP:
      TWCR_ACK
      break;
    default:
      counter++;
      uart_putcc("TWI: unknown event: ");
      uart_puti(event);
      uart_putcc("\r\n");
      break;
  }
}

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

Autor: TWI Master (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Fabian S. (jacky2k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohh cool, die kannte ich noch garnicht. Vielen Dank erstmal, hab sie 
schon ausgedruckt und werde sie mir gleich reinziehen ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.