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