Homepage Wiki Forum Buy

MCP2515 CAN

Aus GNUBLIN

Schwierigkeitsgrad Voraussetzung Gnublin Familie
Gnublin logo advanced.png Treiber laden, CAN Wissen, Kommandozeilen-Tools Alle


Inhaltsverzeichnis


Dieser Artikel beschreibt die Anbindung des GNUBLINs an einen CAN-Bus. Hierfür wird ein MCP2515 Baustein verwendet, welcher über die SPI Schnittstelle des Gnublins angesprochen wird und einen MCP2551 Can-Treiber ansteuert.

Das Datenblatt zum MCP2515 befindet sich hier

Das Datenblatt zum MCP2551 befindet sich hier

Module can.jpg


Vorbereitungen

Die einzelnen Bausteine werden wie in folgendem Bild dargestellt verbunden. Als Oszillator empfiehlt sich einer mit 16Mhz. Es kann aber auch einer mit 8MHz angeschlossen werden, dann muss man aber eine Änderung im Setup-Code vornehmen (siehe Hinweis im Thema: "Setup-Code anpassen")

Schaltbild CAN.jpg

  • VCC1 = 3,3V vom GNUBLIN
  • VCC2 = 5V z.B von einem Netzteil



Installation Tools & Treiber

Als erstes muss man den CAN Adapter mit Gnublin verbinden.

Zur Verwendung der CAN-Schnittstelle wird socketcan verwendet, welches mit den can-utils (Userspaceprogramme für den Empfang und den Versand von CAN Nachrichten) zu einem fertig kompilierten Debian-Paket geschnürt wurde.

GNUBLIN

Auf der SD Karte gibt es einen Ordner:

cd /root/deb

dort kann man das Paket installieren:

dpkg -i socketcan_full.deb

Der nächste Schritt ist das Laden des Moduls mcp251x mit folgendem Befehl.

Hinweis: Alle SPI Treiber wie CAN, ENC28J60, etc. müssen zuvor entladen sein! (z.B. modprobe -r enc28j60 oder modprobe -r spidev)

modprobe mcp251x

Im Standard hängt der CS auf 11 und IRQ auf 14.

Bzw. trägt man das Modul in die Datei /etc/modules ein (eine eigen Zeile das Wort mcp251x).


Als Ausgabe sollte folgendes Erscheinen:

mcp251x spi0.1: probed

RaspberryPi

Als erstes benötigt man einen passenden Kernel. Dafür lädt man den Download herunter und entpackt ihn auf dem pi:

pi@raspberrypi ~ $ wget http://gnublin.googlecode.com/files/rpi_kernel_can.tar.gz

Entpacken:

pi@raspberrypi ~ $ sudo tar xvzf rpi_kernel_can.tar.gz -C /


Jetzt neustarten.

pi@raspberrypi ~ $ sudo reboot

Libsocketcan installieren:

pi@raspberrypi ~ $ wget http://www.pengutronix.de/software/libsocketcan/download/libsocketcan-0.0.9.tar.bz2

Enpacken:

pi@raspberrypi ~ $ tar xvjf libsocketcan-0.0.9.tar.bz2

In das Verzeichnis wechseln:

pi@raspberrypi ~ $ cd libsocketcan-0.0.9

Installieren

pi@raspberrypi ~ $ ./configure && make && sudo make install

Jetzt benötigt man noch die CAN Utils:

pi@raspberrypi ~ $ cd ..

Download:

pi@raspberrypi ~ $ git clone https://git.gitorious.org/linux-can/can-utils.git

Übersetzen und installieren

pi@raspberrypi ~ $ cd can-utils
pi@raspberrypi ~ $ make && sudo make install

Das CAN Modul muss auf den Steckplatz im Bild gesteckt werden. Soll ein andere verwendet werden muss im Kernel Quelltext der Chipselect und Interrupt Pin angeben werden.

Rpican.JPG

Konfiguration GNUBLIN & RaspberryPi

Ab hier gilt die Beschreibung für alle Boards.

In dem Paket befinden sich die can-utils, mit denen es ziemlich einfach ist Nachrichten über CAN zu empfangen und zu senden. Ausserdem enthält das Debian-Paket die von den can-utils verwendeten library libsocketcan.

Nachdem alle Vorbereitungen erfüllt sind, starten wir das Gnublin und testen die Hardware. Zuerst müssen ein paar Zeilen in der Datei /etc/network/interfaces hinzugefügt werden.

auto can0
iface can0 inet manual
	#pre-up ip link set $IFACE type can bitrate 125000 listen-only off
	pre-up /sbin/ip link set $IFACE type can bitrate 125000 triple-sampling on
	up /sbin/ifconfig $IFACE up
	down /sbin/ifconfig $IFACE down

Anschließend muss man das Netzwerk neustarten

/etc/init.d/networking restart

CAN Beispiel Sitzung

Nun können wir mit cansend Daten über den CAN-Bus senden.

cansend can0 5A1#68.61.6c.6c.6f.21

Der Syntax für einen Beispielframe sieht folgendermaßen aus:

cansend can0 Identifyer#HEX-Daten

Dabei ist der Identifyer eine dreistellige Hex-Zahl und HEX-Daten sind bis zu acht zweistellige Hex-Zahlen mit einem optionalen Punkt nach jeder zweistelligen Zahl.

Möchte man allerdings lauschen was auf dem CAN-Bus gesendet wird verwendet man den Befehl candump. Der Syntax ist ziemlich einfach:

candump can0

Möchte man Informationen erhalten wie viele Pakete gesendet/empfangen wurden so muss man lediglich die Datei /proc/net/can/stats auslesen. Dies kann zum Beispiel mit cat erfolgen:

cat /proc/net/can/stats

Beim RaspberryPi muss man entsprechend die Rechte anpassen oder alles als sudo machen:

sudo cansend can0 5A1#68.61.6c.6c.6f.21

bzw.

sudo candump can0

Test der Übertragung mit Can_View

Für einen qualitativen Test des CAN-Bus wurde ein Tiny-Can Adapter von MHS-Elektronik verwendet. Der Vorteil des Adapters ist die mitgelieferte Software Can_View, welche eine grafische Oberfläche besitzt und den Empfang der Can Nachrichten sehr gut darstellt.

Can view.jpg

In dem Bild kann man die einzelnen Kommandos auf dem Gnublin sehen (links) und das Programm Can_View (rechts) welches die gesendeten Nachrichten anzeigt. Zuerst wurden 10 Nachrichten vom Gnublin mittels cansend an den Tiny-Can Adapter gesendet. Anschließend wurde der Befehl candump auf dem Gnublin ausgeführt und mittels Can_View Nachrichten zum Gnublin gesendet.

Das Programm candump auf dem Gnublin kann übrigens mit STRG+C beendet werden.


Für Fortgeschrittene

Konfiguration mit altem/anderem Kernel

Möchte man den Setup-Code allerdings manuell ändern so fügt man den folgenden Text in die Datei ea313x.c. Diese Datei befindet sich im Kernelverzeichnis unter arch/arm/mach-lpc313x. In der neuesten Version des Kernels 2.6.33 ist das alles nicht mehr notwendig, weswegen dazu geraten wird auf die neueste Version des kernels upzudaten (falls eine alte Version vorhanden ist einfach "git pull" in dem Kernelverzeichnis ausführen)

An den Anfang der Datei zu den include-Befehlen, wird folgender Eintrag hinzugefügt:

#include <linux/can/platform/mcp251x.h>

Anschließend scrollt man runter bis ca Zeile 439, dort sollte man dann den folgenden Text sehen:

#if defined(CONFIG_ENC28J60_SPI_DEV)

static int __init lpc313x_enc_register(void)
{ 
	struct spi_board_info info =
	{
		.modalias = "enc28j60",
		.max_speed_hz = 1000000,
		.bus_num = 1,
		.irq = IRQ_GPIO_16,//IRQ_GPIO14
		.irq = IRQ_GPIO_14,/*IRQ_GPIO14*/
		.chip_select = 0,
	};

	return spi_register_board_info(&info, 1);
}
arch_initcall(lpc313x_enc_register);

#endif


Nach diesem #endif muss der folgende Text eingefügt werden.


static int mcp251x_setup(struct spi_device *spi)
{
	return 0;
}


static int __init mcp251x_lpc313x_register (void)
{

   
    static struct mcp251x_platform_data mcp251x_info = {
         .oscillator_frequency = 16000000,
         .board_specific_setup = &mcp251x_setup,
         .model = CAN_MCP251X_MCP2515,
         .power_enable = NULL,
         .transceiver_enable = NULL,
 };
       
   struct spi_board_info info = {
           
                   .modalias = "mcp251x",
                   .platform_data = &mcp251x_info,
                   .irq = IRQ_GPIO14,
                   .max_speed_hz = 1000000,
                   .chip_select = 1,
 		  .bus_num = 0,
           }; 
 
    return spi_register_board_info(&info, 1);
 }
 arch_initcall(mcp251x_lpc313x_register);

Anschließend wird die Datei gespeichert und die benötigten Module werden im Kernel aktiviert.


HINWEIS! Verwendet man einen 8MHz Oszillator muss die Zeile .oscillator_frequency = 16000000, zu .oscillator_frequency = 8000000, geändert werden.


Kernelmodule

Der Gnublin-Develop-Kernel ist nach dem Befehl make gnublin_defconfig so eingestellt, dass der grundlegende CAN-Support direkt in den Kernel eingebaut sind und lediglich der Treiber für den MCP2515 als Modul vorliegt.

Falls man eine andere Variante des Kernels hat so sind nachfolgend die Optionen gelistet, welche aktiviert werden müssen.

  │ │       -*- Networking support  --->                                                   │ │   
  │ │       	<*>   CAN bus subsystem support  --->                                      │ │   
  │ │       		<*>   Raw CAN Protocol (raw access with CAN-ID filtering)          │ │   
  │ │       		<*>   Broadcast Manager CAN Protocol (with content filtering)      │ │   
  │ │            		 CAN Device Drivers  --->                                  │ │ 
  │ │       				<*> Virtual Local CAN Interface (vcan)             │ │   
  │ │       				<*> Platform CAN drivers with Netlink support      │ │   
  │ │       				[*]   CAN bit-timing calculation                   │ │   
  │ │       				<M>   Microchip MCP251x SPI CAN controllers        │ │    

Anschließend wird der Kernel wie in der Anleitung Kernel kompilieren + Module installieren gebaut und auf die SD-Karte kopiert.

In anderen Sprachen