AT32UC3B - IrDa

OP #2645124
Lesenswert?

Hallo zusammen,

ich möchte über den AT32UC3B IrDa Daten aussenden. Dazu habe ich die 
USART0 auf IrDa Mode eingestellt. Die Baudrate stimmt auch. Der 
Empfänger ist für das Senden ebenfalls abgeschalten. Leider gibt der 
Chip die Daten nicht als IrDa Pulse aus. Worauf muss ich noch achten?

Das Sind meine Einstellungen:

#define F_CPU    3686400UL
#define BAUD            115200UL
#define UBRR_VAL  ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL  (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR  ((BAUD_REAL*1000)/BAUD)

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate groesser 1% und damit zu 
hoch!
#endif

const gpio_map_t USART0_GPIO_MAP = {
  {USART0_RX_PIN, USART0_RX_FUNCTION},
  {USART0_TX_PIN, USART0_TX_FUNCTION}
};
static const usart_options_t USART0_OPTIONS = {
  .baudrate    = BAUD,
  .charlength    = 8,
  .paritytype    = USART_NO_PARITY,
  .stopbits    = USART_1_STOPBIT,
  .channelmode  = USART_NORMAL_CHMODE
};
gpio_enable_module(USART0_GPIO_MAP, sizeof(USART0_GPIO_MAP) / 
sizeof(USART0_GPIO_MAP[0]));   // Assign GPIO to USART.

usart_init_IrDA(USART0, &USART0_OPTIONS, F_CPU,1); // Initialize USART 
in IrDa mode.

USART0->mr = (USART0->mr & ~AVR32_USART_MR_MODE_MASK) | 
AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET | 
AVR32_USART_MR_FILTER_MASK;

USART0->CR.txen = 1;
USART0->CR.rxdis = 1;


Habe ich irgendetwas übersehen?

Gruß
Gast #2646787
Lesenswert?

Hallo Jan,

hab' zwar noch nie die irda von Atmel benutzt, aber die sollte doch zum 
Laufen zu  bringen sein. Bitte poste doch auch mal folgende Funktion:
1
usart_init_IrDA(USART0, &USART0_OPTIONS, F_CPU,1);

Dann schauen wir mal weiter...

VG,
Sebastian
OP #2648005
Lesenswert?

Hallo Sebastian,

danke fürs drüber schauen. Das die Sache funktionieren sollte habe ich 
mir auch gedacht. Die IrDa-Setup-Funktion ist von Atmel.

Hier der Ausschnitt der Atmel usart.c


int usart_init_IrDA(volatile avr32_usart_t *usart, const usart_options_t 
*opt,
                    long pba_hz, unsigned char irda_filter)
{
  // First: Setup standard RS232.
  if (usart_init_rs232(usart, opt, pba_hz) == USART_INVALID_INPUT)
    return USART_INVALID_INPUT;

  // Set IrDA filter.
  usart->ifr = irda_filter;

  // Set IrDA mode and activate filtering of input.
  usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) |
              AVR32_USART_MODE_IRDA << AVR32_USART_MR_MODE_OFFSET |
              AVR32_USART_MR_FILTER_MASK;

  return USART_SUCCESS;
}

int usart_init_rs232(volatile avr32_usart_t *usart, const 
usart_options_t *opt, long pba_hz)
{
  // Reset the USART and shutdown TX and RX.
  usart_reset(usart);

  // Check input values.
  if (!opt || // Null pointer.
      opt->charlength < 5 || opt->charlength > 9 ||
      opt->paritytype > 7 ||
      opt->stopbits > 2 + 255 ||
      opt->channelmode > 3 ||
      usart_set_async_baudrate(usart, opt->baudrate, pba_hz) == 
USART_INVALID_INPUT)
    return USART_INVALID_INPUT;

  if (opt->charlength == 9)
  {
    // Character length set to 9 bits. MODE9 dominates CHRL.
    usart->mr |= AVR32_USART_MR_MODE9_MASK;
  }
  else
  {
    // CHRL gives the character length (- 5) when MODE9 = 0.
    usart->mr |= (opt->charlength - 5) << AVR32_USART_MR_CHRL_OFFSET;
  }

  usart->mr |= opt->paritytype << AVR32_USART_MR_PAR_OFFSET |
               opt->channelmode << AVR32_USART_MR_CHMODE_OFFSET;

  if (opt->stopbits > USART_2_STOPBITS)
  {
    // Set two stop bits
    usart->mr |= AVR32_USART_MR_NBSTOP_2 << 
AVR32_USART_MR_NBSTOP_OFFSET;
    // and a timeguard period gives the rest.
    usart->ttgr = opt->stopbits - USART_2_STOPBITS;
  }
  else
    // Insert 1, 1.5 or 2 stop bits.
    usart->mr |= opt->stopbits << AVR32_USART_MR_NBSTOP_OFFSET;

  // Set normal mode.
  usart->mr = (usart->mr & ~AVR32_USART_MR_MODE_MASK) |
              AVR32_USART_MR_MODE_NORMAL << AVR32_USART_MR_MODE_OFFSET;

  // Setup complete; enable communication.
  // Enable input and output.
  usart->cr = AVR32_USART_CR_RXEN_MASK |
              AVR32_USART_CR_TXEN_MASK;

  return USART_SUCCESS;
}


Ich habe die Einstellungen auch schon mal manuell vorgenommen. Hatte 
auch keine Verbesserung gebracht.

VG Jan
Gast #2648358
Lesenswert?

Hallo Jan,

mmhhh auf den ersten Blick sieht alles ganz vernüftig aus.

"Leider gibt der Chip die Daten nicht als IrDa Pulse aus."

Meinst Du hiermit, dass Du keine 3/16 Pulse am TX der IRDA siehst?

Sebastian

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren