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ß
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
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
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
Guten Morgen, richtig. Ich bekommen nur normale RS232 Pegel. Normal sollte ja anstatt der NULL ein 3/16 Puls kommen und für die EINS nichts (also ein Low-Pegel). Gru? Jan
Hallo zusammen, es hat sich geklärt. Die USART0 ist nicht geeignet für IrDa nur die USART1. Das hat mir gerade Atmel geschrieben. Gruß Jan
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.