Forum: Mikrocontroller und Digitale Elektronik ARM PLL anpassen?


von Michael(Anfänger) (Gast)


Lesenswert?

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!

von Dominic R. (dominic)


Lesenswert?

Meine Glaskugel verrät mir dass es sich um einen LPC2000 handelt ;)

von Michael(Anfänger) (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

> Ich stehe hier wirklich vor einer Wand

Ich auch, weil "funktioniert nicht" als vollständige Problembeschreibung 
etwas wenig ist.

von Andreas K. (a-k)


Lesenswert?

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.

von Dominic R. (dominic)


Lesenswert?

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

von Michael(Anfänger) (Gast)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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
Noch kein Account? Hier anmelden.