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
Eine eigene Frage?
Dieser Thread ist über 19 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.