English version
Zusammenfassung
Der TL-WR841N(D) ist ein interessanter Router aus dem unteren Preissegment. Er bietet in der Version 8.x:
- 535MHZ MIPS AR9341 SoC mit GPIO Multiplexing
- 4MByte Flash / 32MByte RAM
- OpenWRT kompatibel
- JTAG Pin Header, auf dem 4 GPIOs leicht zugäglich sind
- Kosten : 15 Euro
Hier geht es um die Hardware Erweiterungen.
Achtung: Die abgebildete Platine funktioniert nur mit der Version 8.x des Routers !
CAN Interface
Gegenstand dieser Beschreibung ist eine CAN-Interface Platine, die auf den JTAG Pin Header aufgesteckt wird.
Im OpenWRT Image sind (fast) alle notwendigen Dateien vorhanden, um ein lauffähiges CAN-Interface
aufzubauen. Ausnahme ist die PIC-Firmware, die seperat auf den Router und den PIC geladen werden muss (siehe unten).
Hardware
Herz der Schaltung ist ein PIC18F25K80 bzw PIC18F26k80, der die CAN Daten in serielle Daten (SLCAN) umwandelt.
Als CAN Tranceiver dient ein ISO1050.
Aufgrund der galvanischen Trennung durch den Tranceiver muss zusätzlich eine weitere Stromversorung hinzugefügt werden. Diese
kann man entweder selbst als 5V einspeisen oder über den vorgesehene Längsregler auf der Platine generieren.
BOM (nur CAN)
Alle R,C LEDs sind SMD 1206
R1 4k7 Ohm
R2 120 Ohm
R7 270 Ohm
R8 10k Ohm
R9-10 220 Ohm
C1,C2 22pf
C3-C7 100nf
Q1 16MHz Crystal
LED1 LED green
LED2-3 LED yellow
IC1 PIC18F25K80-ISO or PIC18F26K80-ISO
IC2 TI ISO1050 DUBR
U$1 MC 78M05 CDTG
Reichelt Warenkorb (ohne TI ISO1050)
Die ICs 3-5 sind für den CAN-Betrieb nicht erforderlich und können weggelassen werden. Sie sind für
spätere Erweiterungen (I2C, RS485 ...) vorgesehen.
Platinen können hier bestellt werden:
Dirty PCBs
bzw. kurz mich per eMail kontaktieren, denn ich habe ggf. noch eine Platine übrig.
Zum Entfernen des Lötzinns in dem 14-poligen Pin-Header des Routers hat sich eine Kanüle mit 0,9mm
Durchmesser bewährt. Dazu wird das Lötzinn auf der Unterseite mit dem Lötkolben (mind. 60W) erhitzt
und die Kanüle von der Oberseite unter leichter Drehung vorsichtig durchgeschoben.
Zur Versorgung der Schaltung werden noch 3V3 vom Router auf Pin 14 benötigt. Auf der Platinenrückseite des
Routers findet man 3V3 an TP1.
Software
Fehlt: Beschreibung Erstinstallation Openwrt
Upgrade von Original Software
Sysupgrade von OpenWRT
Neben der OpenWRT Distribution basiert die Software aus dem PIC Programmer und der SLCAN-Firmware von Darron Broad:
- PIC Programmer
- SLCAN Firmware bzw.
- SLCAN Source Code
Der Clou der Kombination WR841 und SLCAN-Board besteht darin, das die GPIOs einmalig als PIC-Programmer und nachher
als UART dienen. Das erspart die Anschaffung eines PIC-Programmers.
Nach der Programmierung steht ein SocketCAN Interface zur Verfügung:
Progammierung der Firmware
root@ar9341:~# cd .pickle
root@ar9341:~/.pickle# ./pic-flash.sh
set GPIO3 as GPIO
set GPIO0 as GPIO
root@ar9341:~/.pickle# show-gpio | head -5
seems to be a WR841N v8 with AR9341 Revision 3
JP2 pin 9 GPIO00 O l GPIO
JP2 pin 3 GPIO01 I l GPIO
JP2 pin 5 GPIO02 O h GPIO
JP2 pin 7 GPIO03 I h GPIO
+root@ar9341:~/.pickle# p16 lvp id
[000000] [PROGRAM] 8000 WORDS (0400 ROWS OF 0020 WORDS)
[200000] [IDLOCATION1] FF .
[200001] [IDLOCATION2] FF .
[200002] [IDLOCATION3] FF .
[200003] [IDLOCATION4] FF .
[200004] [IDLOCATION5] FF .
[200005] [IDLOCATION6] FF .
[200006] [IDLOCATION7] FF .
[200007] [IDLOCATION8] FF .
[300000] [CONFIG1] 1214
[300002] [CONFIG2] 2869
[300004] [CONFIG3] 8100
[300006] [CONFIG4] 0081
[300008] [CONFIG5] C00F
[30000A] [CONFIG6] E00F
[30000C] [CONFIG7] 400F
[3FFFFE] [DEVICEID] 6124 DEV:309 REV:04 PIC18F26K80
[F00000] [DATA] 0400 BYTES
Die Firmware (500kbaud UART 250kBaud CAN)
ist durch CC BY-NC-SA 4.0 geschützt. Daher kann die Firmware nicht in dem hintelegten OpenWRT-Image integriert werden.
Aber die Firmware kann einfach aus dem Internet geholt werden:
root@ar9341:~/.pickle# wget http://lnxpps.de/openwrt/wr841/bin/can-can_uart500_can250.hex
root@ar9341:~/.pickle# p16 lvp p can-can_uart500_can250.hex
Total: 854
root@ar9341:~/.pickle# p16 lvp v can-can_uart500_can250.hex
Total: 854 Fail: 0
Umkonfiguration der Pins
root@ar9341:~/.pickle# ./ser_setup.sh
GPIO input/output register
18040000: 00030302
set GPIO3 as input
set GPIO0 as output
set GPIO3 as UART1_RD
set GPIO0 as UART1_TD
set GPIO0 Output
18040000: 0003030a
set GPIO0 as UART1_TD
GPIO 2 on
root@ar9341:~/.pickle# show-gpio | head -5
seems to be a WR841N v8 with AR9341 Revision 3
JP2 pin 9 GPIO00 O - UART1_TD
JP2 pin 3 GPIO01 I l GPIO
JP2 pin 5 GPIO02 O h GPIO
JP2 pin 7 GPIO03 I - UART1_RD
Konfiguration des CAN-Interfaces
root@ar9341:~/.pickle# cd
root@ar9341:~# slcand -S500000 ttyATH0 can0
root@ar9341:~# ifconfig can0 up
...
root@ar9341:~# ifconfig can0
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:21763 errors:0 dropped:0 overruns:0 frame:0
TX packets:28363 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:156877 (153.2 KiB) TX bytes:105633 (103.1 KiB)
root@ar9341:~# ip -s -d link show can0
6: can0: mtu 16 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 10
link/can promiscuity 0
RX: bytes packets errors dropped overrun mcast
156877 21763 0 0 0 0
TX: bytes packets errors dropped carrier collsns
105633 28363 0 0 0 0
Die Programmierung muss nur einmal durchgeführt werde. Danach, und nach jedem Neustart, steht das CAN Interface
unmittelbar zur Verfügung. Das Image enthält zudem Software zum Testen des CAN-Busses. Was auf dem CAN-Bus passiert,
kann man sich mit:
candump -tA -xe can0,0:0,#FFFFFFFF
anschauen. Weiterhin sind cansend, cangen (leicht modifiziert zum Original mit usec Auflösung), canbusload aus der CAN-Util Sammlung installiert.
Beispielprogramm
can2eth veranschaulicht die einfache Nutzung von SocketCAN. Das Programm
leitet alle Pakete von UDP Port 7654 an den CAN weiter. In umgekehrter Richtung werden alle eingehenden CAN Frames über UDP Port 7655 an die Broadcast Adresse gesendet.
TODOs
- Erweiterung der Firmware, so das die CAN-Baudrate über die SLCAN-API eingestellt werden kann
- Integration von I2C und RS232
Technische Anmerkung
Es existieren im Internet (wie auch hier auf diesem Server) Schaltungen unter Verwendung des MCP2515 CAN-Controllers. An dem CAN-Controller
ist nichts auszusetzen. Aber die Anbindung über SPI stellt für das Betriebssystem eine echte Herausforderung dar. Die Daten müssen
ausreichend schnell vom CAN-Controller abgerufen werden, ansonsten läuft der interne Buffer über. Da Linux kein Echtzeitbetriebssystem
mit garantierter Antwortszeit ist, können ggf. CAN-Frames vertauscht oder verloren gehen, wenn der CAN-Interrupt nicht schnell
genug abgearbeitet wird. Zudem sollte das Host-System über eine Hardware-SPI Schnittstelle verfügen. Die CPU bzw. der SoC auf dem hier
verwendeten Router verfügt über eine Hardware SPI-Schnittstelle; diese muss aber mit der Flash-Speicher geteilt werden.
Problematisch ist zudem die Anzahl der notwendigen SPI-Sequenzen um CAN-Frames vom Controller zu lesen. Der generische Linux SPI-Treiber
ist zwar ein lehrreiches Work-Queue Beispiel, aber der Overhaead ist erheblich und verschärft das Problem. Kurzum: SPI und Linux ist
keine gute Kombination.
Der Ansatz hier ist ein anderer: Die CAN-Frames werden in ASCII umgewandelt (SLCAN API) und ohne Aufforderung an den Host gesendet.
So kann das CAN-Interface seinen Buffer sofort wieder leeren. Da die meisten UARTs über FIFOs verfügen ist dieser Ansatz
trotz ASCII-Overheads die performantere Lösung.
Tests haben gezeigt, das die Firmware über 5000 CAN-Frames pro Sekunde (Test mit Extended Frames und DLC 8) verarbeiten und in ASCII
weiterleiten kann. Damit sticht diese Lösung viele andere Adapter (Selbstbau oder kommerziell) aus.
Reduced to the max
Impressum: