Forum: Mikrocontroller und Digitale Elektronik Initialisierung des USART AVR32 UC3A0512


von Stefan (Gast)


Lesenswert?

Hallo
Ich versuche seit Tagen  die Asynchrone Schnittstelle des AVR32 UC3A0512 
zu Initialisieren. Kann mir vielleicht jemand sagen was Ich falsch mache 
und wieso ich die Bits RXEN TXEN im Control Register nicht setzen kann??

Die Baudrate ist für mich erst mal unwichtig. Ich will zuerst überhaupt 
irgendwelche Zeichen mit Oszilloskop am Transmitter messen können.

#include <uc3a0512.h>
#include <asf.h>

int main (void)
{

          board_init();
          int clock = 24;
          int clockh = (clock/6) - 1;

          AVR32_PM.oscctrl0 = (AVR32_PM.oscctrl0 | 0x00000407);
          AVR32_PM.mcctrl = AVR32_PM_OSC0EN_MASK;
          while((AVR32_PM.poscsr & AVR32_PM_POSCSR_OSC0RDY_MASK)== 0);

          AVR32_PM.pll[0] =  0 << AVR32_PM_PLLOSC_OFFSET |
                    1 << AVR32_PM_PLLDIV_OFFSET |
                    clockh << AVR32_PM_PLLMUL_OFFSET |
                    5 << AVR32_PM_PLLOPT_OFFSET;
          AVR32_PM.cksel = 0x00000000;
          AVR32_PM.pll[0] |= AVR32_PM_PLLEN_MASK;
          while(!(AVR32_PM.poscsr & AVR32_PM_POSCSR_LOCK0_MASK));

          AVR32_FLASHC.fcr |= 1 << AVR32_FLASHC_FWS_OFFSET;
          AVR32_PM.mcctrl |= 2 << AVR32_PM_MCSEL_OFFSET;



          AVR32_USART1.idr = 0xFF0FFFFF;
          AVR32_USART1.mr = 0;
          AVR32_USART1.rtor = 0;
          AVR32_USART1.ttgr = 0;

          AVR32_USART1.CR.rstrx |= AVR32_USART_CR_RSTRX_MASK;
          AVR32_USART1.CR.rsttx |= AVR32_USART_CR_RSTTX_MASK;
          AVR32_USART1.CR.rststa |= AVR32_USART_CR_RSTSTA_MASK;
          AVR32_USART1.CR.rstit |= AVR32_USART_CR_RSTIT_MASK;
          AVR32_USART1.CR.rstnack |= AVR32_USART_CR_RSTNACK_MASK;
          AVR32_USART1.CR.dtrdis |= AVR32_USART_CR_DTRDIS_MASK;
          AVR32_USART1.CR.rtsdis |= AVR32_USART_CR_RTSDIS_MASK;

          AVR32_USART1.BRGR.cd |= 26;
          AVR32_USART1.MR.chrl |= AVR32_USART_CHRL_8;
          AVR32_USART1.MR.chmode |= AVR32_USART_MR_CHMODE_NORMAL;
          AVR32_USART1.MR.nbstop |= AVR32_USART_MR_NBSTOP_2;
          AVR32_USART1.MR.par |= AVR32_USART_MR_PAR_NONE;
          AVR32_USART1.MR.over |= AVR32_USART_OVER_MASK;


          AVR32_USART1.CR.rxen |= AVR32_USART_CR_RXEN_MASK;
          AVR32_USART1.CR.txen |= AVR32_USART_CR_TXEN_MASK;

          AVR32_GPIO.port[0].oderc |= 0b01100000; // Ausgang ausschalten
          AVR32_GPIO.port[0].puers |= 0b01000000; // Pull-up Einschalten 
für TX
          AVR32_GPIO.port[0].gpers |= 0b01100000;  // GPIO Ein
          AVR32_GPIO.port[0].pmr0c |= 0b01100000; // Funktion A
          AVR32_GPIO.port[0].pmr1c |= 0b01100000; // Funktion A
          AVR32_GPIO.port[0].gperc |= 0b01100000; // Perepherie Ein



  while(1){


    AVR32_USART1.thr |= 0b10101010;
    while ((AVR32_USART1.csr & AVR32_USART_CSR_TXEMPTY_MASK) == 0){}


  }
}

von cskulkw (Gast)


Lesenswert?

Stefan schrieb:
> AVR32_GPIO.port[0].oderc |= 0b01100000; // Ausgang ausschalten
>
>           AVR32_GPIO.port[0].puers |= 0b01000000; // Pull-up Einschalten
>
> für TX
>
>           AVR32_GPIO.port[0].gpers |= 0b01100000;  // GPIO Ein
>
>           AVR32_GPIO.port[0].pmr0c |= 0b01100000; // Funktion A
>
>           AVR32_GPIO.port[0].pmr1c |= 0b01100000; // Funktion A
>
>           AVR32_GPIO.port[0].gperc |= 0b01100000; // Perepherie Ein

die Portregister sind 32 Bit breit. Also PC-Lint bzw. eine 
MIRSRA-Checker würde das monieren, auch wenn es syntaktisch nicht zu 
beanstanden wäre.

Besser ist es mit 32-Bit-masken zu verordern.

Aber warum benutzt Du das ASF nicht. Auch wenn es nicht der Hit ist, zum 
schnell an den Start kommen, ist es recht brauchbar. Da gibt es dann 
auch genügend funktionieren Beispiele für die UART.

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.