CANUSB SJA1000-Filterung

Ich verwende einen an mein Auto angeschlossenen CANUSB-Adapter und versuche, nur CAN-Nachrichten mit der 11-Bit-Kennung 0x1D6 auszulesen. Ich muss eine Hardwarefilterung durchführen, da die Softwarefilterung für meine Anwendung zu langsam ist.

Die CANUSB-Protokollbeschreibung ( http://www.can232.com/docs/canusb_manual.pdf ) erklärt, wie die Filterung eingerichtet wird, und verweist auf das SJA1000-Datenblatt ( http://www.nxp.com/documents/data_sheet/SJA1000 .pdf ) für eine Beschreibung der beteiligten Hardware-Register.

Um den Akzeptanzcode einzurichten, schreibe ich "MFFFFF3AC\r" auf die serielle Schnittstelle. Dies sollte der Einstellung AC0=FF, AC1=FF, AC2=F3, AC3=AC auf einem SJA1000-Controller entsprechen. Ich bin auf diese Werte gekommen, indem ich 1D6 um ein Bit nach links verschoben habe, da das letzte Bit für RTR verwendet wird, was mir egal ist.

Um die Akzeptanzmaske einzurichten, schreibe ich "mFFFFF001\r" auf die serielle Schnittstelle. Soweit ich weiß, sollte dies den SJA1000-Controller so einrichten, dass er nur mit der oben angegebenen 11-Bit-Kennung filtert.

Dies sind die IDs, die ich mit dieser Konfiguration bekomme:

0x0a8 0010101000
0x0aa 0010101010
0x0c0 0011000000
0x0c4 0011000100
0x0c8 0011001000
0x0d7 0011010111
0x2d5 1011010101
0x2fa 1011111010
0x31d 1100011101
0x328 1100101000
0x330 1100110000
0x349 1101001001
0x360 1101100000
0x364 1101100100
0x3b0 1110110000
0x3bd 1110111101

Wie Sie sehen können, keine Anzeichen von 0x1d6. Ich sehe sie, wenn ich das Gerät neu starte, ohne Filterbefehle einzugeben.

Kann mir jemand, der mit der SJA1000-Filterung vertraut ist, sagen, was ich hier falsch mache?

Antworten (2)

Das CANUSB-Gerät versetzt den SJA1000 in den "Dual-Filter"-Modus, sodass Sie sich die Abbildungen 11 oder 12 (je nachdem, ob Sie 11-Bit- oder 29-Bit-IDs filtern) des SJA1000-Handbuchs ansehen möchten.

Sie können sehen, dass diese Spezifikation mit dem Beispiel übereinstimmt, das im CANUSB-Handbuch für die Befehle M und m (Code und Maske) angegeben ist. Bei der Maske bedeutet ein Bit von 1 „egal“ und ein Bit von 0 „egal“. Wenn Sie den Abschnitt „Filter 1“ (der nicht nur die ID, sondern auch das erste Datenbyte in der Nachricht vergleicht) nicht verwenden möchten, setzen Sie den Code und die Maskenbits, die Filter 1 entsprechen, auf alle 0 (damit es wird nur mit einer ID und einem Datenbyte von 0 übereinstimmen, was nicht passieren wird).

Angenommen, Sie interessieren sich nicht für das RTR-Bit, möchten Sie Folgendes verwenden: M00003AC0 ​​und m00000010

Ja, das hat es getan! Im Grunde musste ich nur noch die gewünschte ID um 5 Bits verschieben und zum Akzeptanzcode hinzufügen.

Ich vermute, dass Sie das Opfer eines zutiefst fehlerhaften Handbuchs sind. Ich bemerke, dass die Befehle "r" und "R", von denen man denken würde, dass sie Lesebefehle sind, als Lesebefehle aufgelistet, aber als Senden beschrieben werden. Weiterhin heißt es, dass 11-Bit-IDs über die gesamten 11 Bit ausgewählt werden können, nicht aber 29-Bit-IDs. Dies ist eine offensichtliche Verstümmelung der Funktion des SJA1000 im Basismodus, wo nur die 8 msbs des 11-Bit-ID-Felds gefiltert werden können. Auch wenn Englisch als Zweitsprache zugelassen wird, ist das kein gutes Zeichen.

Sie haben es nicht angegeben, aber ich nehme an, Sie testen, ob Sie sich an einen vorhandenen CANBus-Bus anschließen und lesen, was sich darauf befindet. Außerdem vermute ich, dass die vorhandenen Einheiten alle das standardmäßige (nicht erweiterte) ID-Feld mit 11 Bit verwenden und Sie den Befehl "riii" verwenden, um es zu lesen.

Das erste, was Sie erkennen müssen, ist, dass das Handbuch keinen Sinn macht. Vergleichen Sie Abb.9 und Abb.10 in den NJA100-Handbüchern. Für 11-Gebots-IDs sind die ID-Daten in ID 28-18 enthalten, wobei die Maskenregister 0 und 1 verwendet werden. Für 29-Bit-IDs sind die 11 lsbs ID10-0 und die entsprechenden Maskenregister sind 3 und 4. Es scheint, dass das Handbuch den R-Befehl verwendet und dann irgendwie vorgibt, dass die ID so formatiert ist, als ob sie mit gelesen wurde r Befehl, wenn das Sinn macht. Die Behauptung, dass die Verwendung von E0 anstelle von F0 zum Ausblenden des RTR-Bits eine Bestätigung dafür ist.

Weitere Bestätigung kommt von Ihren ID-Daten. Ihr Masken-Setup hat die hohen Bits nicht diskriminiert, und ich stelle fest, dass alle 10 ID-Bits, die Sie anzeigen, aktiv sind - das heißt, sie reagieren auf Don't-Cares in der Maske.

Das Einzige, was Sie (glaube ich) richtig gemacht haben, ist das Verschieben Ihrer Maskenbits nach links, aber nicht wegen RTR-Überlegungen, sondern um die 11-Bit-ID in den 12 Bits ganz links in den Registern auszurichten.

Also würde ich stattdessen M3ACFFFFF und m000FFFFF ausprobieren. Wenn das nicht funktioniert, versuchen Sie, verschiedene Kombinationen von Bits in den AC0- und AC1-Registern zu setzen, und sehen Sie sich die erkannten IDs an.