Forum: Mikrocontroller und Digitale Elektronik SAM4S Xplained Pro UART1


von M. W. (rallini94)


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 ;)

von Jim M. (turboj)


Lesenswert?

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.

von M. W. (rallini94)


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

von Jim M. (turboj)


Lesenswert?

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.


Und nein, ich lese das nur gegen monetäre Unterstützung.

von M. W. (rallini94)


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 :|

von M. W. (rallini94)


Lesenswert?

Ich habs jetzt mal mit dem Code aus folgendem Beitrag versucht:

Beitrag "SAM4S Xplained UART"

aber auch das funktioniert leider nicht.

Ist hier keiner unterwegs, der sich mit den SAM Controllern auskennt und 
einem Einsteiger weiterhelfen könnte?

von M. W. (rallini94)


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
}

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.