Forum: FPGA, VHDL & Co. NiosII - Änderung der UART-Baudrate


von Luggi S. (mmpls)


Lesenswert?

Hi,

ich habe nach einigem Hin und Her nun endlich mein UART auf dem NEEK zum 
Laufen gebracht. Jetzt komm ich aber wieder nicht mehr weiter:

Habe meinem SoPC-System den Altera UART-Controller hinzugefügt (Kreuz 
bei "...change baudrate per SW..." und möchte jetzt in meinem 
NiosII-C-Programm die Baudrate ändern. Dies mache ich so:
1
 
2
#include <stdio.h>
3
#include <string.h>
4
#include <system.h>
5
#include <altera_avalon_uart_regs.h>
6
7
int main()
8
{
9
    FILE* fp;
10
    char prompt;
11
    char* ende = "Ende";
12
    int divi = 3472;        //soll Baudrate von 14400 ergeben (divisor=(clock/baudrate)+0,5)
13
   
14
    IOWR_ALTERA_AVALON_UART_DIVISOR(UART_NAME, divi);
15
    fp = fopen ("/dev/uart", "r+b");  //Open file for reading and writing
16
    if(fp)  
17
    {
18
        printf("fopen hat funktioniert\n");
19
        printf("2. Versuch printf()\n");
20
                
21
        while(prompt != 'a')        //bis irgendwann ein 'a' empfangen wird
22
                {
23
                    prompt = getc(fp);      //Lese von UART
24
                                            //gib den gelesenen Wert auf UART wieder aus
25
                                            //Rückgabewert der putc() zur Konsole
26
                    printf("Rückgabe der putc-Funktion: %c\n", (char)putc((int)prompt, fp));
27
                }
28
        printf("Jetzt wurde a empfangen");
29
        fwrite(ende, strlen(ende), 1, fp);
30
    }
31
    else
32
    {
33
        printf("Fehler beim Öffnen\n");
34
        fclose(fp);
35
    }  
36
  return 0;
37
}

Jetzt passiert folgendes:
Ändere das Divisor-Reg über IOWR_ALTERA..., so funktioniert das darauf 
folgende printf ("fopen hat...") nicht, auf der Konsole erscheint ein 
merkwürdiges Sonderzeichen, das ich nichtmal in der ASCII-Tab finden 
kann. Das zweite printf("2.Versuch...") funktioniert dann.
Meiner eigentlichen Absicht - dem Ändern der Baudrate - wird der Code 
aber auch nicht gerecht. Stell ich am Terminal-Prog 14400 ein, so kommt 
nur Müll bei der Kommunikation raus, stell ichs auf 9600 (Default im 
SoPC-Builder), funzt es einwandfrei.

Ich hab schon begriffen, dass man die Register wohl nicht direkt 
ansprechen sollte, sondern über Treiber hantieren soll, aber wie das 
geht, versteh ich nich...

Freu mich auf Eure Hilfe,
Grüße, Luggi.

von Duke Scarring (Gast)


Lesenswert?

> Ändere das Divisor-Reg über IOWR_ALTERA..., so funktioniert das darauf
> folgende printf ("fopen hat...") nicht, auf der Konsole erscheint ein
> merkwürdiges Sonderzeichen, das ich nichtmal in der ASCII-Tab finden
> kann.
Das sieht nach falscher Baudrate aus. Hast Du auch in deinem 
Terminalprogramm die Baudrate umgestellt?

> Das zweite printf("2.Versuch...") funktioniert dann.
Also dann doch noch die richtige Baudrate. Hmm, eventuell musst Du erst 
einen Puffer leeren (flush o.ä).

Schau Dir übrigens mal den ersten google-Treffer mit 
IOWR_ALTERA_AVALON_UART_DIVISOR an.


Duke

von Luggi S. (mmpls)


Lesenswert?

Hallo Duke,

danke für Deine Antwort!

> Das sieht nach falscher Baudrate aus. Hast Du auch in deinem
> Terminalprogramm die Baudrate umgestellt?
Das hielt ich nicht für nötig, printf() wirkt doch auf stdout, dieser 
ist in syslib-proberties mit JTAG verknüpft (geht dann über den 
USB-Blaster auf meinen PC).
War von mir vielleicht etwas blöd ausgedrückt, also mit printf() 
schreibe ich über stdout->jtag->usbblaster auf die NiosIDE-Console, mit 
putc(...,fp) und fwrite(...,fp) auf UART->RS232->PC->Terminalprogramm

> Also dann doch noch die richtige Baudrate. Hmm, eventuell musst Du erst
> einen Puffer leeren (flush o.ä).
Auf die Idee einen Puffer zu leeren kam ich noch nicht, hättest Du da 
konkretere Tipps, kann mir da grad noch nichts so recht vorstellen.

> Schau Dir übrigens mal den ersten google-Treffer mit
> IOWR_ALTERA_AVALON_UART_DIVISOR an.
Ja das hab ich mir auch schon gegeben, habs aber noch gar nicht 
probiert, weils mir wiederstrebt irgendeinen Code einzubauen, den ich 
nicht begreife und von der ganzen Sache mit Filedescriptoren hab ich 
noch nie was gehört - also bis vor ein paar Tagen nicht - und bemüh mich 
da gerade erst darum. Kannst Du mir die Wirkungsweise von Fischers Code 
erklären? Bzw, wo finde denn die Bedeutung, zb. des Flags 'O_NOCTTY'?

Schöne Grüße,
Luggi.

von Duke Scarring (Gast)


Lesenswert?

Ok. Du hast also zwei "serielle" Schnittstellen:

1. stdout -> jtag -> usbblaster
2. UART -> RS232 -> PC -> Terminalprogramm

Die 1. nimmst Du für's debugging, richtig?
Und bei der 2. willst Du die Geschwindigkeit ändern?!

Deine Zeilen:
1
IOWR_ALTERA_AVALON_UART_DIVISOR(UART_NAME, divi);
2
fp = fopen ("/dev/uart", "r+b");  //Open file for reading and writing
sehen sehr nach einem Mix zwischen der simplen und der 
Filedescriptor-Methode aus.

Mit den Filedescriptoren kenne ich mich nicht aus, sieht aber so ähnlich 
aus wie in Unix.

Duke

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.