SAM4S Xplained Pro UART1

OP #5039063
Lesenswert?

Hallo Leute,

ich beginne gerade mich in ARM Controller einzuarbeiten und habe mir 
dafür ein SAM4S Xplained Pro Board gekauft.
Dieses kann laut User Manual über den UART 1 und den EBDG einen 
virtuellen COM Port aufbauen und mit dem PC kommunizieren. Dies habe ich 
nun versucht zu realisieren, scheitere aber leider.
Ich konnte leider kaum Beispiele finden und wenn dann nur welche, die 
mit dem ASF von Atmel arbeiten, was ich nicht möchte (ich möchte es 
gerne auf Register Ebene verstehen).

Unten mein Code:
1
#include "sam.h"
2

3
void init_vCOM();
4
void vCOM_sendByte(char c);
5

6

7
void init_vCOM()
8
{
9
  
10
//  PMC->PMC_PCER0 |= (1<<ID_PIOB);                // Power für Port B
11
//  PIOB->PIO_PER |= PIO_PB2 | PIO_PB3;              // Pins Enablen
12
//  PIOB->PIO_OER |= PIO_PB3;                  // PB3 aus Output
13

14
  // Pins auf Peripherie A stellen
15
  PIOB->PIO_ABCDSR[0] &= ~(PIO_PB2A_URXD1 | PIO_PB3A_UTXD1);
16
  PIOB->PIO_ABCDSR[1] &= ~(PIO_PB2A_URXD1 | PIO_PB3A_UTXD1);
17

18
  PMC->PMC_PCER0 |= (1<<ID_UART1);              // Power für UART1 aktivieren
19

20
  UART1->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;    // erstmal alles aus un resetten
21
  UART1->UART_BRGR = 781;                    // Baud auf 9.600
22
  UART1->UART_MR = UART_MR_CHMODE_NORMAL | UART_MR_PAR_NO;  // Normaler Modus, keine Parity  
23
  UART1->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;    // kein DMA
24
  UART1->UART_CR = UART_CR_TXEN | UART_CR_RXEN;        // Transmitter und Reciever enabeln
25
      
26
  
27
  // Fertig?
28
}
29

30
void vCOM_sendByte(char c)
31
{
32
  while (!(UART1->UART_SR & UART_SR_TXRDY))    // Bereit?
33
  {
34
  }
35
  UART1->UART_THR = c;              // Daten in den Transmitter laden- Begintt automatisch zu senden
36
  while (!(UART1->UART_SR & UART_SR_TXEMPTY))    // Solange noch nicht fertig gesendet, warten
37
  {
38
  }
39
}

Wie gesagt ich bin neue in der ARM Architektur. Habe ich irgendwas 
vergessen zu aktivieren/mit einem Takt zu versehen? Wie man sieht habe 
ich schon versucht noch mit dem PIOB zu arbeiten (Kommentare), hat aber 
auch nichts geholfen. Ist bestimmt nur ein kleiner Fehler bzw. eine 
Kleinigkeit die fehlt.

Wäre schön, wenn mir die Profis weiterhelfen würden.

Danekschön ;)
OP #5039439
Lesenswert?

Jim M. schrieb:
> M. W. schrieb:
>> Habe ich irgendwas
>> vergessen zu aktivieren/mit einem Takt zu versehen?
>
> Woher sollen wir das wissen? Meine Glaskugel ist in Reparatur.
>
> Die Wahrscheinlichkeit ist aber nahezu 1, denn UART braucht i.d.R. den
> Quarz.

Nun, ich ging davon aus, dass die Zeile
1
  PMC->PMC_PCER0 |= (1<<ID_UART1);              // Power für UART1 aktivieren
den Takt für den UART generell freischaltet und dieser dann vom 
Buadratengenerator heruntergeteilt wird. Die Frage war mehr, ob es noch 
einen weiteren Takt benötigt. Wie gesagt, ich bin neu in der ARM 
Programmierung
OP #5039760
Lesenswert?

Jim M. schrieb:
> Die Clock-Trees moderner ARM µCs sind so komplex, das sie i.d.R. ein
> eigenes Kapitel im Handbuch/Reference Manual haben. Das sollte man mal
> lesen.

Nach eben diesem Kapitel muss man meines Erachtens nach nur den Clock 
per
1
  PMC->PMC_PCER0 |= (1<<ID_UART1);              // Power für UART1 aktivieren

aktivieren.

Ansonsten kann ich kein Fehler erkennen. Ich hab mir auch die Beispiele, 
die man mit Atmels ASF findet angeguckt. Wenn man dann deren Code auf 
die Register Beschreibungen reduziert, komme ich auf meinen Code. Bin 
echt ratlos :|
OP #5041832
Lesenswert?

Ich hab's jetzt doch endlich selbst geschafft! Wuhu!!!

Ich hatte wohl zwei Probleme:

1. Der EBDG auf dem SAM4S Xplained Pro Board muss erstmal mit einem über 
die zugehörige COM Schnittstelle gesendeten DTR Signal in den Modus 
versetzt werden, dass die Daten, die er vom SAM4S über den UART 1 
bekommt, auch an den PC weitergeleitet werden.
Das macht mein TerminalProgramm (Hterm) nicht automatisch. Das 
Terminal-Extension von Atmel Studio zum Beispiel schon

2. Aber die Wohl entscheidene Zeile istfolgende
1
  // PIO disablen für PB2 und PB3
2
  PIOB->PIO_PDR |= PIO_PB2 | PIO_PB3;

Ich dachte, dass der Grundzustand derjenige wäre, dass die PIOs die 
Signale der Peripherie (ohne weitere Wahl die Peripherie A) an die Pins 
weiterleiten. Ich dachte nicht, dass man noch extra die PIOs für den Pin 
disablen muss.


Achso hier nochmal mein endgültiger Code, um mit dem UART1 des SAM4s ein 
einzelnes Zeichen zu senden. Eventuell braucht es ja später nochmal wer:
1
void init_vCOM();
2
void vCOM_sendByte(char c);
3

4

5
void init_vCOM()
6
{
7
  // PIO disablen für PB2 und PB3
8
  PIOB->PIO_PDR |= PIO_PB2 | PIO_PB3;
9
  
10
  // Peripherie A einstellen
11
  PIOB->PIO_ABCDSR[0] &= ~(PIO_PB2A_URXD1 | PIO_PB3A_UTXD1);
12
  PIOB->PIO_ABCDSR[1] &= ~(PIO_PB2A_URXD1 | PIO_PB3A_UTXD1);
13
  
14
  // UART1 Clock aktivieren
15
  PMC->PMC_PCER0 |= (1<<ID_UART1);              // Power für UART1 aktivieren
16
  
17
  // UART1 configurieren
18
  UART1->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;    // erstmal alles aus und resetten
19
  UART1->UART_BRGR = 781;                    // Baud auf 9.600
20
  UART1->UART_MR = UART_MR_CHMODE_NORMAL | UART_MR_PAR_NO;  // Normaler Modus, keine Parity  
21
  UART1->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;    // kein DMA
22
  UART1->UART_CR = UART_CR_TXEN | UART_CR_RXEN;        // Transmitter und Reciever enabeln
23
      
24
}
25

26
void vCOM_sendByte(char c)
27
{
28
  while (!(UART1->UART_SR & UART_SR_TXRDY))    // Bereit?
29
  {
30
  }
31
  UART1->UART_THR = c;              // Daten in den Transmitter laden- Begintt automatisch zu senden
32
  while (!(UART1->UART_SR & UART_SR_TXEMPTY))    // Solange noch nicht fertig gesendet, warten
33
  {
34
  }
35
}

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