BLIS verwendet Radar-Sensoren, kein Ultraschall.
Beiträge von Go4IT
-
-
Mutmaßlich ist der defekte Elko nur die Auswirkung und nicht die Ursache gewesen...
-
Mein Serientempomat hat nur den tempomat (Taste unten links OFF) habe dann den tempomat mit tempobegrenzer eingebaut.
Das kann nicht funktionieren. Das sind andere Komponenten und hat nichts mit vFL oder FL zu tun. Die Tasten sind bei beiden gleich, aber es gibt zahlreiche Varianten davon. Weiterhin hängen beide Tastenblöcke zusammen. https://mk4-wiki.denkdose.de/artikel/tempomat/start
Du musst die richtige Funktionsvariante kaufen und verbauen, oder umbauen (wenn Du SMD löten kannst und Lust darauf hast).
-
Der jüngste Reinfall bei Ebay hat mich etwas aufgeschreckt und ich werde künftig vorsichtiger sein müssen. Da ich relativ viel mit PayPal kaufe (manchmal auch verkaufe) bin ich auch hier etwas aufgerüttelt worden. Die Betrugsmaschen sind auch hier scheinbar unendlich und zwar nicht mit "Geld an Familie und Freunde" sondern vor allen mit Käufer/Verkäufer-Schutz. Am Ende tritt PayPal einfach Forderungen an ein Inkassounternehmen ab und mit welchen Maschen die arbeiten kennt man ja zu genüge...
Aber auch mit einer klassischen Banküberweisung hat man mich schon übers Ohr gehauen. Geld überwiesen, weil ich dachte bei einer Bank mit Sitz in Deutschland sollte das relativ sicher sein, dann kam keine Ware und am Ende stellte sich raus das jemand mit gefälschten (geklauten) Papieren dort Konten eröffnet hatte, Geld abzockte, am Automaten abhob und für immer verschwunden war.
Geht bald wirklich nur noch Geld gegen Ware vor Ort? Das schränkt natürlich auch die Verkaufs/Einkaufsmöglichkeiten erheblich ein. Und da das Bargeld ja so nach und nach abgeschafft wird, stellt sich auch die Frage wie lange das überhaupt noch möglich ist.
Ich hoffe ich ziehe jetzt keine schwurbeligen Verschwörungstheoretiker an mit dem was und wie ich es schreibe. Ganz praktisch stell ich mir die Frage wie man es denn machen soll? Einfach immer einen gewissen "Verlust" mit einkalkulieren? Pech gehabt? Echt frustrierend.
-
Da kann ich mich leider einreihen. Am Mondeo hatte ich dieses Jahr den ersten Hinweis
Achse / Achsaufängung, Achskörper 1. Achse mitte oberflächlich korrodiert (HW)
Grrr!
Und Jofels Mondi kenne ich auch, der war quasi wie eine "Juwel-Kerze" komplett in Wachs
Bei meinem Fiesta habe ich für den TÜV vor zwei Jahren auch massiv entrostet, mechanisch, mit Umwandler und anschliessender Versiegelung. Inzwischen sieht es wieder so aus wie vor der Behandlung.
-
Die alten Scheinwerfer habe ich durch neue ersetzt da ich der Meinung bin, das Xenon Scheinwerfer nach 10 Jahren einfach verbraucht sind.
Das Licht ist mit den neuen wieder um einiges besser.
Ähm, aber Dir ist schon klar das dieser Effekt nur bei den Linsen und Brennern auftritt? Das Gehäuse ist davon völlig unbetroffen, außer das "Glas" (ist ja auch Plastik) wäre schon so trüb das es eher Milchglas entspricht, was ich nicht annehme.
Aber ok, Du wirst hoffentlich keine 1.000€ investiert haben nur für neue Gehäuse und die alten Linsen und Brenner da reingebaut? Dann wäre der verbesserte Eindruck nämlich nur ein Plazebo-Effekt. Da hättest Du das Geld lieber in vernünftige Linsen und Brenner investiert (RE: Projekt Umrüstung auf Retrofit Xenon). Frag mal jofel was das ausmacht
-
Früher war da wirklich alles besser. Ich hatte Jahrelang nie Probleme, aber inzwischen ziehen die Gauner auch bei Kleinbeträgen ab. Mit Banküberweisung bin ich auch schon reingefallen da es dem Pack scheinbar problemlos möglich ist mit gefälschten Ausweispapieren bei Online-Banken Konten zu eröffnen, das Geld wird dann gleich nach Überweisung Bar irgendwo abgehoben, das siehst Du nie mehr wieder.
Daher Abholung ist das einzig sichere, geht aber leider nicht immer... oder aber man braucht Reputation, Empfehlungen, Bürgen.
-
Ich musste kürzlich auch schmerzlich erfahren das man als Verkäufer auch bei ebay nicht unbedingt auf der sicheren Seite ist
Jemand hat eines meiner Navis gekauft und bei sich nicht ans laufen gebracht, trotz Angebote meinerseits zu helfen hat er sich rein auf die Aussage einer Ford-Werkstatt gestützt die behauptet hat mein Gerät hätte einen Defekt. Daraufhin hat er im Rahmen des Käuferschutzes eine Rückgabe erwirkt (wusste garnicht das das bei Privatverkäufen überhaupt möglich ist) der ich dann, gutmütig wie ich bin, zugestimmt habe. Das Gerät kam aber ziemlich rampuniert zurück (Taste kaputt, andere Verkratzt, Macken und Abstossungen, Display eingedrückt) was nicht am Transport lag (war meine Verpackung und gut verpackt, unbeschädigter Karton). Als ich ihn damit konfrontiert hatte und ich dafür eine Preisminderung einbehalten müsse meinte er frech, er habe mir das Gerät zurückgesandt wie er es erhalten habe, eine glatte Lüge und sogar klar mit Verkaufsfotos belegbar. Darüber hinaus forderte er den gesamten Kaufpreis zurück und drohte mit kurzer Frist andernfalls mit Anzeige und Anwalt. Ebay hat ihm das gleich zugesprochen und das Geld von meinem Konto zurückgebucht und ihm überwiesen. Mein parallel laufender Einspruch konnte daran nichts ändern, trotz Bilder. Ich kann jetzt maximal zivilrechtlich gegen ihn vorgehen, das steht noch auf einem anderen Blatt. Solchen Menschen kann man nur wünschen das ihnen mal dasselbe passiert und sie sich dann an ihre eigene Missetat erinnern und daraus vielleicht zu einem besseren Menschen werden. Nicht allen wird das gelingen, nicht alle werden das erfahren. So ist die Welt.
Das zeigt aber auch klar: selbst wenn man keinem technischen Trick aufitzt ist man weder als Käufer noch als Verkäufer gegen Idioten, Gauner und Taugenichtse gefeit.
-
Sry, muss da was korrigieren.
Wie Go4IT schrieb, ab 2007. Bis dahin wurde im MK 2 noch das Denso angeboten.
Ah, ok, ich war schon leicht irritiert da das NX nach meinem Kenntnisstand 2006 entwickelt und gefertigt wurde und erst 2007 auf den Mark kam. Dann passt es ja wieder
-
Tach zusammen, wer kann denn sagen in welchen Baujahren das NX im Focus verbaut wurde? Die gleiche Plattform teilen ja auch Kuga und C-Max/B-Max, evtl. aber unterschiedliche Baujahre?
Der Focus MK2 wurde von 2004-2011 gebaut, das NX gab es aber sicher erst ab 2007 vorher war es wohl eher noch ein EX (Denso) und ab Ende 2010 könnte dann noch das MCA gekommen sein, da ich meine das im MK3 schon ein Sync drin war?
ABER - nichts genaues weis man nicht
FX
- Focus MK2 (ab Facelift 2009 auch FX-Plus)
- C-Max ??
- Kuga MK1
- Transit MK6
- Fusion (ab Mitte 2009)
NX/NX-Plus
- Focus MK2 (2007-2011)
- C-Max ??
- Kuga MK1
- Galaxy MK2 vorFacelift (bis 9/2010)
MCA/MCA-Plus
Hier ist vor allem die Frage wann der Modellwechsel stattfand, ggf. auch Ende 2010 wie beim Mondeo?
- Galaxy MK2 Facelift (10/2010-2014)
- S-Max MK1 Facelift (10/2010-2014)
- Focus MK2 (Facelift ab okt. 2010)
-
Als nächstes gehe ich auf die Suche nach den Grundfunktionen die beim Empfang von Daten vom CAN-Bus aufgerufen werden. Diese sollten sich über die Interrupts leicht finden lassen. Aus der o.g. Analyse ist ja bekannt das beim Eingang an CAN2 ein entsprechender Interrupt ausgelöst wird. Laut Handbuch gibt es eine ganze Reihe von Triggern für einen Interrupt:
• CAN wakeup interrupt
• CAN reception complete interrupt
• CAN transmission complete interrupt
• CAN receive FIFO interrupt
• CAN transmit FIFO interrupt
• CAN error interrupt (Bus error, Error-warning, Error-passive, Bus-off entry, Bus-off recovery, Receive overrun, Overload frame transmission, Bus lock)
Interessant wäre der "CAN reception complete interrupt" der ausgelöst wird, sobald ein gültiges CAN Frame gelesen und in eine Mailbox gepackt wurde:
Es gibt zwei Arten von Interrupts, die direkten welche in einer fixen Tabelle untergebracht sind:
Hier findet sich jedoch nichts bezüglich CAN.
Es gibt noch eine "Relocatable Vector Table" welche durch Zuweisung einer Speicheradresse an INTB insegamt 256 Sprungvektoren aufnehmen kann (4 Byte x 256 = 1024 Byte). Im Code findet sich etwas das diese Basisadresse zuordnet:
An der genannten Speicheradresse finden sich die Sprungadressen (LWORD). Im Handbuch sind diese in einer Tabelle aufgeschlüsselt:
Die Adresse der ISR ist somit also an Offset-Position 0x19C zu finden, also 0xFFF4_007C + 0x19C = 0xFFF4_0218
An dieser Adresse steht also der Code der nach Eingang einer CAN-Botschaft (egal welche Mailbox) die Datenbehandlung durchführt:
Code
Alles anzeigenCODE:FFF83AAA c2receiveInterruptHandler: ; DATA XREF: CODE:c2receiveInterrupt↑o CODE:FFF83AAA PUSHM R2R0,R3R1,A0 CODE:FFF83AAC CMP.L #0C208A53Fh, unk_34C0 CODE:FFF83AB5 JNE/NZ loc_FFF83AC6 CODE:FFF83AB7 JSR.A sub_FFFB00CF CODE:FFF83ABB MOV.L #0, R3R1 CODE:FFF83ABD MOV.B #60h, R0H ; '`' CODE:FFF83AC0 MOV.B #1, R0L CODE:FFF83AC2 JSR.A sub_FFF9F417 CODE:FFF83AC6 loc_FFF83AC6: ; CODE XREF: CODE:FFF83AB5↑j CODE:FFF83AC6 ADD.B #1, unk_3151 CODE:FFF83ACB CMP.B unk_3151, byte_FFFB16B5 CODE:FFF83AD3 JGEU/C loc_FFF83AFF CODE:FFF83AD5 BSET #5, unk_3167 CODE:FFF83ADA CMP.B #0, unk_3174 CODE:FFF83ADF JNE/NZ loc_FFF83AE9 CODE:FFF83AE1 CMP.B #80h, unk_3151 CODE:FFF83AE7 JLTU/NC loc_FFF83AFF CODE:FFF83AE9 loc_FFF83AE9: ; CODE XREF: CODE:FFF83ADF↑j CODE:FFF83AE9 MOV.B c2ric, R0L ; CAN2 Receive Interrupt Control Register CODE:FFF83AEC AND.B #111b, R0L CODE:FFF83AEE MOV.B R0L, unk_3173 CODE:FFF83AF3 AND.B #11111000b, c2ric ; CAN2 Receive Interrupt Control Register CODE:FFF83AF7 MOV.B byte_FFFB16C7, unk_316E CODE:FFF83AFF loc_FFF83AFF: ; CODE XREF: CODE:FFF83AD3↑j CODE:FFF83AFF ; CODE:FFF83AE7↑j CODE:FFF83AFF MOV.W tb4, unk_33E6 ; Timer B4 Register CODE:FFF83B06 ADD.B #1, unk_3176 CODE:FFF83B0B JSR.A sub_FFF886BB CODE:FFF83B0F ADD.B #-1, unk_3176 CODE:FFF83B14 MOV.W #53h, R0 ; 'S' CODE:FFF83B17 JMP.W loc_FFF840AA
Ab hier wird es etwas knifflig, da nun die Businesslogic mitspielt. Irgendwo in der Folge muss der Code jedoch überprüfen von welcher Mailbox der INTB ausgelöst wurde, also neue Daten angekommen sind. Laut Handbuch wird dazu das "NEWDATA" Bit im C2MCTL0 oder C2MCTL1 Register auf "1" gesetzt:
Für jede Mailbox gibt es eine SFR-Adresse auf ein solche 1 Byte Register:
Für die Mailbox 0 von CAN2 ist es 0x47720 und für Mailbox 1 0x47721.
Der Code nutzt diese Adresse an folgenden Stellen:
mb0:
mb1:
Interessant sind die Lesezugriffe, denn erstmal muss ja festgestellt werden ob etwas neues vorliegt. Hierfür kommen z.B. die BTST #0 Befehle in Frage, denn sie testen genau auf dieses Bit.
-
In dieser Serie von Beiträgen rund um das BCM möchte ich mich etwas mehr in das innere der Software eingraben. Zum einen um diese besser zu verstehen, zum anderen aber auch um mir gewisse Dinge für Modifikationen dingbar zu machen.
Die Arbeitsergebnisse
Wie immer sammle ich im ersten Thread nach und nach die Erkenntnisse, bzw. Verweise darauf:
- BCM Firmware Reverse-Engineering (Bootloader)
- BCM Firmware Reverse-Engineering (HW-Erkennung)
- BCM Firmware Reverse-Engineering (HS-CAN Kommunikation)
- BCM Firmware Reverse-Engineering (RFRX-Kommunikation für ZV, PATS und RDKS)
Der Proband
Ich verwende für alle Beiträge ein BCM eines 2.2er Diesel mit allen Funktionen (Vollausstattung) vom Typ BG9T-14A073-XK und der darauf befindlichen Firmware BG9T-14C094-AK.
Einige Eckdaten
Die Zentraleinheit (1) vom Typ R32C R5F64524KFD
- Byteorder: Little-Endian
- Internes RAM: 48 KB
- Interner Flash-Speicher: 768 KB + 4 KB Data Flash + 4 KB EEPROM Emulation Flash
Memory Map
- SFR1 und SFR2 => Special Function Register, bilden über Speicheradressen Zugriff auf die Module des Mikrocontrollers
- Data Flash => 0x0006_0000 - 0x0006_1FFF (ECC und Non-ECC Modus). Enthält nur die CCC im AsBuilt-Format.
- E2 Data Flash => 0x0006_2000 - 0x0006_3FFF. EEPROM-Emulation.
- Internal ROM => 0xFFF4_0000 - 0xFFFF_FFFF. Hier liegt die Firmware sowie die Reset-Vectoren.
Verfügbare Datenblätter- Das Basisdatenblatt R32C Datasheet.pdf
- R32C-152 Users Manual.pdf
- R32C Software Manual.pdf
-
-
In diesem Bereich versuche ich mich zu den Funktionen rund um die HS-CAN Anbindung des BCM vorzuarbeiten. Die gesamte Programmierung des BCM geschieht ausschließlich über den HS-CAN. Der MS-CAN sowie MM-CAN dienen nur der Kommunikation mit den Modulen. Daher ist der HS-CAN für mich erstmal der interessantere.
Welcher CAN-Controller bedient den HS-CAN?
"Wie immer" starte ich mit der Hardware. Aus dem Basis-Untersuchen ist ja schon bekannt das ein R32C auf dem BCM arbeitet. Dieser hat laut Datenblatt 3 CAN-Module (Controller)
Los geht es am Stecker. Der HS-CAN Bus liegt am "blauen" BCM-Stecker (Armaturenbrett-Kabelbaum) C3 and den Pins 6 und 7 an:
Auf der Platine des BCM wurde ordentlich mit Harz gekleckert. Das macht die Identifizierung der Bauteilbezeichnungen mitunter sehr schwer, weil man diesen erstmal vorsichtig runterkratzen muss. Ein CAN-Bus benötigt immer einen Transceiver (Pegelwandler). Hiervon finden sich gleich mehrere auf der Platine. Der vom HS-CAN ist ein TJA1042 (siehe Position (15) auf BCM Firmware Reverse-Engineering). Hier enden direkt die beiden Pins von der Buchse.
Auf der anderen Seite des TJA1042 geht es dann zu den Pins 1 und 2 vom R32C:
Die Pins von Microcontrollern wie dem R32C sind häufig nicht auf eine Funktion festgelegt, sondern abhängig von der Programmierung des Chips. Das Datenblatt zeigt dies durch mehrere Bezeichnungen mit "/" getrennt.
Ein physikalischer Pin am Gehäuse des Chips kann durch Programmierung mit verschiedenen Modulen innerhalb des Chips verbunden werden, wie hier an dem Schaubild zu erkennen:
Somit kann z.B. der "Pin 1" folgende Funktionen haben:
- "P9_6" => GPIO Port, ein digitaler IO-Port Nummer #6 in der Portgruppe #9
- "ANEX1" => Analoger, externer Watchdog #1
- "TXD4" => Sendeleitung des seriellen UART #4
- "CAN2OUT" => Sendeleitung des CAN-Controllers #2
- "CAN1OUT" => Sendeleitung des CAN-Controllers #1
Die Tatsache das der TXD des TJA1042 mit dem Pin 1 des R32C verbunden ist und der TJA1042 keinen Chip-Enable hat, lässt darauf schließen das es hier nur um die beiden CAN-Controller gehen kann. Welcher Controller nun am Ende die Arbeit macht, werden wir erst in der Initialisierungsroutine erkennen können.
Klar ist jedoch das es im Code Zugriffe auf die Konfiguration von Port P9_5 und P9_6 geben muss. Um diese zu finden und zuzuordnen muss man die Funktionsweise der CAN Controller etwas besser verstehen. Hilfe hierzu gibt das "R32C Users Manual" R32C-152 Users Manual.pdf im Abschnitt "CAN Controller", als auch die "R32C CAN Applicaiton Note" R32C CAN Application Note.pdf.
Im Schaubild eines CAN-Controllers erkannt man die Funktionsblöcke:
An (1) kommen die physikalischen Signale vom CAN-Transceiver zum Controller (Der Zusatz "/CANxWU" bedeutet das dieser Pin auch zum aufwecken der MCU aus einem Schlafmodus genutzt werden kann. Auf Deutsch: Kommt über den CAN-Bus eine Botschaft, kann diese das BCM aus dem Schlafmodus holen). Zur Takterzeugung wird an (8) der CPU-Takt (8 MHz) verwendet um die Baudrate des CAN-Bus (bei HS-CAN 500 MBit/s) einzustellen.
Hat der Protocoll Controller (2) z.B. ein eingehendes Datenpaket erkannt, leitet er es an den Filter und Priorisierer (3) weiter, welcher es ggf. in eine Mailbox (4) verschiebt. Die mit (5) gekennzeichneten SFRs sind zur Programmierung der Komponenten gedacht und für uns die interessanten.
Der Interrupt Generator (6) erzeugt je nach Betriebszustand verschiedene Ereignisse welche dann von der Software mittels Interrupt-Service-Routinen (ISRs) behandelt werden, so z.B. der Empfang einer Botschaft und die Verarbeitung der Daten darin.
Die Programmierung des Controllers (2) entscheidet also welche CAN I/O pins genutzt werden. Das schaue ich mir genauer an. Irgenwo muss es einen Zusammenhang zwischen den Pins 5+6 von Gruppe 9 und einem CAN-Controller geben. Hierzu finde ich das "Port P9_i Function Select Register". Das "i" wird dann mit "5" oder "6" substituiert. Es gibt also für jeden einzelnen Port ein eigenes 8-Bit Register im SFR2:
Die unteren 3 Bits geben die Konfiguration des Ports an, also bestimmen wohin dieser physikalische Pin intern verbunden wird. Die SFR2 Speicheradresse für Port P9_6 (CAN Ausgangsleitung) ist somit 0x400ed. Wird dort in die Bits 0-2 der Wert 0b101 geschrieben, ist er mit dem Controller CAN2 verbunden, beim Wert 0b110 mit dem von CAN1.
Mittels einer Rückwärtssuche auf den Schreibzugriff auf diese Adresse finde ich im Code:
Auch für nicht-Assembler geschädigte gut zu erkennen das der Wert 0b00000101 auf die Adresse geschrieben wird. Der Disassembler hat hier bereits die Adresse 0x400ed durch den Namen "p9_6s" ersetzt, weil er den Registeraufbau der R32C kennt. Der Wert verrät und nun das der Pin P9_6 mit der Sendeleitung von Controller CAN2 verbunden ist.
Somit ist klar das der HS-CAN vom Controller CAN2 bedient wird!
Der gesamte Code um diese Stelle herum enthält die Programmierung des Controllers u.a. mit der Baudrate von 500 MBit/s, sowie der Einstellung zu Interrupts und Mailboxen. Jeder Kanal verfügt über bis zu 32 solcher "Mailboxen" in die eingehende oder zu Sendung ausgehende CAN-Botschaften zwischengespeichert werden. Damit sich die Software nicht mit jedem Datagramm auf dem Bus beschäftigen muss gibt es zusätzliche "Acceptance Filter" die nur solche Botschaften in die Mailboxen einleiten, welche auch zum Zuständigkeitsbereich des BCM gehören.
Ich habe die Routine mit Kommentaren versehen. Wen das interessiert kann es ja mal durcharbeiten und mit dem Handbuch vergleichen:
Code
Alles anzeigenCODE:FFFA1EDE hscan_init: ; CODE XREF: sub_FFFB04D4-E466↓p CODE:FFFA1EDE PUSHM A1 CODE:FFFA1EE0 BSET prc2, prcr ; Recommendation of manual, set PRC2 to 1 just before changing direction register CODE:FFFA1EE5 BSET pd9_6, pd9 ; Set port P9, pin 6 as output (connected to TXD of ext. CAN transceiver) CODE:FFFA1EE9 BSET prc2, prcr ; Recommendation of manual, set PRC2 to 1 just before changing direction register CODE:FFFA1EEE MOV.B #101b, p9_6s ; Set function of port P9, pin 6 as CAN2OUT (connected to CAN2 controller) CODE:FFFA1EF3 BSET prc2, prcr ; Recommendation of manual, set PRC2 to 1 just before changing direction register CODE:FFFA1EF8 BCLR pd9_5, pd9 ; Set port P9, pin 5 as input (connected to RXD of ext. CAN transceiver) CODE:FFFA1EFC BSET #100b, ifs1 ; Set CAN2 input to be connected to port P9, pin 5 (P9_5) CODE:FFFA1F01 BSET prc30, prcr3 ; Recommendation of manual, set PRC30 before changing port 3 CODE:FFFA1F06 MOV.B #0, p9_6s ; Set function port P9, pin 6 as GPIO CODE:FFFA1F0B BSET pd3_7, pd3 ; Set pin 7 of port P3 as output CODE:FFFA1F0F BCLR p3_7, p3 ; Set pin P3_7 to level "0" CODE:FFFA1F13 BCLR prc30, prcr3 ; Recommendation of manual, set PRC30 before changing port 3 CODE:FFFA1F18 BTST #2, c2str ; if CAN2 is in sleep mode (SLPST=1) goto loc_FFFA1F2B CODE:FFFA1F1D JEQ/Z loc_FFFA1F2B CODE:FFFA1F1F BCLR #2, c2ctrl_b0_b7 ; Set "CAN2 Sleep Mode Bit (SLPM)" to "Mode other than CAN sleep mode" ("0") CODE:FFFA1F24 loc_FFFA1F24: ; CODE XREF: hscan_init1+4B↓j CODE:FFFA1F24 BTST #2, c2str CODE:FFFA1F29 JNE/NZ loc_FFFA1F24 CODE:FFFA1F2B loc_FFFA1F2B: ; CODE XREF: hscan_init1+3F↑j CODE:FFFA1F2B MOV.W #1, c2ctrl_b0_b7 CODE:FFFA1F30 loc_FFFA1F30: ; CODE XREF: hscan_init1+57↓j CODE:FFFA1F30 BTST #0, c2str CODE:FFFA1F35 JEQ/Z loc_FFFA1F30 ; b0 must be "0" (CAN2 not in reset state) CODE:FFFA1F37 MOV.L #0, c2bcr CODE:FFFA1F3C BSET #4, c2bcr+1 ; set TSEG1 to 0b1011 = 12 Tq CODE:FFFA1F41 BSET #5, c2bcr+1 CODE:FFFA1F46 BCLR #6, c2bcr+1 CODE:FFFA1F4B BSET #7, c2bcr+1 CODE:FFFA1F50 BCLR #0, c2bcr+2 ; set TSEG2 to 0b010 = 3 Tq CODE:FFFA1F50 ; set SJW to 0b01 = 2 Tq CODE:FFFA1F55 BSET #1, c2bcr+2 CODE:FFFA1F5A BCLR #2, c2bcr+2 CODE:FFFA1F5F BSET #4, c2bcr+2 CODE:FFFA1F64 BCLR #5, c2bcr+2 CODE:FFFA1F69 BSET #0, c2bcr ; set prescaler (BPR) to 1 CODE:FFFA1F6E MOV.L #-1, dword_47228 ; ??? not an SFR ; ----------------------------------------------------- ; Set data of mailboxes mb0-mb7 to 0x00 ; ----------------------------------------------------- CODE:FFFA1F73 MOV.L #0FFFB1778h, A0 ; load A0 with base address of CAN2 mailbox 0 CODE:FFFA1F79 MOV.L A0, R2R0 ; R2R0 = A0 CODE:FFFA1F7B ADD.WL #80h, R2R0 ; R2R0+0x80 = base address of mailbox #8 CODE:FFFA1F7F CODE:FFFA1F7F loc_FFFA1F7F: ; CODE XREF: hscan_init1+BC↓j CODE:FFFA1F7F MOV.L #0, [[A0]] CODE:FFFA1F82 MOV.L [A0], A1 CODE:FFFA1F84 ADD.L #4, A1 CODE:FFFA1F86 MOV.L #0, [A1] CODE:FFFA1F88 MOV.L [A0], A1 CODE:FFFA1F8A ADD.BL #8, A1 CODE:FFFA1F8D MOV.L #0, [A1] CODE:FFFA1F8F MOV.L [A0], A1 CODE:FFFA1F91 ADD.BL #0Ch, A1 CODE:FFFA1F94 MOV.L #0, [A1] CODE:FFFA1F96 ADD.L #4, A0 CODE:FFFA1F98 CMP.L R2R0, A0 CODE:FFFA1F9A JNE/NZ loc_FFFA1F7F ; ----------------------------------------------------- ; Set CAN-ID and DLC for mb0-mb3 ; ----------------------------------------------------- CODE:FFFA1F9C MOV.L [off_FFFB1778], R2R0 ; load value of c2mb0 CAN-ID into R2R0 CODE:FFFA1FA2 AND.L #11100000000000111111111111111111b, R2R0 ; set SID bits 18-28 to all 0 CODE:FFFA1FA7 OR.L #11111011111000000000000000000b, R2R0 ; set SID bits 18-28 to 0b11111011111 (=0x7DF) CODE:FFFA1FAD MOV.L R2R0, [off_FFFB1778] ; set CAN-ID of mailbox 0 to 0x7DF CODE:FFFA1FB3 MOV.L off_FFFB1778, A0 ; A0 = 0x47400 = CAN2 mailbox 0 base address CODE:FFFA1FB8 ADD.L #4, A0 CODE:FFFA1FBA MOV.W [A0], R0 ; R0 = 16 Bit value of DLC (only in upper 8 bits) CODE:FFFA1FBC AND.W #1111000011111111b, R0 ; set DLC to 0 CODE:FFFA1FBF OR.W #100000000000b, R0 ; set DLC to 8 CODE:FFFA1FC3 MOV.L off_FFFB1778, A0 ; A0 = 0x47400 = CAN2 mailbox 0 base address CODE:FFFA1FC8 ADD.L #4, A0 CODE:FFFA1FCA MOV.W R0, [A0] ; set DLC register to 8 CODE:FFFA1FCC MOV.L [off_FFFB177C], R2R0 ; load value of c2mb1 CODE:FFFA1FD2 AND.L #11100000000000111111111111111111b, R2R0 ; set SID bits 18-28 to all 0 CODE:FFFA1FD7 OR.L #11100100110000000000000000000b, R2R0 ; set SID bits 18-28 to 0b11100100110 (0x726) CODE:FFFA1FDD MOV.L R2R0, [off_FFFB177C] ; set CAN-ID of mailbox 1 to 0x726 CODE:FFFA1FE3 MOV.L off_FFFB177C, A0 ; A0 = 0x47410 CODE:FFFA1FE8 ADD.L #4, A0 CODE:FFFA1FEA MOV.W [A0], R0 CODE:FFFA1FEC AND.W #1111000011111111b, R0 CODE:FFFA1FEF OR.W #100000000000b, R0 ; set DLC to 8 CODE:FFFA1FF3 MOV.L off_FFFB177C, A0 ; A0 = 0x47410 = CAN2 mailbox 1 base address CODE:FFFA1FF8 ADD.L #4, A0 ; A0 0x47414 CODE:FFFA1FFA MOV.W R0, [A0] CODE:FFFA1FFC MOV.L [off_FFFB1784], R2R0 ; load value from c2mb3 into R2R0 CODE:FFFA2002 AND.L #11100000000000111111111111111111b, R2R0 ; set SID bits 18-28 to all 0 CODE:FFFA2007 OR.L #11100101110000000000000000000b, R2R0 ; set 0b11100101110 = 0x72E CODE:FFFA200D MOV.L R2R0, [off_FFFB1784] ; set CAN-ID of mailbox 3 to 0x72E CODE:FFFA2013 MOV.L off_FFFB1784, A0 CODE:FFFA2018 ADD.L #4, A0 CODE:FFFA201A MOV.W [A0], R0 CODE:FFFA201C AND.W #1111000011111111b, R0 CODE:FFFA201F OR.W #100000000000b, R0 ; set DLC to 8 CODE:FFFA2023 MOV.L off_FFFB1784, A0 CODE:FFFA2028 ADD.L #4, A0 CODE:FFFA202A MOV.W R0, [A0] ; ----------------------------------------------------- ; ----------------------------------------------------- CODE:FFFA202C MOV.L #11b, c2mier ; Enable CAN2 receive interrupt for mb0 and mb1 CODE:FFFA2031 MOV.B #0, byte_4774C CODE:FFFA2036 AND.BW #-4, c2ctrl_b0_b7 ; -4 = 0b10000100 = 0x84 CODE:FFFA203C loc_FFFA203C: ; CODE XREF: hscan_init1+163↓j CODE:FFFA203C BTST #0, c2str CODE:FFFA2041 JNE/NZ loc_FFFA203C CODE:FFFA2043 BCLR #3, c2ric ; CAN2 Receive Interrupt Control Register CODE:FFFA2047 MOV.B c2ric, R0L ; CAN2 Receive Interrupt Control Register CODE:FFFA204A AND.B #11111000b, R0L CODE:FFFA204C OR.B #10b, R0L ; set IRQ Level 2 CODE:FFFA204F MOV.B R0L, c2ric ; CAN2 Receive Interrupt Control Register CODE:FFFA2052 MOV.B #40h, c2mctl0 ; '@' ; set CAN2 mailbox 0 as receive mailbox CODE:FFFA2058 MOV.B #40h, c2mctl1 ; '@' ; set CAN2 mailbox 1 as receive mailbox CODE:FFFA205E POPM A1 CODE:FFFA2060 RTS
Aus dieser geht u.a. noch hervor das für den Empfang von CAN-Botschaften die Mailboxen MB0 und MB1 im "Normal Mode" (also kein FIFO) verwendet werden. Diese sind jeweils mit unterschiedlichen Acceptance-Filtern ausgestattet. Auch die Interrupts werden hier aktiviert. Dazu mehr im folgenden Beitrag.
Die Filterungseinstellungen sind etwas komplex, ich versuche es so einfach wie möglich darzustellen.
"Acceptance Filter" wirken auf die ID der CAN-Botschaft und erlauben es das nur ein bestimmter Bereich von IDs zugelassen wird. Dabei können für die insgesamt 32 Mailboxen pro CAN-Controller unterschiedliche Filter hinterlegt werden. Diese sind in Gruppen eingeteilt, ein Filter bedient dabei jeweils 4 aufeinanderfolgende Mailboxen. Für die MB0 und MB1 des CAN2, welche oben konfiguriert wurden, gilt dabei nur der Filter C2MKR0. Dieser Filter wird über die SFR2 Speicheradressen 0x47600..0x47603 eingestellt:
Der dort hinterlegte 32-Bit Wert beschreibt mit 0 und 1 ob das jeweilige Bit mit der eingehenden CAN-ID verglichen wird oder nicht. Einfach ausgedrückt: wäre alles 0, dann würde der Filter jede CAN-ID akzeptieren und je mehr 1en man einbringt umso weniger IDs würden erkannt. EID/SID beschreibt die ID-Längen, wobei wir im Mondeo ausschließlich mit Standard-IDs (SID) arbeiten, die nur 11 Bit lang sind. Somit sind nur die Bits 18-28 ausschlaggebend.
Interessanterweise finde ich bislang im gesamten Code keinen Zugriff auf diese Register. Das bedeutet das keine Acceptance Filter für HS-CAN eingestellt werden. Da der Reset-Value "undefined" ist, macht mir das etwas zu denken, aber mal schaun.
Gefunden habe ich jedenfalls das die hscan_init Routine folgendes einstellt:
- mb0 => Empfängt CAN-Botschaften mit der ID 0x7DF (UDS Broadcast Adresse)
- mb1 => Empfängt CAN-Botschaften mit der ID 0x726 (BCM UDS Adresse für Anfragen)
- mb2 => Sendet CAN-Botschaften mit der ID 0x72E (BCM UDS Adresse für Antworten)
-
-
Hallo,
weiss jemand ob das vFL Mondeo MK4 IPC (8M2T-10849-…) im Kuga I verbaut werden kann?
Gab es für den Kuga ein Convers+?
Ist im Kuga das IPC auch nicht teil des PATS? Ist ja eine Focus-Plattform.
-
-
Danach Reifendruckkontrollsystem programmiert, Fehlerspeicher gelöscht, etwas gefahren und zack war der Fehler da.
Genau, denn wie wir ja inzwischen herausgefunden haben wird die Anlernfunktion im BCM erst nach einer Weile Fahrt aktiviert und dann erst gibt es auch den entsprechenden DTC. Das ist also in dem Sinne völlig normal.
War es nicht so das man neben dem Patch im Convers auch die Funktion im BCM aktivieren musste? Ich meine ja, denn sonst kann das alles ja nicht funktionieren. Das war doch genau der kleine Haken, das man eben immer die DTCs im BCM hat. Der Patch sorgt u.a. dafür das das IPC diese DTCs nicht erkennt und als Fehler darstellt.
-
Was Du eingangs beschreibst klingt als hättest Du die Entriegelunsfunktion umprogrammiert
Umprogrammieren der Entriegelungsfunktion
Beachte: Wenn die Entriegelungstaste gedrückt wird, werden entweder alle Türen oder nur die Fahrertür und Heckklappe entriegelt. Das erneute Drücken der Entriegelungstaste entriegelt alle Türen.
Ver- und Entriegelungstaste bei ausgeschalteter Zündung mindestens vier Sekunden lang gleichzeitig gedrückt halten. Die Blinkleuchten blinken zur Bestätigung der Änderung zweimal auf.
Um zur ursprünglichen Verriegelungsfunktion zurückzukehren, den Vorgang wiederholen. -
Ich denke die allgemeine Ford-Prozedur zum anlernen eines zusätzlichen (!) Schlüssels an die ZV, bei Zündschlüssel-Systemen ist auch beim Mondeo gültig?
Sie liest sich so als bräuchte man nur einen aktiven Schlüssel und könnte damit weitere (bis zu 7) anlernen.
Programmieren einer neuen Fernbedienung.
- Zur Programmierung der neuen Fernbedienungen den Zündschlüssel viermal innerhalb von sechs Sekunden in Stellung II drehen.
- Zündschlüssel in Stellung 0 drehen. Es ertönt ein Signal, um anzuzeigen, dass die Fernbedienungen nun zehn Sekunden lang programmiert werden können.
- Eine der Tasten einer neuen Fernbedienung drücken. Es ertönt ein Bestätigungssignal.
- Diesen Schritt für alle Fernbedienungen einschließlich der Original-Fernbedienung wiederholen. Schlüssel nicht aus dem Zündschloss ziehen, während die Taste auf dieser Fernbedienung gedrückt wird.
- Zündung wieder einschalten (Stellung II) oder zehn Sekunden warten, ohne dass eine weiter Fernbedienung programmiert wird, um die Schlüsselprogrammierung zu beenden. Das Fahrzeug lässt sich nun nur mit den zuvor programmierten Fernbedienungen ver- und entriegeln.
Umprogrammieren der Entriegelungsfunktion
Beachte: Wenn die Entriegelungstaste gedrückt wird, werden entweder alle Türen oder nur die Fahrertür und Heckklappe entriegelt. Das erneute Drücken der Entriegelungstaste entriegelt alle Türen.
Ver- und Entriegelungstaste bei ausgeschalteter Zündung mindestens vier Sekunden lang gleichzeitig gedrückt halten. Die Blinkleuchten blinken zur Bestätigung der Änderung zweimal auf.
Um zur ursprünglichen Verriegelungsfunktion zurückzukehren, den Vorgang wiederholen.