Forum: Mikrocontroller und Digitale Elektronik USART Sendet aber Empfängt nicht


von Tobias (Gast)


Lesenswert?

Hallo,

ich stehe vor dem unerklärlichen Verhalten dass mein USART-code im 
Stande ist zu Senden aber nicht zu Empfangen.

Ich habe mittlerweile:
- Das USART Modul gewechselt
- Verschiedene Baudraten durchprobiert
- RX-Pin mit TX-Pin verbunden (loopback)

Da ich vor lauter Tests und wiederholten Kontrollen den Wald vor lauter 
Bäumen nicht mehr sehe, würde ich mich freuen wenn ihr kurz drüber 
schauen könnt.
1
  //Enable Peripheral Clock of USART3
2
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_US3;
3
    
4
  //-----> Pin-configuration
5
  //Disable interrupts
6
  AT91C_BASE_PIOB->PIO_IDR = (AT91C_PB9_RXD3 | AT91C_PB8_TXD3);
7
  
8
  //Select Peripheral Function A
9
  AT91C_BASE_PIOB->PIO_ABSR &= ~(AT91C_PB9_RXD3 | AT91C_PB8_TXD3);
10
  
11
  //Disable PIO controll
12
  AT91C_BASE_PIOB->PIO_PDR = (AT91C_PB9_RXD3 | AT91C_PB8_TXD3);
13
  
14
  //-----> Modul-configuration of USART3
15
  // Reset and disable receiver & transmitter
16
  AT91C_BASE_US3->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
17
  
18
  //Configure mode
19
  AT91C_BASE_US3->US_MR = (AT91C_US_USMODE_NORMAL        //Normal Mode
20
                        |  AT91C_US_CLKS_CLOCK           //Use MCLK
21
                        |  AT91C_US_CHRL_8_BITS          //Character Length 8bit
22
                        |  AT91C_US_PAR_NONE             //No Parity
23
                        |  AT91C_US_NBSTOP_1_BIT         //1 Stop bit
24
                        |  AT91C_US_CHMODE_NORMAL);       //Channel Mode normal
25
  
26
  //Configure baudrate
27
  //Asynchronous, no oversampling
28
  AT91C_BASE_US3->US_BRGR = (133333333 / 9600) / 16;
29
    
30
  
31
  //-----> AIC-Configuration
32
  //Disable the interrupt
33
  AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_US3;
34
  
35
  //Configure mode and handler
36
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US3] = 0;
37
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US3] = (unsigned int) USART3_IrqHandler;
38
39
  //Clear interrupt
40
  AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_US3;
41
  
42
  //Enable interrupt
43
  AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_US3;
44
  
45
  //Enable Transmitter & Receiver
46
  AT91C_BASE_US3->US_CR = (AT91C_US_TXEN | AT91C_US_RXEN);
47
    
48
  //Receive Buffer setup
49
  volatile unsigned char rcv[2];
50
  //Receive Pointer Register
51
  AT91C_BASE_US3->US_RPR = (unsigned int) rcv;
52
  //Receive Count Register
53
  AT91C_BASE_US3->US_RCR = 2;
54
  //Transfer Control Register
55
  AT91C_BASE_US3->US_PTCR = AT91C_PDC_RXTEN;
56
  
57
  //Enable RXBUFF interrupt
58
  AT91C_BASE_US3->US_IER = AT91C_US_RXBUFF;
59
  
60
  
61
    
62
  //Transmit Buffer setup
63
  volatile unsigned char snd[12];
64
  snd[0] = 1;
65
  snd[1] = 2;
66
  snd[2] = 3;
67
  snd[3] = 4;
68
  snd[4] = 5;
69
  snd[5] = 6;
70
  snd[6] = 7;
71
  snd[7] = 8;
72
  snd[8] = 9;
73
  AT91C_BASE_US3->US_TPR = (unsigned int) snd;
74
  AT91C_BASE_US3->US_TCR = 9;
75
  AT91C_BASE_US3->US_PTCR = AT91C_PDC_TXTEN;
76
  
77
  
78
  volatile unsigned int status = 0;
79
  do
80
  {
81
    status = AT91C_BASE_US3->US_CSR;
82
  }while(!(status & 0x1));


Die Zeichenfolge [0..9] wird erfolgreich über ein CP2102 auf meiner 
Konsole am PC angezeigt. Auch bei sehr hohen Baudraten.

Es handelt sich um einen AT91SAM9G45 CPU welche einen MCLK von 133,3MHZ 
besitzt. Das USART-Peripheriemodul sollte allerdings in vielen Modellen 
von ATMEL verbaut sein.

Vorab vielen Dank

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.