mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik TWIM mit AT32UC3C


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Jerome M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich verwende den AT32UC3C 32 Bit Mikrocontroller von Atmel. Darauf 
versuche ich z.Z. das I2C zum laufen zu bringen. Für die Initialisierung 
verwende ich das Software Treiber Beispiel in der ASF vom Atmel Studio 
twim.c und twim.h.
Bei der Initialisierung geht alles gut, bis die ersten Dummy Daten 
gesendet werden.

uint8_t data[1] = { 0 };
twim_write (twim,data,0,chip_addr,0);
 .
 .
 .

status_code_t twim_write (volatile avr32_twim_t *twim, uint8_t const *buffer,
    uint32_t nbytes, uint32_t saddr, bool tenbit)
{
  // Reset the TWIM module to clear the THR register
  twim->cr = AVR32_TWIM_CR_MEN_MASK;
  twim->cr = AVR32_TWIM_CR_SWRST_MASK;
  twim->cr = AVR32_TWIM_CR_MDIS_MASK;
  // Set pointer to TWIM instance for IT
  twim_inst = twim;
  // Disable the TWIM interrupts
  twim_disable_interrupt (twim_inst);
  // get a pointer to applicative data
  twim_tx_data = buffer;
  // set the number of bytes to transmit
  twim_tx_nb_bytes = nbytes;
  // Set next transfer to false
  twim_next = false;
  // Initialize bus transfer status
  transfer_status = TWI_SUCCESS;
  // set the command to start the transfer
  twim_inst->cmdr = (saddr << AVR32_TWIM_CMDR_SADR_OFFSET)
      | (nbytes << AVR32_TWIM_CMDR_NBYTES_OFFSET)
      | (AVR32_TWIM_CMDR_VALID_MASK)
      | (AVR32_TWIM_CMDR_START_MASK)
      | (AVR32_TWIM_CMDR_STOP_MASK)
      | ((tenbit ? 1 : 0) << AVR32_TWIM_CMDR_TENBIT_OFFSET)
      | (0 << AVR32_TWIM_CMDR_READ_OFFSET);
  // mask NACK and TXRDY interrupts
  twim_it_mask = AVR32_TWIM_IER_NAK_MASK | AVR32_TWIM_IER_TXRDY_MASK;
  // update IMR through IER
  twim_inst->ier = twim_it_mask;
  // Enable master transfer
  twim_inst->cr = AVR32_TWIM_CR_MEN_MASK;
  // Enable all interrupts
  cpu_irq_enable ();
  // send data
  while (!(transfer_status) && !(twim_status ())) {
    cpu_relax();
  }
#if AVR32_TWIM_H_VERSION > 101  // Removed in twim100 module due to IC bug
  // Disable master transfer
  twim->cr = AVR32_TWIM_CR_MDIS_MASK;
#endif
  if (transfer_status == TWI_RECEIVE_NACK
      || transfer_status == TWI_ARBITRATION_LOST) {
    return ERR_IO_ERROR;
  }
  return STATUS_OK;
}


Das Programm bleibt in der while Schleife, bis der Interrupt ausgelöst 
wird. Dieser löst jedoch _handle_Unrecoverable_Exception: aus. Wo das 
Programm hängen bleibt. Soweit ich das erkannt habe wird der Interrupt 
jedoch im init richtig initialisiert und sollte 
twim_master_interrupt_handler auslösen.

Muss ich den TWIM Interrupt selber noch irgendwo abfangen oder 
definieren?

Lg
Jérôme

Autor: Manu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute den Fehler Jerômé

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.