Hallo! Ich habe eine Frage an euch in Bezug auf ein ARM µC. Mein Problem sieht folgenderweise aus: Ich habe zwei Programme geschrieben - UART Schnittstelle Baudrate 9.600 - SPI Schnittstelle Nun wollte ich beide Programme kombinieren. Entweder funktioniert das ein oder das andere. Nach langer Suche habe ich den Fehler entdeckt. In der Startup Datei des UARTS ist das PLL_SETUP Statement == 1 s.u.: . . . // Phase Locked Loop (PLL) definitions PLL_BASE EQU 0xE01FC080 /* PLL Base Address */ PLLCON_OFS EQU 0x00 /* PLL Control Offset*/ PLLCFG_OFS EQU 0x04 /* PLL Configuration Offset */ PLLSTAT_OFS EQU 0x08 /* PLL Status Offset */ PLLFEED_OFS EQU 0x0C /* PLL Feed Offset */ PLLCON_PLLE EQU (1<<0) /* PLL Enable */ PLLCON_PLLC EQU (1<<1) /* PLL Connect */ PLLCFG_MSEL EQU (0x1F<<0) /* PLL Multiplier */ PLLCFG_PSEL EQU (0x03<<5) /* PLL Divider */ PLLSTAT_PLOCK EQU (1<<10) /* PLL Lock Status */ /* // <e> PLL Setup // <i> Phase Locked Loop // <o1.0..4> MSEL: PLL Multiplier Selection // <1-32><#-1> // <i> M Value // <o1.5..6> PSEL: PLL Divider Selection // <0=> 1 <1=> 2 <2=> 4 <3=> 8 // <i> P Value // </e> */ PLL_SETUP EQU 1 <<<=================================== PLLCFG_Val EQU 0x00000024 // Memory Accelerator Module (MAM) definitions MAM_BASE EQU 0xE01FC000 /* MAM Base Address */ MAMCR_OFS EQU 0x00 /* MAM Control Offset*/ MAMTIM_OFS EQU 0x04 /* MAM Timing Offset */ /* // <e> MAM Setup // <i> Memory Accelerator Module // <o1.0..1> MAM Control // <0=> Disabled // <1=> Partially Enabled // <2=> Fully Enabled // <i> Mode // <o2.0..2> MAM Timing // <0=> Reserved <1=> 1 <2=> 2 <3=> 3 // <4=> 4 <5=> 5 <6=> 6 <7=> 7 // <i> Fetch Cycles // </e> */ MAM_SETUP EQU 1 MAMCR_Val EQU 0x00000002 MAMTIM_Val EQU 0x00000004 . . . In der Startup Datei des SPI ist das PLL_SETUP Statement == 0. Ich hänge hier schon eine Ewigkeit an diesem Problem. Ich gehe davon aus das die Taktrate entweder für das eine oder das andere durch das Statement angepasst wird. Kann mir jemand helfen? Wie kann man die PLL für UART und SPI im selben Prog. so ändern, dass beides funktioniert? Ich wäre euch sehr sehr dankbar für eine feedback!! Sei es auch nur ein kleiner Tipp oder so!
Sorry, befasse mich schon ca. 1 Monat mit dem Board. Hat auch alles bestens geklappt. Nun ich doch an einer Stelle angekommen wo es --für mich-- ans "eingemachte" geht. Ich stehe hier wirklich vor einer Wand Es ist ein LPC2148(60MHZ), Quart=12MHz, Das Board ist von Keil: MCB2140
> Ich stehe hier wirklich vor einer Wand
Ich auch, weil "funktioniert nicht" als vollständige Problembeschreibung
etwas wenig ist.
SPI funktioniert auch mit PLL, die UART-Bitrate wird aber ohne PLL nicht ohne Anpassung funktionieren. Was hängt denn am SPI? Vielleicht ist das SPI mit PLL schlicht zu schnell für das Device. Dann abbremsen.
Ohne zu wissen, was der Startup-Code mit den Defines anstellt, vermute ich mal, dass in Abhängigkeit von PLL_SETUP die PLL entweder initialisiert wird oder eben nicht. Dadurch ergibt sich dann auch eine unterschiedliche Frequenz für die Peripherals. Du solltest dir ansehen, welche CCLK (Core Clock) Frequenz die PLL aus deinem Oszillator generiert, und welche PCLK (Peripheral Clock) sich daraus ergibt. Ausgehend von diesen Werten müssen UART und SPI konfiguriert werden. Gruß, Dominic
Ich versuche über das SPI Interface einen MCP2515(CAN-Controller) anzusteuern. Dies funktioniert. Mein zweites Prog. sendet über Uart Nachrichten zu einem PC--funkioniert auch. Nun wollte ich beide programme in ein neues programm zusammen nutzen. Sprich Daten die über SPI(also CAN) kommen, über UART an den PC schicken. Dies hat nicht funktioniert! Ich habe in der Startup-Dateien der beiden einzelnen Programme einen unterschied gefunden. Bei einem ist die "PLL Divider Selection" == 1, beim anderen ==0. Wenn ich diese im zusammengefassten Prog ändere, funktiert halt, entweder SPI oder UART. Hier noch meine cfgs zu SPI und UART: SPI Config: VPBDIV = 0x00000001; S0SPCCR =0x000000FF;//SPI0 Clock counter setting. S0SPCR =0x00000020;/ The SPI operates in Master mode. UART Config U1LCR = 0x83;/* 8 bits, no Parity, 1 Stop bit, parity enabel odd*/ U1DLL = 97;/* 9600 Baud Rate @ 15MHz VPB Clock */ U1LCR = 0x0B;/* DLAB = 0 access to latch divisor disable, baudrate wurde schon eingetragen */ U1FCR |=0xC1; //cfg FIFO U1IER = 0x01; /* Enable RBR data available interrupt*/ VICVectAddr15 = (unsigned)isr;//Set the timer ISR vector address VICVectCntl15 = 0x00000027; Der Link des User-Manual -> http://www.nxp.com/acrobat_download/usermanuals/UM10139_1.pdf
PLLCFG=0x24: PSEL=1, MSEL=4 = 60MHz. Soweit ok. VPBDIV=1: PCLK=60MHz. Da deine Bitratenrechnung von PCLK=15MHz ausgeht, läuft die UART mit ca. 38400bd statt 9600bd.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.