Forum: Mikrocontroller und Digitale Elektronik TWIM mit AT32UC3C


von Jerome M. (Gast)


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.
1
uint8_t data[1] = { 0 };
2
twim_write (twim,data,0,chip_addr,0);
3
 .
4
 .
5
 .
6
7
status_code_t twim_write (volatile avr32_twim_t *twim, uint8_t const *buffer,
8
    uint32_t nbytes, uint32_t saddr, bool tenbit)
9
{
10
  // Reset the TWIM module to clear the THR register
11
  twim->cr = AVR32_TWIM_CR_MEN_MASK;
12
  twim->cr = AVR32_TWIM_CR_SWRST_MASK;
13
  twim->cr = AVR32_TWIM_CR_MDIS_MASK;
14
  // Set pointer to TWIM instance for IT
15
  twim_inst = twim;
16
  // Disable the TWIM interrupts
17
  twim_disable_interrupt (twim_inst);
18
  // get a pointer to applicative data
19
  twim_tx_data = buffer;
20
  // set the number of bytes to transmit
21
  twim_tx_nb_bytes = nbytes;
22
  // Set next transfer to false
23
  twim_next = false;
24
  // Initialize bus transfer status
25
  transfer_status = TWI_SUCCESS;
26
  // set the command to start the transfer
27
  twim_inst->cmdr = (saddr << AVR32_TWIM_CMDR_SADR_OFFSET)
28
      | (nbytes << AVR32_TWIM_CMDR_NBYTES_OFFSET)
29
      | (AVR32_TWIM_CMDR_VALID_MASK)
30
      | (AVR32_TWIM_CMDR_START_MASK)
31
      | (AVR32_TWIM_CMDR_STOP_MASK)
32
      | ((tenbit ? 1 : 0) << AVR32_TWIM_CMDR_TENBIT_OFFSET)
33
      | (0 << AVR32_TWIM_CMDR_READ_OFFSET);
34
  // mask NACK and TXRDY interrupts
35
  twim_it_mask = AVR32_TWIM_IER_NAK_MASK | AVR32_TWIM_IER_TXRDY_MASK;
36
  // update IMR through IER
37
  twim_inst->ier = twim_it_mask;
38
  // Enable master transfer
39
  twim_inst->cr = AVR32_TWIM_CR_MEN_MASK;
40
  // Enable all interrupts
41
  cpu_irq_enable ();
42
  // send data
43
  while (!(transfer_status) && !(twim_status ())) {
44
    cpu_relax();
45
  }
46
#if AVR32_TWIM_H_VERSION > 101  // Removed in twim100 module due to IC bug
47
  // Disable master transfer
48
  twim->cr = AVR32_TWIM_CR_MDIS_MASK;
49
#endif
50
  if (transfer_status == TWI_RECEIVE_NACK
51
      || transfer_status == TWI_ARBITRATION_LOST) {
52
    return ERR_IO_ERROR;
53
  }
54
  return STATUS_OK;
55
}

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

von Manu (Gast)


Lesenswert?

Ich vermute den Fehler Jerômé

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.