Hallo, ich habe ein kleines Problem mit meinem LPC2129. Ich schreibe gerade ein CAN Programm, das einfach nur Nachrichten senden soll, nur leider scheinnt meine PLL nicht zu funktionieren. Quarz: 10MHz #define PLLSTAT_LOCK (1 << 10) #define PLLCFG_MSEL (5<<0) #define PLLCFG_PSEL (2<<5) #define CCLK (10000000 * 6) #define PLLCON_PLLE (1 << 0) // PLL Enable #define PLLCON_PLLC (1 << 1) // PLL Connect #define CANBit10k_60MHz 0x25C257 static void lowInit(void){ /* PLL wieder als Clock Source */ PLLCON = PLLCON_PLLE; // enable PLL PLLCFG = PLLCFG_MSEL | PLLCFG_PSEL; PLLFEED = 0xAA; // PLL Feed Sequence PLLFEED = 0x55; // PLL Feed Sequence while (!(PLLSTAT & PLLSTAT_LOCK))continue; // wait for PLL lock PLLCON = PLLCON_PLLE | PLLCON_PLLC; // enable and connect PLL PLLFEED = 0xAA; // PLL Feed Sequence PLLFEED = 0x55; // PLL Feed Sequence } Am Ausgang habe ich ein Oszi angeschlossen und vergleiche die Pulse mit eingeschalteter PLL und ohne. Leider scheint es dabei keinen Unterschied zu machen... Ich hoffe mir kann jemand sagen, was ich falsch mache.. lg Michael
Hmm habe das gerade mal gegengecheckt, die PLL scheint doch zu laufen, zumindest sagt das ein mini Programm, das nur einen Ausgang hin und herschaltet... die PLL scheint allerdings nur den Faktor 3 zu liefern... kann mir jemand helfen, woran das liegt?! Gruss Michael
Habe den Eindruck, dass dein Wert für PSEL etwas "out of Range" ist, das passiert leicht. Dann rastet die PLL nicht ein und müßte eigentlich in der while-Schleife verbleiben. Aus deinem Beispielcode: Wert von M = (5<<0) + 1 in PLLCFG bits 4:0 = 5 + 1 = 6. Wert von P = (2<<5) in PLLCFG bits 6:5 = 4. Die Berechnung der erlaubten Werte für MSEL und PSEL befindet sich im Kapitel "PLL Frequency Calculation" im User Manual. Aus den Ausführungen im User Manual: Pmin = 156MHz/(Fosc*2*M) mit Fosc 10MHz: Pmin = 156/120 Pmin = 1,3 Pmax = 320MHz/(Fosc*2*M) mit Fosc 10MHz: Pmax = 320/120 Pmax = 2,66 Der Wert von P muß zwischen 1,3 und 2,66 liegen. Erlaubt ist da nur die 2. Dietmar
Hi, danke für deine Antwort. Habe das mal geändert, habe über die Stelle, dass man Eins abziehen muss wohl hinweggelesen =) Also: #define PLLCFG_MSEL (5<<0) //==>6 #define PLLCFG_PSEL (1<<5) //==>2 Dummerweise ist meine Frequenz immernoch kleiner als die von meinem CAN Analyzer produzierte. Als Initialisierung meines BTR Registers nehme ich: CANBit10k_60MHz 0x25C257 Sprich meine 60Mhz werden für das Sampeln nochmal durch 600 (0x256 + 1) geteilt. Eigentlich müssten jetzt 10k als Bitrate verwendet werden. (Laut Oszi allerdings nicht...) lt diesem ist meine Bitrate so um die 5k (VPBDIV = 1). Langsam werde ich kirre... Kannst du mir bitte nochmal unter die Arme greifen?! Gruss Michael
Lass anfangs mal den CAN weg. Einen normalen Timer auf Ausgang programmieren, um zu sehen was wirklich als Takt anliegt. Programmiertes Pinwackeln taugt dafür weniger. Zunächst ohne PLL testen. Wenn das nicht zu 10MHz passt, ist die PLL unschuldig. Dabei ggf. VPBDIV durchprobieren, ob alle 3 Varianten (/1,/2,/4) so laufen wie sie sollen. Wenn das alles passt, dann das gleiche mit PLL ausprobieren.
Michael: Was ist mit der PLL, war meine Vermutung richtig? Funktioniert die mittlerweile? Bei Keil habe ich einen Configuration Wizard in der Startup.s, in dem ich den PLL Multiplier und den PLL Divider beliebig einstellen kann. Aber das ist fatal, da, siehe User Manual, diese Einstellung strengen Grenzen unterliegt. Ich werde da in der Startup-Datei mal noch eine Plausibilitätsuntersuchung einfügen müssen. Um die PLL zu testen, ist das Miniprogramm mit Pin toggeln nicht der richtige Weg: Die Programmabarbeitung findet nicht fest im cclk-Raster statt, wie man es von älteren Controllern ohne Pipeline wie 8085 oder 8051 kennt, sondern ist auch von Flash Speicherzugriffen und Pipeline abhängig, siehe Beschreibung MAM Memory Acceleration Module. Am besten installierst du einen Timer-Interrupt im 1ms-Takt (siehe z.B. Keil-Beispiel "Blinky IRQ"), installierst dort einen Zähler bis 1000 und toggelst eine LED oder Pin im Sekundentakt. Nun zum CAN-Bus: Mittlerweile habe ich selbst eine vollständig ausgereifte CAN-Bus-Applikation vorliegen, als Referenz. Aus dem LPC User Manual wirst du nicht vollständig schlau, dort gibt es nur eine stark abgespeckte Beschreibung zum CAN-Controller. Philips bemerkt jedoch die Kompatibilität zum externen CAN-Controller-Baustein SJA1000, der auch von denen stammt. Lade dir mal das Datenblatt zu diesem Baustein herunter, dort findet man bessere Details zur Bitratenberechnung. CANBit10k_60MHz 0x25C257 bedeutet im Detail, ins CAN Bit Timing Register CANBTR eingetragen: Bei einem Quarz 10 MHz, sage ich mal, daß dieser Parametersatz für einen PLL Multiplier 6, also eine Prozessorclock 60 MHz, einen VPB Divider 1, also eine pclk von 60 MHz, gilt: SAM = 0 (Sample Point, zunächst von untergeordneter Bedeutung) TSEG1 = 5+1 = 6 TSEG2 = 2+1 = 3 SJW = 3+1 = 4 (zunächst von untergeordneter Bedeutung) BRP = 257h = 599d --> Grundtakt Bitratenteiler = BRP+1 = 600d Die Bitratenberechnung auf dem CAN-Bus, also die Bits, wie sie auf dem Oszilloskop aussehen, ist mit deinem Wert für das CAN Bit Timing Register wie folgt: CAN_Bitrate = F(Quarz) * PLL Multiplier VPB Divider (BRP+1) / (TSEG2+1 + TSEG1+1 +1) mit cclk = F(Quarz) * PLL Multiplier CAN_Bitrate = cclk VPB Divider (BRP+1) / (TSEG2+1 + TSEG1+1 +1) mit pclk = cclk / VPB Divider CAN_Bitrate = pclk / (BRP+1) / (TSEG2+1 + TSEG1+1 +1) CAN_Bitrate = 60 MHz / (599+1) / (2+1 + 5+1 +1) CAN_Bitrate = 60 MHz / (600) / (3 + 6 +1) CAN_Bitrate = 60 MHz / (600) / 10 CAN_Bitrate = 60 MHz / 6000 CAN_Bitrate = 10 kHz Wie gesagt, für cclk 60 MHz, VPB Divider 1. Wenn noch was unklar ist, bitte wieder melden, wenn auch noch so banal, damit habe ich überhaupt kein Problem. Notfalls kopiere ich dir mal Sequenzen aus der PLL Initialisierung. Gruß und viel Erfolg: Dietmar
ja du hattst recht, sorry dass ich jetzt erst schreibe, habe momentan Prüfungen.. Das zweite Problem war mein gekaufter Analyzer von CANHack.de, der kann keine 10kBits... dumme Sache. mit 100k läuft das Programm zum Senden ganz gut.. Danke Michael S
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.