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: