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.