Tiny Can API
Tiny Can API
Tiny-CAN-API 1
Inhaltsverzeichnis
1. Installation / Hardware.......................................................................................................4
2. Von der Hardware bis zum Anwenderprogramm..............................................................5
3. Dateien...............................................................................................................................8
4. Die API...............................................................................................................................9
4.1 Übersicht......................................................................................................................9
4.1 Der Parameter „index“...............................................................................................12
4.2 CAN-Filter..................................................................................................................14
4.3 Header Files...............................................................................................................14
3.5 API Funktionsaufrufe.................................................................................................22
3.6 EX-API Funktionsaufrufe...........................................................................................23
LoadDriver..................................................24
UnloadDriver................................................25
CanInitDriver...............................................26
CanDownDriver...............................................28
CanSetOptions...............................................29
CanDeviceOpen...............................................30
CanDeviceClose..............................................32
CanSetMode..................................................33
CanTransmit.................................................35
CanTransmitClear............................................36
CanTransmitGetCount.........................................37
CanTransmitSet..............................................38
CanReceive..................................................40
CanReceiveClear.............................................41
CanReceiveGetCount..........................................42
CanSetSpeed.................................................43
CanSetSpeedUser.............................................44
CanSetFilter................................................46
CanDrvInfo..................................................48
CanDrvHwInfo................................................49
CanGetDeviceStatus..........................................50
CanSetPnPEventCallback......................................52
CanSetStatusEventCallback...................................53
CanSetRxEventCallback.......................................54
CanSetEvents................................................55
CanExInitDriver.............................................56
CanExCreateDevice...........................................60
CanExDestroyDevice..........................................61
CanExCreateFifo.............................................62
CanExBindFifo...............................................63
CanExCreateEvent............................................64
CanExSetObjEvent............................................65
CanExSetEvent...............................................66
CanExResetEvent.............................................67
CanExWaitForEvent...........................................68
CanExGetDeviceCount.........................................70
CanExGetDeviceList..........................................71
CanExGetDeviceInfo..........................................74
Tiny-CAN-API 2
CanExDataFree...............................................78
CanExSetOptions.............................................79
CanExSetAsByte..............................................80
CanExSetAsWord..............................................81
CanExSetAsLong..............................................82
CanExSetAsUByte.............................................83
CanExSetAsUWord.............................................84
CanExSetAsULong.............................................85
CanExSetAsString............................................86
CanExGetAsByte..............................................87
CanExGetAsWord..............................................88
CanExGetAsLong..............................................89
CanExGetAsUByte.............................................90
CanExGetAsUWord.............................................91
CanExGetAsULong.............................................92
CanExGetAsString............................................93
5. Fehler-Codes (Error-Codes)............................................................................................94
6. Parameter........................................................................................................................95
7. Config-File........................................................................................................................97
8. Log File............................................................................................................................98
8. Beispiele.........................................................................................................................100
8.1 Verwendung der Tiny-CAN API im Polling-Modus..................................................100
8.2 Quellcode des Demoprogramms „ex_sample1“:.....................................................101
8.3 Verwendung der Tiny-CAN API im Event-Modus...................................................104
8.4 Quellcode des Demoprogramms „ex_sample6“:.....................................................104
8.5 Verwendung von Filtern und Sende-Puffern...........................................................110
Tiny-CAN-API 3
1. Installation / Hardware
Die Treiber-Installation, eine Beschreibung der Hardware, die Installation von „Tiny-CAN-
Monitor und Third Party Tools ist im Dokument „[Link]“ beschrieben.
Tiny-CAN-API 4
2. Von der Hardware bis zum Anwenderprogramm
Hardware Tiny-CAN
Receive
ReceiveFilter Receive Transmit
TransmitPuffer Transmit
A und
Filter
undPuffer
Puffer
Receive
FIFO
FIFO mit
Puffer
mitTimer
Timer
Transmit
FIFO
FIFO
USB
Windows
WindowsSystem
SystemTreiber
Treiber/ /
B Linux
Linux/ /OS
OSX(Apple)
X(Apple)Kernel
KernelTreiber
Treiber
Tiny-CAN API
C [Link] (Windows) / [Link] (Linux)
[Link] (Apple)
D Anwenderprogramm
Anwenderprogramm
A) Hardware
Die Grafik verdeutlicht die in der Tiny-CAN-Hardware bzw. -Firmware realisierten
Funktionen. Eine Besonderheit der Tiny-CAN Module sind die „Receive Filter & Puffer“
und „Transmit Puffer mit Timer“
CAN Funktion der „Receive Filter“ (Hardware Filter):
Rx
Je nach Hardware ist eine bestimmte Anzahl von Filtern
Filter
1
RxD Puffer 1 vorhanden, mit den Filtern ist es möglich, ein hohes
Datenaufkommen auf dem USB-Bus zu reduzieren. Eine gefilterte
Nachricht wird in dem dazugehörigen Puffer gespeichert, der
Filter RxD Puffer 2
2 Puffer wird immer wieder überschrieben. Alles was nach dem
Durchlauf der Filter noch übrig bleibt, landet im „RxD FIFO“ des
Filter RxD Puffer ...
Moduls.
...
RxD Fifo
Tiny-CAN-API 5
TxD Puffer & Funktion der „Transmit Puffer mit Timer“:
Timer 1
Tiny-CAN I 110 36
Tiny-CAN I-XL 350 72
4 4
Tiny-CAN II 110 36
Tiny-CAN II-XL 384
Tiny-CAN III
512 8 16
Tiny-CAN III-XL
72
Tiny-CAN IV-XL 900 4 8
Tiny-CAN M1 4
384 4
Tiny-CAN M232 12
Tiny-CAN-API 6
C) Tiny-CAN API
Die Tiny-CAN API ist eine plattformübergreifende Treiberschnittstelle, die es dem
Benutzer erlaubt, die Hardware mittels DLL (unter Windows) oder Shared Library (unter
Linux und OS X) anzusprechen. Die Funktionsaufrufe für die Betriebssysteme Windows,
Linux und OS X sind identisch.
D) Anwenderprogramm
● Dem Anwender stehen zahlreiche Applikationen auch von Drittanbietern zur
Verfügung.
● Eigene Applikationen können in C/C++, C#, VisualBasic 6, Python, LabView oder
Delphi entwickelt werden.
Tiny-CAN-API 7
3. Dateien
API Treiber
.../tiny_can/can_api/...
├ [Link] 2
Tiny-CAN API Treiber für Windows 32Bit
├ x64
│ └ [Link] 2
Tiny-CAN API Treiber für Windows 64Bit
├ [Link] 1
Tiny-CAN API Treiber für Linux 32/64Bit
└ [Link] 3
Tiny-CAN API Treiber für Apple OS X 64bit
Implementierung der Tiny-CAN API in C/C++, C#, VB6, Delphi und Python
.../tiny_can/dev/...
├ [Link] Dieses Dokument
├ lib Files zum dynamischen Laden eines Tiny-CAN API Treibers
│ ├ can_drv_config.h Treiber Konfigurationsdatei
│ ├ can_types.h Allgemeine Definitionen und Datentypen für CAN-Messages, Filter, ...
│ ├ can_drv.h Header-File der API, bindet auch can_types.h mit ein
│ ├ can_drv_ex.h Header-File der API, bindet auch can_types.h mit ein
│ ├ mhs_can_drv.c Modul zum dynamischen Laden der dll oder shared-lib, löst die Dateien „can_drv_win.c“ und „can_drv_linux.c“ ab
│ ├ can_drv_win.c 2
Modul zum dynamischen Laden der dll
│ └ can_drv_linux.c 1
Modul zum dynamischen Laden der shared-lib
├ static 2
Files zum statischen linken der [Link], inklusive Beispiel
├ C Programmbeispiele, die Beispiele „ex_..“ benutzen den neueren „Ex-API“ (Multi-Devices Support) Modus.
│ ├ sample1 Treiber laden, CAN-Bus initialisieren, eine CAN Nachricht versenden, Nachrichten im „Polling“ Modus empfangen
│ ├ sample2 Verwendung der Tiny-CAN API im Event-Modus
│ ├ sample3 Verwendung von Filtern und Sende-Puffern
│ ├ sample4 Verwendung von mehreren Filtern
│ ├ sample5 Versand vieler CAN Nachrichten mit maximaler Geschwindigkeit
│ ├ sample6 Abfrage und Auswertung der „Hardware Info Variablen“, setzen einer Benutzerdefinierten CAN Übertragungsgeschwindigkeit
Treiber laden und im „Ex“ Modus initialisieren, CAN-Bus initialisieren, eine CAN Nachricht versenden, Nachrichten im „Polling“
│ ├ ex_sample1 Modus empfangen
│ ├ ex_sample2 Demonstriert das Öffnen von 2 Devices und dem Empfang von CAN Daten im Polling Modus
│ ├ ex_sample3 Demonstriert die Verwendung eines virtuellen Empfangs-Puffer, 2 Devices schreiben in den Puffer
│ ├ ex_sample4 Beispiel für "CanExGetDeviceInfo" und "CanSetSpeedUser"
│ ├ ex_sample5 Beispiel für „CanExGetDeviceCount“ und „CanExGetDeviceList“
│ ├ ex_sample6 Zeigt das handling mehrere Devices mit Callbackfunktionen (Event-Modus)
│ └ ex_sample7 Beispiel für „CanExWaitForEvent“
├ delphi Komponenten und Beispielprogramme für Delphi
2
├ labview Implementierung der Tiny-CAN API für LabView von National Instruments
2
1 Nur in der Linux Version; 2 Nur in der Windows Version; 3 Nur in der Apple Version
Tiny-CAN-API 8
4. Die API
4.1 Übersicht
Device 0 Device X
Receive Filter und Puffer
● Es gibt 2 Typen von Filtern: Hardware- und Software-Filter
Main Thread Main Thread
● Die Funktion der Software-Filter ist mit denen der Hardware-Filter identisch, nur
dass die Messages in der Tiny-CAN API gefiltert werden Hilfs-Thread
● Software-Filter werden dynamisch angelegt, es können beliebig viele angelegt
(Plug & Play,...)
werden
Transmit-FIFO
● Software-Filter
Transmit-FIFO
haben mehr Funktionen als die Hardware-Filter
Receive FIFO
● Ein Software-FIFO, dessen Größe frei konfigurierbar ist
● Alle Nachrichten,
Transmit Puffer die sich im Receive
Transmit FIFO des Tiny-CANs befinden, werden in
Puffer
dieses FIFO
mit Timerübertragen und von der Applikation
mit Timer ausgelesen
Transmit Puffer mit Timer
● Siehe „A) Hardware“, die Tiny-CAN API speichert eine Kopie der Puffer und Timer.
Transmit FIFO Receive
Hardware Hardware Receive
● Ein Software-FIFO, dessen Größe frei&konfigurierbar
Filter Puffer ist
Filter & Puffer
● Ist das Transmit FIFO des Tiny-CAN Moduls zur Hälfte geleert, werden neue
Callback
Nachrichten des FIFOs zum Senden nachgeladen
Thread
Device Konfi- Device Konfi-
Haupt-Thread gurationsvariblen
gurationsvariblen
● Empfangs-Puffer und FIFO des Tiny-CAN Moduls auslesen
● Sende-FIFO und Puffer ins Tiny-CAN Modul schreiben
● Konfiguration und Einstellungen zum Tiny-CAN Modul übertragen
● Status des CAN Busses vom Tiny-CAN Modul auslesen
Virtuelle
Callback Thread Software Globale Konfigurations-
FIFOs
● Vom Haupt-Thread ausFilter variablen
werden die Callback-Funktionen getriggert, die dann vom
Callback Thread aus aufgerufen werden. Dadurch wird vermieden, dass die
Callback-Funktionen den Haupt-Thread blockieren
Hilfs-Thread API Interface
● Plug & Play Steuerung, kümmert sich um das Erkennen der Hardware
Treiber Laden
Über die Funktion „LoadDriver“ wird ein API Treiber geladen und mit „CanExInitDriver“
Initialisiert. Der Hilfs- und wenn entsprechend konfiguriert der Callback Thread werden
gestartet.
Ab diesen Zeitpunkt verwaltet der Treiber eine Liste verbundener Tiny-CAN Devices, die
mit „CanExGetDeviceList“ abgefragt werden kann, die Liste muss mit „CanExDataFree“
freigegeben werden. „CanExGetDeviceCount“ liefert nur die Anzahl der verbundenen
Devices.
Initialisierung:
Tiny-CAN-API 9
Zum öffnen eines Devices muss dies zuerst mit der Funktion „CanExCreateDevice“
angelegt und konfiguriert werden, bevor es mit „CanDeviceOpen“ geöffnet werden kann.
Der Device Thread wird erst beim öffnen des Devices gestartet. Die Funktion
„CanExGetDeviceInfo“ liefert detaillierte Informationen über das geöffnete Device.
Nach erfolgreicher Konfiguration kann der Bus mit „CanSetMode“ gestartet werden.
Ereignisse
Mit den Funktionen „CanSetPnPEventCallback“, „CanSetStatusEventCallback“,
„CanSetRxEventCallback“ können Ereignis Callback Funktionen gesetzt werden, über
„CanSetEvents“ lassen sich Ereignisse enablen/disablen. Voraussetzung für die Nutzung
der Event-Funktion ist das der Callback-Thread erzeugt wurde.
Eine andere Möglichkeit auf Ereignisse zu reagieren ist einen Thread schlafen zu lassen
bis ein Ereignis eintritt. Mit der Funktion „CanExWaitForEvent“ kann auf Ereignisse
(Events) bzw. Timeout gewartet werden. Für jeden Thread der „CanExWaitForEvent“
benutzt muss ein eigenes Event Objekt mit „CanExCreateEvent“ erzeugt werden. Ein
Event kann von einen Objekt innerhalb des Treibers das mit der Funktion
Tiny-CAN-API 10
„CanExSetObjEvent“ verknüpft wurde erzeugt werden. Ein Event kann auch von außen
mit der Funktion „CanExSetEvent“ erzeugt und mit der Funktion „CanExResetEvent“
gecanceld werden.
Beenden
Mit „UnloadDriver“ wird der API Treiber Entladen, vor dem Entladen wird automatisch die
Funktion „CanDownDriver“ aufgerufen, wodurch alle allokierten Ressourcen freigegeben
werden. Zuvor müssen jedoch alle geöffneten Devices mit „CanDeviceClose“ geschlossen
werden, es dürfen keine Callback-Funktionen mehr ausgelöst werden, bzw. alle Callback-
Funktionen müssen zurückgekehrt sein.
Kompatibilität
Um eine Kompatibilität zu früheren Versionen der API zu gewährleisten kann die
Initialisierung mit „CanInitDriver“ erfolgen, die API ist dann im Kompatibilitätsmodus und
kann nur ein CAN-Device ansprechen. Die „Ex“-Calls stehen nicht zur Verfügung. Damit
können ältere Applikation die neue API ohne Programmänderungen benutzen.
Tiny-CAN-API 11
4.1 Der Parameter „index“
Die meisten Funktionsaufrufe und Callbackfunktionen verwenden den Parameter „index“, deshalb wird der Parameter „index“ hier vorab
erläutert
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Sub-Index
Bei Virtuellen Empfangs-Puffern werden die oberen 16 Bit auf 0x8000 gesetzt, entspricht dem Wertebereich 0x800000000 –
0x80000FFFF
Tiny-CAN-API 12
Der „index“-Wert 0xFFFFFFFF ist Reserviert und wird zum Ansprechen der Globalen
Konfigurationsvariablen benutzt.
Reserviert Reserviert für zukünftige Anwendungen, alle Bits müssen auf 0 gesetzt
werden
Soft 0 = Hardware-Filter
1 = Software-Filter
RxD/TxD 0 = Empfangspuffer/FIFO
1 = Sendepuffer/FIFO
Das Bit wird in der Regel von den Funktionsaufrufen automatisch gesetzt
CAN Device Spezifiziert die Hardware, wenn mehr Module am PC angeschlossen sind.
CAN Kanal Spezifiziert den CAN-Kanal auf einem CAN-Device.
Sub-Index Index des FIFOs/Puffers im CAN Device/CAN Kanal
Tiny-CAN-API 13
4.2 CAN-Filter
Es gibt 3 Möglichkeiten, IDs aus dem CAN-Datenstrom heraus zu filtern, die gefilterte
Nachricht wird in dem dazugehörigen Puffer des Filters abgelegt, dieser wird mit jeder
neuen Nachricht überschrieben.
Filter-Type TMsgFilter
FilIdMode Code Maske
Maske & Code 0 Code Maske Die CAN-IDs mittels Maske Filtern, siehe unter
Start & Stop 1 Start Stop Den Bereich zwischen Start und Stop Filtern,
nur bei Software Filtern möglich
Single Id 2 Id - Eine einzelne ID filtern
Über „FilEFF“ wird festgelegt, ob Extended oder Standard Frames gefiltert werden,
„FilEFF = 1“ Extended Frames.
Wird „FilIdMode“ auf 1 gesetzt werden die gefilterten Messages nicht aus dem Datenstrom
entfernt, nur bei Software-Filtern möglich.
CAN-Filter mit „Maske“ und „Code“, die Bits der Maske entscheiden, welche Bits des CAN-
IDs mit Code übereinstimmen müssen, damit der Filter zuschlägt.
Die Tabelle verdeutlicht die Funktionsweise:
Bit 10 9 8 7 6 5 4 3 2 1 0
Maske 1 1 1 1 1 1 1 1 1 0 0
Code 1 0 1 0 0 0 0 0 0 0 0
Filter 1 0 1 0 0 0 0 0 0 X X
Ein X bedeutet, dass das entsprechende Bit den Wert 0 oder 1 haben kann.
Die Nachrichten mit den CAN-ID: 0x500 – 0x503 werden gefiltert.
Viele Definitionen der Struktur TMsgFilter sind für zukünftige Anwendungen vorgesehen,
deshalb sollten, bevor ein Filter verwendet wird, alle Flags gelöscht werden, „FilFlags = 0“.
#ifdef WIN32
Tiny-CAN-API 14
#ifndef __WIN32__
#define __WIN32__
#endif
#endif
#ifdef __WIN32__
// Windows
#include <windows.h>
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************/
/* Typen */
/***************************************************************/
/******************************************/
/* CAN Message Type */
/******************************************/
#define MsgFlags [Link]
#define MsgLen [Link]
#define MsgRTR [Link]
#define MsgEFF [Link]
#define MsgTxD [Link]
#define MsgSource [Link]
#define MsgData [Link]
struct TCanFlagsBits
{
unsigned Len:4; // DLC -> Datenlänge 0 - 8 Byte
unsigned TxD:1; // TxD -> 1 = Tx CAN Nachricht, 0 = Rx CAN Nachricht
// Eine Erfolgreich versendete Nachricht wird als Bestätigung
// ins Empfangsfifo zurückgeschrieben
// Nicht alle Module unterstützen diese Funktion u. das
// Feature muss aktiveirt sein
unsigned Error:1; // Error -> 1 = CAN Bus Fehler Nachricht
// Nicht alle Module unterstützen diese Funktion u. das
// Feature muss aktiveirt sein
unsigned RTR:1; // Remote Transmition Request bit -> Kennzeichnet eine RTR Nachricht
unsigned EFF:1; // Extended Frame Format bit -> 1 = 29 Bit Id's, 0 = 11 Bit Id's
unsigned Source:8; // Quelle der Nachricht (Device)
};
union TCanFlags
{
struct TCanFlagsBits Flag;
uint32_t Long;
};
union TCanData
{
char Chars[8];
unsigned char Bytes[8];
uint16_t Words[4];
uint32_t Longs[2];
};
struct TTime
{
uint32_t Sec;
uint32_t USec;
};
Tiny-CAN-API 15
struct TCanMsg
{
uint32_t Id;
union TCanFlags Flags;
union TCanData Data;
struct TTime Time;
};
/******************************************/
/* CAN Message Filter Type */
/******************************************/
#define FilFlags [Link]
#define FilEFF [Link]
#define FilMode [Link]
#define FilIdMode [Link]
#define FilEnable [Link]
struct TMsgFilterFlagsBits
{
// 1. Byte
unsigned Len:4; // * Dlc
unsigned Res:2; // Reserviert
unsigned RTR:1; // Remote Transmition Request
unsigned EFF:1; // Extended Frame Format
// 2. Byte
unsigned IdMode:2; // 0 = Maske & Code
// 1 = Start & Stop
// 2 = Single Id
unsigned DLCCheck:1; // *
unsigned DataCheck:1; // *
unsigned Res1:4;
// 3. Byte
unsigned Res2:8;
// 4. Byte
unsigned Type:4; // 0 = Single Puffer
unsigned Res3:2;
unsigned Mode:1; // 0 = Message entfernen
// 1 = Message nicht entfernen
unsigned Enable:1; // 0 = Filter sperren
// 1 = Filter freigeben
};
union TMsgFilterFlags
{
struct TMsgFilterFlagsBits Flag;
uint32_t Long;
};
struct TMsgFilter
{ // IdMode -> Maske & Code | Start & Stop | Single Id
// --------------------------+--------------+-----------
uint32_t Maske; // Filter-Id -> Maske | Stop |
uint32_t Code; // Filter-Id -> Code | Start | Id
union TMsgFilterFlags Flags;
union TCanData Data; // *
};
struct TCanIndexSource
{
// 1. u. 2 Byte
unsigned SubIndex:16;
// 3. Byte
unsigned Source:8;
// 4. Byte
unsigned TxD:1;
unsigned Soft:1;
unsigned User:6;
};
struct TCanIndexBits
{
// 1. u. 2 Byte
unsigned SubIndex:16;
// 3. Byte
unsigned Channel:4;
unsigned Device:4;
// 4. Byte
unsigned TxD:1;
unsigned Soft:1;
unsigned User:6;
};
union TCanIndex
Tiny-CAN-API 16
{
struct TCanIndexBits Item;
struct TCanIndexSource SrcItem;
uint32_t Long;
};
#ifdef __cplusplus
}
#endif
#endif
#include "can_types.h"
#ifdef __WIN32__
// ****** Windows
#include <windows.h>
#define CALLBACK_TYPE CALLBACK
#else
#define CALLBACK_TYPE
#endif
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************/
/* Define Makros */
/***************************************************************/
// CAN Übertragungsgeschwindigkeit
#define CAN_10K_BIT 10 // 10 kBit/s
#define CAN_20K_BIT 20 // 20 kBit/s
#define CAN_50K_BIT 50 // 50 kBit/s
#define CAN_100K_BIT 100 // 100 kBit/s
#define CAN_125K_BIT 125 // 125 kBit/s
#define CAN_250K_BIT 250 // 250 kBit/s
#define CAN_500K_BIT 500 // 500 kBit/s
#define CAN_800K_BIT 800 // 800 kBit/s
#define CAN_1M_BIT 1000 // 1 MBit/s
// Timestamp Mode
#define TIME_STAMP_OFF 0 // keine Time-Stamps
#define TIME_STAMP_SOFT 1 // Software Time-Stamps
#define TIME_STAMP_HW_UNIX 2 // Hardware Time-Stamps, UNIX-Format
#define TIME_STAMP_HW 3 // Hardware Time-Stamps
#define TIME_STAMP_HW_SW_UNIX 4 // Hardware Time-Stamps verwenden wenn verfügbar,
// ansonsten Software Time-Stamps
// Ab Treiber Version 4.08!
// DrvStatus
#define DRV_NOT_LOAD 0 // Die Treiber DLL wurde noch nicht geladen
#define DRV_STATUS_NOT_INIT 1 // Treiber noch nicht Initialisiert (Funktion "CanInitDrv" noch nicht
aufgerufen)
#define DRV_STATUS_INIT 2 // Treiber erfolgrich Initialisiert
#define DRV_STATUS_PORT_NOT_OPEN 3 // Die Schnittstelle wurde nicht geöffnet
#define DRV_STATUS_PORT_OPEN 4 // Die Schnittstelle wurde geöffnet
#define DRV_STATUS_DEVICE_FOUND 5 // Verbindung zur Hardware wurde Hergestellt
Tiny-CAN-API 17
#define DRV_STATUS_CAN_OPEN 6 // Device wurde geöffnet und erfolgreich Initialisiert
#define DRV_STATUS_CAN_RUN_TX 7 // CAN Bus RUN nur Transmitter (wird nicht verwendet !)
#define DRV_STATUS_CAN_RUN 8 // CAN Bus RUN
// CanStatus
#define CAN_STATUS_OK 0 // CAN-Controller: Ok
#define CAN_STATUS_ERROR 1 // CAN-Controller: CAN Error
#define CAN_STATUS_WARNING 2 // CAN-Controller: Error warning
#define CAN_STATUS_PASSIV 3 // CAN-Controller: Error passiv
#define CAN_STATUS_BUS_OFF 4 // CAN-Controller: Bus Off
#define CAN_STATUS_UNBEKANNT 5 // CAN-Controller: Status Unbekannt
// FIFO Status
#define FIFO_OK 0 // FIFO-Status: Ok
#define FIFO_HW_OVERRUN 1 // FIFO-Status: Hardware FIFO Überlauf
#define FIFO_SW_OVERRUN 2 // FIFO-Status: Software FIFO Überlauf
#define FIFO_HW_SW_OVERRUN 3 // FIFO-Status: Hardware & Software FIFO Überlauf
#define FIFO_STATUS_UNBEKANNT 4 // FIFO-Status: Unbekannt
/***************************************************************/
/* Typen */
/***************************************************************/
/******************************************/
/* Device Status */
/******************************************/
struct TDeviceStatus
{
int32_t DrvStatus; // Treiber Status (Device close / Device open / CAN Bus RUN)
unsigned char CanStatus; // Status des CAN Controllers (Ok / ... / Error passiv / Bus off)
unsigned char FifoStatus; // FIFO Status (Ok / ... / Hard. u. Soft. FIFO Überlauf)
};
/***************************************************************/
/* Funktionstypen */
/***************************************************************/
typedef int32_t (CALLBACK_TYPE *TCanInitDriver)(char *options);
typedef void (CALLBACK_TYPE *TCanDownDriver)(void);
typedef int32_t (CALLBACK_TYPE *TCanSetOptions)(char *options);
typedef int32_t (CALLBACK_TYPE *TCanDeviceOpen)(uint32_t index, char *parameter);
typedef int32_t (CALLBACK_TYPE *TCanDeviceClose)(uint32_t index);
typedef int32_t (CALLBACK_TYPE *TCanTransmit)(uint32_t index, struct TCanMsg *msg, int32_t count);
typedef void (CALLBACK_TYPE *TCanTransmitClear)(uint32_t index);
typedef uint32_t (CALLBACK_TYPE *TCanTransmitGetCount)(uint32_t index);
typedef int32_t (CALLBACK_TYPE *TCanTransmitSet)(uint32_t index, uint16_t cmd, uint32_t time);
typedef int32_t (CALLBACK_TYPE *TCanReceive)(uint32_t index, struct TCanMsg *msg, int32_t count);
typedef void (CALLBACK_TYPE *TCanReceiveClear)(uint32_t index);
typedef uint32_t (CALLBACK_TYPE *TCanReceiveGetCount)(uint32_t index);
Tiny-CAN-API 18
/***************************************************************/
/* Tiny-CAN API Funktionen */
/***************************************************************/
extern TCanInitDriver CanInitDriver;
extern TCanDownDriver CanDownDriver;
extern TCanSetOptions CanSetOptions;
extern TCanDeviceOpen CanDeviceOpen;
extern TCanDeviceClose CanDeviceClose;
/***************************************************************/
/* Funktionen Treiber laden/entladen */
/***************************************************************/
int32_t LoadDriver(char *file_name);
void UnloadDriver(void);
#include "can_drv_ex.h"
#ifdef __cplusplus
}
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
/***************************************************************/
/* Define Makros */
/***************************************************************/
#define CAN_FEATURE_LOM 0x0001 // Silent Mode (LOM = Listen only Mode)
#define CAN_FEATURE_ARD 0x0002 // Automatic Retransmission disable
#define CAN_FEATURE_TX_ACK 0x0004 // TX ACK (Gesendete Nachrichten bestätigen)
#define CAN_FEATURE_HW_TIMESTAMP 0x8000 // Hardware Timestamp
Tiny-CAN-API 19
#define VT_LONG_RANGE_ARRAY 0x11
#define VT_ULONG_RANGE_ARRAY 0x12
/***************************************************************/
/* Typen */
/***************************************************************/
struct TModulFeatures
{
uint32_t CanClock; // Clock-Frequenz des CAN-Controllers, muss nicht mit
// der Clock-Frequenz des Mikrocontrollers übereinstimmen
uint32_t Flags; // Unterstützte Features des Moduls:
// Bit 0 -> Silent Mode (LOM = Listen only Mode)
// 1 -> Automatic Retransmission disable
// 2 -> TX ACK (Gesendete Nachrichten bestätigen)
// 15 -> Hardware Timestamp
uint32_t CanChannelsCount; // Anzahl der CAN Schnittstellen, reserviert für
// zukünftige Module mit mehr als einer Schnittstelle
uint32_t HwRxFilterCount; // Anzahl der zur Verfügung stehenden Receive-Filter
uint32_t HwTxPufferCount; // Anzahl der zur Verfügung stehenden Transmit Puffer mit Timer
};
struct TCanDevicesList
{
uint32_t TCanIdx; //
Ist das Device geöffnet ist der Wert auf dem Device-Index
//
gesetzt, ansonsten ist der Wert auf "INDEX_INVALID" gesetzt.
uint32_t HwId; //
Ein 32 Bit Schlüssel der die Hardware eindeutig Identifiziert.
//
Manche Module müssen erst geöffnet werden damit dieser Wert
//
gesetzt wird
char DeviceName[255]; //
Nur Linux: entspricht den Device Namen des USB-Devices,
// z.B. /dev/ttyUSB0
char SerialNumber[16]; //
Seriennummer des Moduls
char Description[64]; // Modul Bezeichnung, z.B. "Tiny-CAN IV-XL",
// muss in den USB-Controller programmiert sein,
// was zur Zeit nur bei den Modulen Tiny-CAN II-XL,
// IV-XL u. M1 der Fall ist.
struct TModulFeatures ModulFeatures; // Unterstützte Features des Moduls, nur gültig
// wenn HwId > 0
};
struct TCanDeviceInfo
{
uint32_t HwId; // Ein 32 Bit Schlüssel der die Hardware eindeutig Identifiziert.
uint32_t FirmwareVersion; // Version der Firmware des Tiny-CAN Moduls
uint32_t FirmwareInfo; // Informationen zum Stand der Firmware Version
// 0 = Unbekannt
// 1 = Firmware veraltet, Device kann nicht geöffnet werden
// 2 = Firmware veraltet, Funktionsumfang eingeschränkt
// 3 = Firmware veraltet, keine Einschränkungen
// 4 = Firmware auf Stand
// 5 = Firmware neuer als Erwartet
char SerialNumber[16]; // Seriennummer des Moduls
char Description[64]; // Modul Bezeichnung, z.B. "Tiny-CAN IV-XL"
struct TModulFeatures ModulFeatures; // Unterstützte Features des Moduls
};
struct TCanInfoVar
{
uint32_t Key; // Variablen Schlüssel
uint32_t Type; // Variablen Type
uint32_t Size; // (Max)Größe der Variable in Byte
char Data[255]; // Wert der Variable
};
struct _TMhsEvent
{
volatile uint32_t Events;
volatile uint32_t EventsMask;
volatile int32_t Waiting;
#ifdef __WIN32__
// ****** Windows
HANDLE Event;
CRITICAL_SECTION EventLock;
Tiny-CAN-API 20
#else
// ****** Linux
#endif
};
/***************************************************************/
/* Funktionstypen */
/***************************************************************/
typedef int32_t (CALLBACK_TYPE *TCanExGetDeviceCount)(int flags);
typedef int32_t (CALLBACK_TYPE *TCanExGetDeviceList)(struct TCanDevicesList **devices_list, int flags);
typedef int32_t (CALLBACK_TYPE *TCanExGetDeviceInfo)(uint32_t index, struct TCanDeviceInfo *device_info,
struct TInfoVar **hw_info, uint32_t *hw_info_size);
typedef void (CALLBACK_TYPE *TCanExDataFree)(void **data);
typedef int32_t (CALLBACK_TYPE *TCanExCreateDevice)(uint32_t *index, char *options);
typedef int32_t (CALLBACK_TYPE *TCanExDestroyDevice)(uint32_t *index);
typedef int32_t (CALLBACK_TYPE *TCanExCreateFifo)(uint32_t index, uint32_t size, TMhsEvent *event_obj,
uint32_t event, uint32_t channels);
typedef int32_t (CALLBACK_TYPE *TCanExBindFifo)(uint32_t fifo_index, uint32_t device_index,
uint32_t bind);
typedef TMhsEvent * (CALLBACK_TYPE *TCanExCreateEvent)(void);
typedef int32_t (CALLBACK_TYPE *TCanExSetObjEvent)(uint32_t index, TMhsEvent *event_obj, uint32_t event);
typedef void (CALLBACK_TYPE *TCanExSetEvent)(TMhsEvent *event_obj, uint32_t event);
typedef void (CALLBACK_TYPE *TCanExResetEvent)(TMhsEvent *event_obj, uint32_t event);
typedef uint32_t (CALLBACK_TYPE *TCanExWaitForEvent)(TMhsEvent *event_obj, uint32_t timeout);
typedef int32_t (CALLBACK_TYPE *TCanExInitDriver)(char *options);
typedef int32_t (CALLBACK_TYPE *TCanExSetOptions)(uint32_t index, char *options);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsByte)(uint32_t index, char *name, char value);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsWord)(uint32_t index, char *name, int16_t value);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsLong)(uint32_t index, char *name, int32_t value);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsUByte)(uint32_t index, char *name, unsigned char value);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsUWord)(uint32_t index, char *name, uint16_t value);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsULong)(uint32_t index, char *name, uint32_t value);
typedef int32_t (CALLBACK_TYPE *TCanExSetAsString)(uint32_t index, char *name, char *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsByte)(uint32_t index, char *name, char *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsWord)(uint32_t index, char *name, int16_t *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsLong)(uint32_t index, char *name, int32_t *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsUByte)(uint32_t index, char *name, unsigned char *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsUWord)(uint32_t index, char *name, uint16_t *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsULong)(uint32_t index, char *name, uint32_t *value);
typedef int32_t (CALLBACK_TYPE *TCanExGetAsString)(uint32_t index, char *name, char **str);
/***************************************************************/
/* Tiny-CAN API Funktionen */
/***************************************************************/
extern TCanExGetDeviceCount CanExGetDeviceCount;
extern TCanExGetDeviceList CanExGetDeviceList;
extern TCanExGetDeviceInfo CanExGetDeviceInfo;
extern TCanExDataFree CanExDataFree;
extern TCanExCreateDevice CanExCreateDevice;
extern TCanExDestroyDevice CanExDestroyDevice;
extern TCanExCreateFifo CanExCreateFifo;
extern TCanExBindFifo CanExBindFifo;
extern TCanExCreateEvent CanExCreateEvent;
extern TCanExSetObjEvent CanExSetObjEvent;
extern TCanExSetEvent CanExSetEvent;
extern TCanExResetEvent CanExResetEvent;
extern TCanExWaitForEvent CanExWaitForEvent;
extern TCanExInitDriver CanExInitDriver;
extern TCanExSetOptions CanExSetOptions;
extern TCanExSetAsByte CanExSetAsByte;
extern TCanExSetAsWord CanExSetAsWord;
extern TCanExSetAsLong CanExSetAsLong;
extern TCanExSetAsUByte CanExSetAsUByte;
extern TCanExSetAsUWord CanExSetAsUWord;
extern TCanExSetAsULong CanExSetAsULong;
extern TCanExSetAsString CanExSetAsString;
extern TCanExGetAsByte CanExGetAsByte;
extern TCanExGetAsWord CanExGetAsWord;
extern TCanExGetAsLong CanExGetAsLong;
extern TCanExGetAsUByte CanExGetAsUByte;
extern TCanExGetAsUWord CanExGetAsUWord;
extern TCanExGetAsULong CanExGetAsULong;
extern TCanExGetAsString CanExGetAsString;
#ifdef __cplusplus
}
#endif
#endif
Tiny-CAN-API 21
3.5 API Funktionsaufrufe
Übersicht:
Treiber laden/entladen
3.5.1 LoadDriver Lädt einen Tiny-CAN API Treiber. STD Ex 24
3.5.2 UnloadDriver Tiny-CAN API Treiber entladen STD Ex 25
Initialisierung und Konfiguration
3.5.3 CanInitDriver Initialisiert den Treiber STD 26
3.5.2 CanDownDriver Deinitialisiert den Treiber STD Ex 28
3.5.3 CanSetOptions Setzen von Treiber-Optionen STD 29
3.5.4 CanDeviceOpen Öffnet ein CAN-Device STD Ex 30
3.5.5 CanDeviceClose Schließt ein CAN-Device STD Ex 32
CAN Betriebsmodus
3.5.6 CanSetMode CAN-Bus Mode setzen STD Ex 33
CAN Nachrichten versenden
3.5.7 CanTransmit CAN-Messages in FIFO/Puffer schreiben STD Ex 35
3.5.8 CanTransmitClear Sende-FIFO/Puffer löschen STD Ex 36
3.5.9 CanTransmitGetCount Anzahl Nachrichten im Sende-FIFO/Puffer abfragen STD Ex 37
3.5.10 CanTransmitSet Transmit Puffer senden und Intervall setzen STD Ex 38
CAN Nachrichten empfangen
3.5.11 CanReceive CAN-Messages von FIFO/Puffer auslesen STD Ex 40
3.5.12 CanReceiveClear Empfangs-FIFO/Puffer löschen STD Ex 41
3.5.13 CanReceiveGetCount Anzahl Nachrichten im Empfangs-FIFO/Puffer STD Ex 42
abfragen
CAN-Bus Setup
3.5.14 CanSetSpeed CAN-Übertragungsgeschwindigkeit einstellen STD Ex 43
3.5.15 CanSetSpeedUser Eine benutzerdefinierte CAN- STD Ex 44
Übertragungsgeschwindigkeit einstellen, z.B. 83,3
kBit/s.
3.5.16 CanSetFilter CAN-Empfangsfilter setzen STD Ex 46
Treiber und Hardware Informationen abfragen
3.5.17 CanDrvInfo Treiber-Info-Variablen abfragen STD Ex 48
3.5.18 CanDrvHwInfo Hardware-Info-Variablen abfragen STD 49
Treiber und CAN Status abfragen
3.5.19 CanGetDeviceStatus Device Status abfragen STD Ex 50
Callbackfunktionen Konfiguration
3.5.20 CanSetPnPEventCallback Plug & Play Event-Callback-Funktionen setzen STD Ex 52
3.5.21 CanSetStatusEventCallback Status Event-Callback-Funktionen setzen STD Ex 53
3.5.22 CanSetRxEventCallback Receive Event-Callback-Funktionen setzen STD Ex 54
3.5.23 CanSetEvents Event-Maske setzen STD Ex 55
Tiny-CAN-API 22
3.6 EX-API Funktionsaufrufe
Übersicht:
Initialisierung und Konfiguration
3.6.1 CanExInitDriver Initialisiert den Treiber im Ex-API Modus Ex 56
3.6.2 CanExCreateDevice Ein Device erzeugen Ex 60
3.6.3 CanExDestroyDevice Ein Device löschen Ex 61
3.6.4 CanExCreateFifo Empfangs-FIFO anlegen Ex 62
3.6.5 CanExBindFifo Empfangsfifo an Device binden Ex 63
Event-Funktionen
3.6.6 CanExCreateEvent Ein „Event“ Objekt erzeugen Ex 64
3.6.7 CanExSetObjEvent Objekt mit Event verknüpfen Ex 65
3.6.8 CanExSetEvent Ein Event auslösen Ex 66
3.6.9 CanExResetEvent Einen Event zurücksetzten Ex 67
3.6.10 CanExWaitForEvent Auf Event(s)/Timeout warten Ex 68
Info
3.6.11 CanExGetDeviceCount Anzahl verbundener Devices abfragen STD Ex 70
3.6.12 CanExGetDeviceList Liste verbundener Devices ausgeben STD Ex 71
3.6.13 CanExGetDeviceInfo Informationen zur Hardware abfragen STD Ex 74
Hilfsfunktionen
3.6.14 CanExDataFree Dynamisch allokierte Daten freigeben STD Ex 78
Konfigurationsvariablen lesen/schreiben
3.6.15 CanExSetOptions Eine Liste von Variablen setzen Ex 79
3.6.16 CanExSetAsByte „byte“ (8 bit) Variable setzen Ex 80
3.6.17 CanExSetAsWord „word“ (16 bit) Variable setzen Ex 81
3.6.18 CanExSetAsLong „long“ (32 bit) Variable setzen Ex 82
3.6.19 CanExSetAsUByte „unsigned byte“ (8 bit) Variable setzen Ex 83
3.6.20 CanExSetAsUWord „unsigned word“ (16 bit) Variable setzen Ex 84
3.6.21 CanExSetAsULong „unsigned long“ (32 bit) Variable setzen Ex 85
3.6.22 CanExSetAsString „String“ Variable setzten Ex 86
3.6.23 CanExGetAsByte „byte“ (8 bit) Variable lesen Ex 87
3.6.24 CanExGetAsWord „word“ (16 bit) Variable lesen Ex 88
3.6.25 CanExGetAsLong „long“ (32 bit) Variable lesen Ex 89
3.6.26 CanExGetAsUByte „unsigned byte“ (8 bit) Variable lesen Ex 90
3.6.27 CanExGetAsUWord „unsigned word“ (16 bit) Variable lesen Ex 91
3.6.28 CanExGetAsULong „unsigned long“ (32 bit) Variable lesen Ex 92
3.6.29 CanExGetAsString „String“ Variable lesen Ex 93
Tiny-CAN-API 23
3.5.1 LoadDriver
Parameter file_name Name des Treibers (DLL / Shared Lib) mit Verzeichnis.
Wird „NULL“ übergeben wird „[Link]“ geladen.
Rückgabewert Wenn der Treiber erfolgreich geladen worden ist, gibt die Funktion 0,
andernfalls einen „Error-Code“ zurück
Beschreibung Einen Tiny-CAN API Treiber dynamisch laden. Die Treiber befinden
sich im Unterverzeichnis „..\tiny_can\can_api“. Zur Zeit gibt es nur
einen Treiber, [Link] der alle Module unterstützt.
Wird unter Windows kein Verzeichnis angegeben wird das
Verzeichnis aus der Windows-Registrierungsdatenbank gelesen.
Tiny-CAN-API 24
3.5.2 UnloadDriver
Parameter keine
Rückgabewert nichts
Beschreibung Entlädt einen dynamisch geladenen API Treiber. Vor dem Entladen
ruft die Funktion automatisch „CanDownDriver“ auf.
Tiny-CAN-API 25
3.5.3 CanInitDriver
Rückgabewert Wenn der Treiber erfolgreich initialisiert worden ist, gibt die Funktion
0, andernfalls einen „Error-Code“ zurück
Beschreibung Die Funktion „CanInitDrv“ initialisiert den Treiber. Alle Funktionen des
Treibers sind erst nach erfolgreicher Initialisierung verfügbar. Einzige
Ausnahme ist die Funktion „CanDrvInfo“. Die von der DLL
verwendeten Systemressourcen werden erst nach Aufruf von
CanInitDrv belegt.
Achtung: Um die „Ex-API“ Funktionalität (Multi-Devices Support)
nutzen zu können muss die „CanExInitDriver“ Funktion aufgerufen
werden.
Beispiel:
Empfangsfifo auf 10000 CAN-Messages und Sendefifo auf 10 CAN-Messages
CanRxDFifoSize=10000;CanTxDFifoSize=10
Tiny-CAN-API 26
Bezeichner Beschreibung Type Init.
2 = THREAD_PRIORITY_HIGHEST
3 = THREAD_PRIORITY_TIME_CRITICAL
Hardware Reserviert, sollte nicht gesetzt werden. UByte 0
CfgFile Config File Name das von der DLL geladen wird. Wird String
der Dateiname ohne Pfad angegeben, so wird der Pfad
der DLL benutzt, unter Linux/MacOS X das
Verzeichnis „/etc/tiny_can“.
Section Name der Section, die im Config File gelesen wird String „Default“
LogFile Dateiname des Log-Files, ein leerer String legt kein String „“
Log-File an. Wird der Dateiname ohne Pfad
angegeben, so wird der Programmpfad der Applikation
benutzt, unter Linux/MacOS X das Verzeichnis
„/var/log/tiny_can“.
LogFlags Log Flags, siehe Kapitel 7. Log Files ULong 0
TimeStampMode 0= Disabled ULong 1
1= Software Time-Stamps
2= Hardware Time-Stamps, UNIX-Format
3= Hardware Time-Stamps
4= Hardware Time-Stamps verwenden wenn
verfügbar, ansonsten Software Time-Stamps
Achtung: Ist der Bus gestartet (RUN) wird die
Einstellung erst nach erneuten Start wirksam
Nicht in der Tabelle aufgeführte Bezeichner werden ignoriert, die Funktion liefert keinen
Fehler zurück.
Tiny-CAN-API 27
3.5.2 CanDownDriver
Parameter keine
Rückgabewert nichts
Beschreibung Gibt alle Systemressourcen wieder frei. Ein mehrmaliges Aufrufen der
Funktionen führt zu keinem Fehler.
Achtung: Diese Funktion blockiert solange bis alle
Callbackfunktionen zurückgekehrt sind! Andere Threads dürfen keine
API-Funktionen mehr aufrufen
Tiny-CAN-API 28
3.5.3 CanSetOptions
Beispiel:
CAN Übertragungsgeschwindigkeit auf 500 kBit/s und Auto Connect Modus ein.
CanSpeed1=500;AutoConnect=1
Tiny-CAN-API 29
3.5.4 CanDeviceOpen
Rückgabewert Wenn das Device erfolgreich geöffnet worden ist, gibt die Funktion 0,
andernfalls einen „Error-Code“ zurück
Beschreibung Die Funktion öffnet ein CAN-Device, also die Schnittstelle des PCs
zur Hardware und baut eine Verbindung zu dieser auf. Die
Schnittstelle kann mit „CanDeviceClose“ wieder geschlossen werden.
Beispiel:
Serielle Schnittstelle auf COM 4 und Baudrate auf 38400 Baud.
Port=4;BaudRate=38400
Tiny-CAN-API 30
Beispiel für das öffnen und Initialisieren eines CAN-Devices
Der Code ist bei den folgenden Beispielen bei „... Initialisierung ...“ einzufügen.
/******************************/
/* Initialisierung */
/******************************/
// **** Treiber DLL laden, [Link], Verzeichnis automatisch bestimmen
if ((err = LoadDriver(NULL)) < 0)
{
printf("LoadDriver Error-Code:%d\n\r", err);
goto ende;
}
// **** Treiber DLL initialisieren
if ((err = CanInitDriver(NULL)) < 0)
{
printf("CanInitDrv Error-Code:%d\n\r", err);
goto ende;
}
// **** Schnittstelle PC <-> USB-Tiny öffnen
if ((err = CanDeviceOpen(0, NULL)) < 0)
{
printf("CanDeviceOpen Error-Code:%d\n\r", err);
goto ende;
}
/***************************************/
/* CAN Speed einstellen & Bus starten */
/***************************************/
// **** Übertragungsgeschwindigkeit auf 125kBit/s einstellen
CanSetSpeed(0, CAN_125K_BIT);
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
CanSetMode(0, OP_CAN_START, CAN_CMD_ALL_CLEAR);
Tiny-CAN-API 31
3.5.5 CanDeviceClose
Beschreibung Die Funktion schließt ein CAN-Device, also die Schnittstelle des PCs
zur Hardware. Die Schnittstelle kann mit „CanDeviceOpen“ wieder
geöffnet werden.
Beispiel für das schließen eins CAN-Devices und beenden/entladen des API Treibers
Der Code ist bei den folgenden Beispielen bei „... beenden ...“ einzufügen.
/******************************/
/* Treiber beenden */
/******************************/
ende :
Tiny-CAN-API 32
3.5.6 CanSetMode
Tiny-CAN-API 33
Mehrere Befehle ausführen:
z.B. Hardware und Software Filter löschen
CAN_CMD_HW_FILTER_CLEAR | CAN_CMD_SW_FILTER_CLEAR
Beispiel:
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
if (CanSetMode(0, OP_CAN_START, CAN_CMD_ALL_CLEAR) < 0)
{
// Fehler
}
Tiny-CAN-API 34
3.5.7 CanTransmit
Beispiel:
int main(int argc, char **argv)
{
int err;
struct TCanMsg msg;
//
... Initialisierung ...
//
ende :
//
... beenden ...
//
}
Tiny-CAN-API 35
3.5.8 CanTransmitClear
Rückgabewert nichts
Beispiel:
/***********************************************************************
Es werden 1000 Nachrichten in das Senden-FIFO geschrieben, der
Sendevorgangs wird jedoch vorzeitig mit CanTransmitClear abgebrochen.
***********************************************************************/
int main(int argc, char **argv)
{
int32_t err;
//
... Initialisierung …
... Nachrichten Puffer mit 1000 Nachrichten erzeugen ...
//
if ((err = CanTransmit(0, MsgPuffer, 1000)) < 0)
{
printf("CanTransmit Error-Code:%d\n\r", err);
goto ende;
}
Sleep(50); // 50 ms warten
CanTransmitClear(0);
ende :
//
... beenden ...
//
}
Tiny-CAN-API 36
3.5.9 CanTransmitGetCount
Beschreibung Liefert die Anzahl der Nachrichten, in den mit „index“ angegebenen
FIFO/Puffer zurück
Beispiel:
int main(int argc, char **argv)
{
int32_t err;
//
... Initialisierung …
... Nachrichten Puffer mit 1000 Nachrichten erzeugen ...
//
ende :
//
... beenden ...
//
}
Tiny-CAN-API 37
3.5.10 CanTransmitSet
Beschreibung Einen mit „index“ angegebenen Transmit Puffer senden bzw. Intervall
Timer einstellen. Bei FIFOs kann CanTransmitSet nicht angewendet
werden.
Beispiel:
int main(int argc, char **argv)
{
int32_t err;
struct TCanMsg msg;
//
... Initialisierung ...
//
Tiny-CAN-API 38
goto ende;
}
ende :
//
... beenden ...
//
}
Tiny-CAN-API 39
3.5.11 CanReceive
count Gibt die Größe des Puffers auf den „msg“ zeigt an und
begrenzt die Anzahl der zu lesenden Messages
Rückgabewert Größer oder gleich 0 entspricht der Anzahl der gelesenen Messages,
im Fehlerfall wird ein „Error-Code“ zurückgegeben.
Beispiel:
int main(int argc, char **argv)
{
int err;
unsigned long i;
struct TCanMsg msg;
//
... Initialisierung ...
//
ende :
//
... beenden ...
//
}
Tiny-CAN-API 40
3.5.12 CanReceiveClear
Rückgabewert nichts
Beispiel:
/***********************************************************************
Die ersten 10 Nachrichten werden ignoriert und aus dem Empfangs-FIFO
gelöscht
***********************************************************************/
int main(int argc, char **argv)
{
unsigned long i;
struct TCanMsg msg;
//
... Initialisierung ...
//
Tiny-CAN-API 41
3.5.13 CanReceiveGetCount
Beschreibung Liefert die Anzahl der Messages in den mit „index“ angegebenen
FIFO/Puffer zurück
Beispiel:
/***********************************************************************
Es wird gewartet bis 10 Nachrichten im Empfangs-FIFO sind bis dann
alle 10 gelesen werden.
***********************************************************************/
int main(int argc, char **argv)
{
unsigned long i, ii;
struct TCanMsg msg[10];
//
... Initialisierung ...
//
Tiny-CAN-API 42
3.5.14 CanSetSpeed
Beispiel:
// **** Übertragungsgeschwindigkeit auf 125kBit/s einstellen
if (CanSetSpeed(0, CAN_125K_BIT) < 0)
{
// Fehler
}
Tiny-CAN-API 43
3.5.15 CanSetSpeedUser
Beschreibung Die Funktion schreibt direkt das BTR Register des CAN-Controllers.
Der BTR Wert lässt sich bequem mit dem Programm „CAN-Bus Bit-Timing Calculator“
berechnen:
1. Manufacturer: Spansion
2. Series: siehe Tabelle
3. Clock auf 24 MHz oder 16MHz einstellen,
siehe Tabelle.
Modul Serie Clock
[MHz]
Tiny-CAN I LX 24
Tiny-CAN I-XL FX/FM3 16
Tiny-CAN I-XL Embedded FX/FM3 16
Tiny-CAN II LX 24
Tiny-CAN II-XL FX/FM3 16
Tiny-CAN III LX 24
Tiny-CAN III-XL FX/FM3 16
Tiny-CAN M1 FX/FM3 16
Tiny-CAN M2 FX/FM3 16
Tiny-CAN M232 FX/FM3 16
Tiny-CAN IV-XL FX/FM3 16
Tiny-CAN LS FX/FM3 16
Beispiel:
// BTR Werte für 40kBit/s bei 16 u. 24 MHz
#define CAN_40K_16MHZ 0x3E53
#define CAN_40K_24MHZ 0x3E5D
Tiny-CAN-API 44
int32_t Set40Bits(uint32_t device_index)
{
int32_t err;
struct TCanDeviceInfo device_info;
Tiny-CAN-API 45
3.5.16 CanSetFilter
struct TMsgFilterFlagsBits
{
// 1. Byte
unsigned Len:4; // * Dlc
unsigned Res:2; // Reserviert
unsigned RTR:1; // Remote Transmition Request
unsigned EFF:1; // Extended Frame Format
// 2. Byte
unsigned IdMode:2; // 0 = Maske & Code
// 1 = Start & Stop
// 2 = Single Id
unsigned DLCCheck:1; // *
unsigned DataCheck:1; // *
unsigned Res1:4;
// 3. Byte
unsigned Res2:8;
// 4. Byte
unsigned Type:4; // 0 = Single Puffer
unsigned Res3:2;
unsigned Mode:1; // 0 = Message entfernen
// 1 = Message nicht entfernen
unsigned Enable:1; // 0 = Filter sperren
// 1 = Filter freigeben
};
union TMsgFilterFlags
{
struct TMsgFilterFlagsBits Flag;
uint32_t Long;
};
struct TMsgFilter
{ // IdMode -> Maske & Code | Start & Stop | Single Id
Tiny-CAN-API 46
// --------------------------+--------------+-----------
uint32_t Maske; // Filter-Id -> Maske | Stop |
uint32_t Code; // Filter-Id -> Code | Start | Id
union TMsgFilterFlags Flags;
union TCanData Data; // *
};
Beispiel:
/******************************/
/* Filter 1 setzen */
/******************************/
// Bit 11 - Bit0
// Maske 0 1 1 1 1 1 1 1 1 1 0 => 0x3FF
// Code 0 0 1 0 0 0 0 0 0 0 0 => 0x100
// Filter X 0 0 0 0 0 0 0 0 0 X
// Die CAN Messages 0x100 u. 0x500 werden gefiltert
msg_filter.Maske = 0x3FF;
msg_filter.Code = 0x100;
msg_filter.[Link] = 0L;
msg_filter.FilEnable = 1; // Filter freigeben
Tiny-CAN-API 47
3.5.17 CanDrvInfo
Parameter keine
Beispiel:
Hardware=Tiny-CAN Classic;Version=1.00;Interface Type=Serial
printf("Treiber Info:\n\r");
if (!(s = CanDrvInfo()))
{
printf("CanDrvInfo Error\n\r");
goto ende;
}
// Die Funktion get_item_as_string verändert den ursprünglichen String,
// darum muss eine Kopie des Strings erstellt werden
info_str = mhs_strdup(s);
s = info_str;
do
{
// Bezeichner auslesen
key = get_item_as_string(&s, ":=", &match);
if (match <= 0)
break;
// Value auslesen
val = get_item_as_string(&s, ";", &match);
if (match < 0)
break;
printf("%-20s : %s\n\r", key, val);
}
while(1);
save_free(info_str); // Allokierten Speicher für den String freigeben
Tiny-CAN-API 48
3.5.18 CanDrvHwInfo
Beispiel:
Hardware ID String=TINY-CAN;Hardware Snr=00 00 00 01
//
... Initialisierung ...
Zur Abfrage der Hardware-Info-Variablen muss das Device geöffnet
sein, der CAN-Bus muss nicht gestartet sein.
//
printf("Hardware Info:\n\r");
// **** Hardware-Info-Variablen abfragen
if (!(s = CanDrvHwInfo(0)))
{
printf("CanDrvHwInfo Error\n\r");
goto ende;
}
//
... beenden ...
//
}
Tiny-CAN-API 49
3.5.19 CanGetDeviceStatus
Beschreibung Abfrage des Device-Status und des CAN-Bus-Status, der mit „index“
angegeben wurde
Tiny-CAN-API 50
CAN_STATUS_UNBEKANNT 5 CAN-Controller: Status Unbekannt
FIFO-Status: status->FifoStatus
FIFO_OK 0 FIFO-Status: Ok
FIFO_OVERRUN 1 FIFO-Status: Überlauf
FIFO_STATUS_UNBEKANNT 2 FIFO-Status: Unbekannt
Beispiel:
// Status abfragen
CanGetDeviceStatus(0, &status);
Tiny-CAN-API 51
3.5.20 CanSetPnPEventCallback
Rückgabewert nichts
Beschreibung Setzt die Plag & Play Event-Callback-Funktion. Damit die Funktion
aufgerufen wird, muss sie mit „CanSetEvents“ freigegeben werden
und der Treiber muss im Event-Modus arbeiten.
/******************************/
/* Initialisierung */
/******************************/
// **** Event Funktionen setzen
CanSetPnPEventCallback(&CanPnPEvent);
// **** Alle Events freigeben
CanSetEvents(EVENT_ENABLE_ALL);
/*
...
Hauptprogramm
...
*/
/******************************/
/* Beenden */
/******************************/
// **** Alle Events sperren
CanSetEvents(EVENT_DISABLE_ALL);
// **** Warten bis alle Event-Funktion zurückgekehrt sind
while (!CanEventStatus())
{
}
Tiny-CAN-API 52
3.5.21 CanSetStatusEventCallback
Rückgabewert nichts
Beispiel:
// Status Event-Funktion
static void CALLBACK_TYPE CanStatusEvent(uint32_t index, struct TDeviceStatus *status)
{
printf(">>> Status: %s, %s, %s\n\r", DrvStatusStrings[status->DrvStatus],
CanStatusStrings[status->CanStatus], CanFifoStrings[status->FifoStatus]);
if (status->DrvStatus >= DRV_STATUS_CAN_OPEN)
{
if (status->CanStatus == CAN_STATUS_BUS_OFF)
{
printf(">>> CAN Status BusOff clear\n\r");
CanSetMode(0, OP_CAN_RESET, CAN_CMD_ALL_CLEAR);
}
}
}
/******************************/
/* Initialisierung */
/******************************/
// **** Event Funktionen setzen
CanSetStatusEventCallback(&CanStatusEvent);
// **** Alle Events freigeben
CanSetEvents(EVENT_ENABLE_ALL);
/*
...
Hauptprogramm
...
*/
/******************************/
/* Beenden */
/******************************/
// **** Alle Events sperren
CanSetEvents(EVENT_DISABLE_ALL);
// **** Warten bis alle Event-Funktion zurückgekehrt sind
while (!CanEventStatus())
{
}
Tiny-CAN-API 53
3.5.22 CanSetRxEventCallback
Rückgabewert nichts
Beispiel:
// RxD Event-Funktion
static void CALLBACK_TYPE CanRxEvent(uint32_t index, struct TCanMsg *msg, int32_t count)
{
struct TCanMsg message;
unsigned long i;
/******************************/
/* Initialisierung */
/******************************/
// **** Event Funktionen setzen
CanSetRxEventCallback(&CanRxEvent);
// **** Alle Events freigeben
CanSetEvents(EVENT_ENABLE_ALL);
/*
...
Hauptprogramm
...
*/
/******************************/
/* Beenden */
/******************************/
// **** Alle Events sperren
CanSetEvents(EVENT_DISABLE_ALL);
// **** Warten bis alle Event-Funktion zurückgekehrt sind
while (!CanEventStatus())
{
}
Tiny-CAN-API 54
3.5.23 CanSetEvents
Rückgabewert nichts
Tiny-CAN-API 55
3.6.1 CanExInitDriver
Rückgabewert Wenn der Treiber erfolgreich initialisiert worden ist, gibt die Funktion
0, andernfalls einen „Error-Code“ zurück
Beispiel:
Empfangsfifo auf 16384 CAN-Messages und Sendefifo auf 16384 CAN-Messages
CanRxDFifoSize=16384;CanTxDFifoSize=16384
Tiny-CAN-API 56
Bezeichner Beschreibung Type Init.
angegeben, so wird der Programmpfad der Applikation
benutzt, unter Linux/MacOS das Verzeichnis
„/var/log/tiny_can“.
LogFlags Log Flags, siehe Kapitel 7. Log Files ULong 0
Nicht in der Tabelle aufgeführte Bezeichner werden ignoriert, die Funktion liefert keinen
Fehler zurück.
/*
AUSSCHNITT AUS MAIN
*/
uint32_t device_index_a, device_index_b;
/******************************/
/* Initialisierung */
/******************************/
device_index_a = INDEX_INVALID;
device_index_b = INDEX_INVALID;
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
CanSetMode(device_index_a, OP_CAN_START, CAN_CMD_ALL_CLEAR);
/********************************/
/* Device B erzeugen u. öffnen */
/********************************/
// **** Device u. Empfangs-FIFO für das Device erzeugen
if ((err = CanExCreateDevice(&device_index_b, "CanRxDFifoSize=16384")) < 0)
Tiny-CAN-API 57
{
printf("CanExCreateDevice Error-Code:%d\n\r", err);
goto ende;
}
// **** Schnittstelle PC <-> Tiny-CAN öffnen
if ((err = CanDeviceOpen(device_index_b, DEVICE_OPEN_B)) < 0)
{
printf("CanDeviceOpen Error-Code:%d\n\r", err);
goto ende;
}
// **** Übertragungsgeschwindigkeit einstellen
CanSetSpeed(device_index_b, CAN_SPEED);
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
CanSetMode(device_index_b, OP_CAN_START, CAN_CMD_ALL_CLEAR);
/*
AUSSCHNITT AUS MAIN
*/
uint32_t device_index_a, device_index_b;
/******************************/
/* Initialisierung */
/******************************/
device_index_a = INDEX_INVALID;
device_index_b = INDEX_INVALID;
Tiny-CAN-API 58
CanSetSpeed(device_index_a, CAN_SPEED);
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
CanSetMode(device_index_a, OP_CAN_START, CAN_CMD_ALL_CLEAR);
/********************************/
/* Device B erzeugen u. öffnen */
/********************************/
// **** Device erzeugen
if ((err = CanExCreateDevice(&device_index_b, NULL)) < 0)
{
printf("CanExCreateDevice Error-Code:%d\n\r", err);
goto ende;
}
// **** Schnittstelle PC <-> Tiny-CAN öffnen
if ((err = CanDeviceOpen(device_index_b, DEVICE_OPEN_B)) < 0)
{
printf("CanDeviceOpen Error-Code:%d\n\r", err);
goto ende;
}
// **** Übertragungsgeschwindigkeit einstellen
CanSetSpeed(device_index_b, CAN_SPEED);
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
CanSetMode(device_index_b, OP_CAN_START, CAN_CMD_ALL_CLEAR);
/*************************************************************/
/* Empfangs FIFO erzeugen und mit allen Devices verknüpfen */
/*************************************************************/
if ((err = CanExCreateFifo(RX_FIFO_INDEX, 10000, NULL, 0, 0xFFFFFFFF)))
{
printf("CanExCreateFifo Error-Code:%d\n\r", err);
}
Tiny-CAN-API 59
3.6.2 CanExCreateDevice
Parameter *index Wird auf dem Index-Wert gesetzt unter dem das
erzeugte Device angesprochen wird.
Beschreibung Erzeugt ein Device Objekt das Konfiguriert werden kann. Das Device
kann nun mit „CanDeviceOpen“ geöffnet werden.
Die Variablen „CanRxDFifoSize“ und „CanTxDFifoSize“ können nur
beim Aufruf der Funktion gesetzt werden. Werden die Variablen nicht
gesetzt werden die Defaultwerte aus „CanExInitDriver“ verwendet.
Tiny-CAN-API 60
3.6.3 CanExDestroyDevice
Parameter *index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Löscht ein Device Objekt. Das Device muss geschlossen sein!
Tiny-CAN-API 61
3.6.4 CanExCreateFifo
event Gibt das Event Bit an was bei auslösen des Events
gesetzt wird. Ist „event_obj“ NULL wird „event“ ignoriert.
channels Gibt die Devices an mit dem das FIFO verknüpft wird,
siehe auch „CanExBindFifo“
Beschreibung Ein Empfangs-FIFO mit der Größe „size“ erzeugen. Das FIFO kann
mit ein oder mehreren Devices verknüpft werden, auch wenn diese
noch nicht erzeugt wurden. Verknüpfungen zwischen Devices können
auch mit „CanExBindFifo“ erstellt/aufgehoben werden.
Tiny-CAN-API 62
3.6.5 CanExBindFifo
Beispiel:
device_index_a = INDEX_INVALID;
device_index_b = INDEX_INVALID;
Tiny-CAN-API 63
3.6.6 CanExCreateEvent
Parameter keine
Rückgabewert Das erzeugte „Event“ Objekt, bei Fehler gibt die Funktion NULL
zurück.
Tiny-CAN-API 64
3.6.7 CanExSetObjEvent
Beschreibung Ein Objekt mit einen Event-Objekt verknüpfen. Ein Objekt kann nur
mit einen Event-Objekt verknüpft werden.
Tiny-CAN-API 65
3.6.8 CanExSetEvent
Rückgabewert nichts
Tiny-CAN-API 66
3.6.9 CanExResetEvent
Rückgabewert nichts
Beschreibung Einen Event löschen. Events werden automatisch beim Verlassen der
Funktion „CanExWaitForEvent“ gelöscht.
Tiny-CAN-API 67
3.6.10 CanExWaitForEvent
Beschreibung Warten auf das Eintreten von Ereignissen oder Timeout. Jedem
Event ist ein Bit einer 32 Bit Variable zugeordnet, das letzte Bit (31)
ist für das beenden reserviert.
/*****************************************************/
/* Selbst definierten Event setzten */
/*****************************************************/
static void ProcessOpenClose(int32_t key_idx)
{
// ...
CanExSetEvent(Event, CMD_EVENT);
}
/****************/
/* Event Thread */
/****************/
static DWORD __stdcall thread_execute(void *data)
{
uint32_t event;
do
{
event = CanExWaitForEvent(Event, 0); // Auf Events warten
if (event & 0x80000000) // Beenden Event, Thread Schleife verlassen
break;
else if (event & RX_EVENT) // CAN Rx Event
RxMsg();
else if (event & PNP_EVENT) // Pluy & Play Event
CanPnPEvent();
else if (event & STATUS_EVENT) // Event Status Änderung
CanStatusEvent();
else if (event & CMD_EVENT) // Kommando Event
{
ProcessCmd(Cmd);
Cmd = 0;
}
}
Tiny-CAN-API 68
while (1);
return(0);
}
/*****************************************************/
/* Event Thread erzeugen & Events konfigurieren */
/*****************************************************/
Event = CanExCreateEvent(); // Event Objekt erstellen
// Event Thread erzeugen und starten
Thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread_execute,
NULL, 0, NULL);
// Events mit API Ereignissen verknüfpen
CanExSetObjEvent(0x80000000, MHS_EVS_OBJECT, Event, RX_EVENT);
CanExSetObjEvent(INDEX_INVALID, MHS_EVS_PNP, Event, PNP_EVENT);
for (i = 0; i < 4; i++)
CanExSetObjEvent(DeviceIndex[i], MHS_EVS_STATUS, Event, STATUS_EVENT);
/*
Hauptprogramm Loop
*/
/*****************************************************/
/* Event Thread beenden */
/*****************************************************/
if (Thread)
{
// Terminate Event setzen
CanExSetEvent(Event, MHS_TERMINATE);
// Warten bis der Event Thread beenden
WaitForSingleObject(Thread, INFINITE);
// Thread freigeben
CloseHandle(Thread);
}
Tiny-CAN-API 69
3.6.11 CanExGetDeviceCount
Beispiel:
int main(int argc, char **argv)
{
int32_t err;
Tiny-CAN-API 70
3.6.12 CanExGetDeviceList
Parameter devices_list Pointer Pointer auf die Devices Liste, die Liste wird
von der Funktion dynamisch allokiert und muss mit
der Funktion „CanExDataFree“ wieder freigegeben
werden.
/***************************************************************/
/* Typen */
/***************************************************************/
struct TModulFeatures
{
uint32_t CanClock; // Clock-Frequenz des CAN-Controllers, muss nicht mit
// der Clock-Frequenz des Mikrocontrollers übereinstimmen
uint32_t Flags; // Unterstützte Features des Moduls:
// Bit 0 -> Silent Mode (LOM = Listen only Mode)
// 1 -> Automatic Retransmission disable
// 2 -> TX ACK (Gesendete Nachrichten bestätigen)
// 15 -> Hardware Timestamp
uint32_t CanChannelsCount; // Anzahl der CAN Schnittstellen, reserviert für
// zukünftige Module mit mehr als einer Schnittstelle
uint32_t HwRxFilterCount; // Anzahl der zur Verfügung stehenden Receive-Filter
uint32_t HwTxPufferCount; // Anzahl der zur Verfügung stehenden Transmit Puffer mit
Timer
};
Tiny-CAN-API 71
struct TCanDevicesList
{
uint32_t TCanIdx; // Ist das Device geöffnet ist der Wert auf dem Device-Index
// gesetzt, ansonsten ist der Wert auf "INDEX_INVALID" gesetzt.
uint32_t HwId; // Ein 32 Bit Schlüssel der die Hardware eindeutig Identifiziert.
// Manche Module müssen erst geöffnet werden damit dieser Wert
// gesetzt wird
char DeviceName[255]; // Nur Linux: entspricht den Device Namen des USB-Devices,
// z.B. /dev/ttyUSB0
char SerialNumber[16]; // Seriennummer des Moduls
char Description[64]; // Modul Bezeichnung, z.B. "Tiny-CAN IV-XL"
struct TModulFeatures ModulFeatures; // Unterstützte Features des Moduls, nur gültig
// wenn HwId > 0
};
Beispiel:
void PrintDevices(void)
{
int32_t i, num_devs;
uint32_t idx;
char *str;
char str_puf[100];
struct TCanDevicesList *l;
/**************************************************************/
/* M A I N */
/**************************************************************/
int main(int argc, char **argv)
Tiny-CAN-API 72
{
int32_t err;
Tiny-CAN-API 73
3.6.13 CanExGetDeviceInfo
Beschreibung Die Funktion fragt die „Device Info“ und/oder die „Hardware Info“
Variablen ab.
Tiny-CAN-API 74
};
Beispiel:
#define VALUE_TYPE_DESC_SIZE 20
struct TValueTypeDesc
{
uint32_t Type;
const char *Bezeichner;
};
switch (info[i].Type)
{
case VT_BYTE : {
printf("%d\n\r", *((signed char*)(info[i].Data)));
break;
}
case VT_UBYTE : {
printf("%u\n\r", *((unsigned char *)(info[i].Data)));
break;
}
case VT_HBYTE : {
printf("0x%02X\n\r", *((unsigned char *)(info[i].Data)));
break;
}
case VT_WORD : {
printf("%d\n\r", *((signed short *)(info[i].Data)));
break;
}
case VT_UWORD : {
printf("%u\n\r", *((uint16_t *)(info[i].Data)));
break;
}
case VT_HWORD : {
Tiny-CAN-API 75
printf("0x%04X\n\r", *((uint16_t *)(info[i].Data)));
break;
}
case VT_LONG : {
printf("%ld\n\r", *((int32_t *)(info[i].Data)));
break;
}
case VT_ULONG : {
printf("%lu\n\r", *((uint32_t *)(info[i].Data)));
break;
}
case VT_HLONG : {
printf("0x%08lX\n\r", *((uint32_t *)(info[i].Data)));
break;
}
case VT_STRING : {
printf("%s\n\r", info[i].Data);
break;
}
}
}
printf("-------+--------+------+-------------------------------\n\r\n\r");
}
/**************************************************************/
/* M A I N */
/**************************************************************/
int main(int argc, char **argv)
{
int err;
uint32_t device_index;
struct TInfoVar *hw_info;
uint32_t hw_info_size;
struct TCanDeviceInfo device_info;
hw_info = NULL;
//
... Initialisierung im EX-Modus ...
//
/*************************************************/
/* Device u. Hardware Info Variablen abfragen */
/*************************************************/
if ((err = CanExGetDeviceInfo(device_index, &device_info, &hw_info, &hw_info_size)) < 0)
{
printf("CanExGetDeviceInfo Error-Code:%d\n\r", err);
Tiny-CAN-API 76
goto ende;
}
PrintDeviceInfo(&device_info);
PrintHwInfo(hw_info, hw_info_size);
//
... beenden ...
//
}
Tiny-CAN-API 77
3.6.14 CanExDataFree
Parameter data Pointer Pointer auf Daten, der Daten Pointer wird auf
NULL gesetzt.
Rückgabewert nichts
Beschreibung Von der API Dynamisch allokierte Daten wieder freigeben, wie z.B.
von „CanExGetDeviceList“. Die Funktion prüft vor Freigabe ob der
„Daten Pointer“ ungleich NULL ist, nach Freigabe wird der Pointer auf
NULL gesetzt.
Tiny-CAN-API 78
3.6.15 CanExSetOptions
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beispiel:
CAN Übertragungsgeschwindigkeit auf 500 kBit/s und Transmit Message Request
freigeben.
CanSpeed=500;CanTxAckEnable=1
Tiny-CAN-API 79
3.6.16 CanExSetAsByte
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „byte“ sein.
Tiny-CAN-API 80
3.6.17 CanExSetAsWord
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „word“ sein.
Tiny-CAN-API 81
3.6.18 CanExSetAsLong
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „long“ sein.
Tiny-CAN-API 82
3.6.19 CanExSetAsUByte
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „unsigned byte“ sein.
Tiny-CAN-API 83
3.6.20 CanExSetAsUWord
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „unsigned word“ sein.
Tiny-CAN-API 84
3.6.21 CanExSetAsULong
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „unsigned long“ sein.
Tiny-CAN-API 85
3.6.22 CanExSetAsString
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben setzen, sofern das „schreiben“ erlaubt ist.
Der Type des zu setzenden Parameters muss „String“ sein.
Tiny-CAN-API 86
3.6.23 CanExGetAsByte
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „byte“ sein.
Tiny-CAN-API 87
3.6.24 CanExGetAsWord
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „word“ sein.
Tiny-CAN-API 88
3.6.25 CanExGetAsLong
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „long“ sein.
Tiny-CAN-API 89
3.6.26 CanExGetAsUByte
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „unsigned byte“ sein.
Tiny-CAN-API 90
3.6.27 CanExGetAsUWord
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „unsigned word“ sein.
Tiny-CAN-API 91
3.6.28 CanExGetAsULong
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „unsigned long“ sein.
Tiny-CAN-API 92
3.6.29 CanExGetAsString
Parameter index Device Index, es werden nur die Bits „CAN Device“
ausgewertet.
Erläuterungen zum Parameter „index“, Kapitel 4.1, der
Parameter „index“
Beschreibung Den mit „name“ angegebenen Parameter des Devices, mit „index“
angegeben lesen, sofern das lesen erlaubt ist.
Der Type des zu lesenden Parameters muss „String“ sein.
Die Funktion allokiert einen eigenen String der mit „CanExDataFree“
freigegeben werden muss.
Tiny-CAN-API 93
5. Fehler-Codes (Error-Codes)
Error-Code Erklärung
-1 Treiber nicht initialisiert
-2 Es wurden ungültige Parameter-Werte übergeben
-3 Ungültiger Index-Wert
-4 Ungültiger CAN-Kanal
-5 Allgemeiner Fehler
-6 In das FIFO kann nicht geschrieben werden
-7 Der Puffer kann nicht geschrieben werden
-8 Das FIFO kann nicht gelesen werden
-9 Der Puffer kann nicht gelesen werden
-10 Variable nicht gefunden
-11 Lesen der Variable nicht erlaubt
-12 Lesepuffer für Variable zu klein
-13 Schreiben der Variable nicht erlaubt
-14 Der zu schreibende String/Stream ist zu groß
-15 Min Wert unterschritten
-16 Max Wert überschritten
-17 Zugriff verweigert
-18 Ungültige CAN-Speed
-19 Ungültige Baudrate
-20 Wert nicht gesetzt
-21 Keine Verbindung zur Hardware
-22 Kommunikationsfehler zur Hardware
-23 Hardware sendet falsche Anzahl Parameter
-24 Zu wenig Arbeitsspeicher
-25 Das System kann die benötigten Resourcen nicht bereitstellen
-26 Ein System-CALL kehrt mit Fehler zurück
-27 Der Main-Thread ist beschäftigt
-28 Der Main-Thread laeuft nicht
-29 User Allocierter Speicher nicht gefunden
-30 Der Main-Thread kann nicht gestartet werden
-31 USB/COM Schnittstelle kann nicht Initialisiert werden
Tiny-CAN-API 94
-32 Hardware nicht verbunden
-33 Type der Variable falsch
Tiny-CAN-API 95
6. Parameter
Tiny-CAN-API 96
Parameter können jederzeit gesetzt werden, Aufruf „CanSetOptions“
1 = Auto Connect Modus ein
AutoReopen 0 = CanDeviceOpen wird nicht automatisch aufgerufen 0
1 = CanDeviceOpen wird automatisch aufgerufen, nachdem
die Verbindung wieder hergestellt wurde
MinEventSleepTime Min. Wartezeit für das wiederholte Aufrufen von Event 300
Callbacks
ExecuteCommandTimeout Maximale Wartezeit für Kommando Ausführung in ms 4000
LowPollIntervall Hardware Polling Intervall in ms 250
FilterReadIntervall Filter Messages alle x ms einlesen 1000
Paramter können nur beim „Öffnen“ des Devices gesetzt werden, Aufruf „CanDeviceOpen“
Port Serielle Schnittstelle 1 = COM1... (wird für den USB-Bus 1
nicht verwendet)
ComDeviceName Device Name (Linux: /dev/ttyS0) „“
BaudRate Baudrate, z.B. 38400 = 38400 Baud* 921600
VendorId USB-Vendor Id (nur Windows)* 0403
ProductId USB-Product Id (nur Windows)* 6001
Snr Seriennummer des CAN Moduls „“
Tiny-CAN-API 97
7. Config-File
Beim Aufruf der Funktion „CanInitDriver“ wird nach der Datei „tiny_can.cfg“ gesucht,
alternativ kann über den Parameter „CfgFile“ eine andere Konfigurationsdatei geladen
werden. Die Datei wird ohne Pfadangabe unter Windows im Pfad der DLL gesucht und
unter Linux/MacOS im Verzeichnis „/etc/tiny_can“.
Der Aufbau von Config-Files entspricht denen von Windows INI Dateien. Sofern nicht über
den Parameter „Section“ anders definiert wird die Section „Default“ geladen. Alle in Kapitel
6 beschriebenen Parameter können in der Konfigurationsdatei gesetzt werden.
Beispiel für eine Konfigurationsdatei zum Erzeugen eines „Log-Files“ mit dem Namen
„[Link]“, alle LogFlags sind gesetzt.
[Default]
LogFile = [Link]
LogFlags = 0xFFFF
Tiny-CAN-API 98
8. Log File
Wird beim Aufruf der Funktion „CanInitDriver“ oder im Config-File der Parameter „LogFile“
gesetzt, so erzeugt die DLL ein Log-File. Die Datei wird ohne Pfadangabe unter Windows
im Pfad der Applikation angelegt und unter Linux/MacOS im Verzeichnis
„/var/log/tiny_can“.
Die Log-File Funktion ist nur für Debug-Zwecke vorgesehen!! Einträge ins Log-File werden
immer sofort geschrieben, damit bei einem Programmabsturz alle Einträge bis zuletzt
vorhanden sind. Log-Files können mit einen Texteditor geöffnet werden.
Tiny-CAN-API 99
API-Call Enter: CanTransmitSet, index: 0X000001, cmd: 0X8000, 100000
STATUS: Ch 0: Drv=CAN_RUN, Can=OK, Fifo=OK
API-Call Exit: CanTransmitSet, result: Ok
API-Call Enter: CanReceive, index: 00000000, count: 1
API-Call Exit: CanReceive, count: 0
API-Call Enter: CanReceiveClear, index: 00000000
API-Call Exit: CanReceiveClear, result: Ok
API-Call Enter: CanReceiveGetCount, index: 00000000
API-Call Exit: CanReceiveGetCount, count: 0
API-Call Enter: CanGetDeviceStatus, index: 00000000
API-Call Exit: CanGetDeviceStatus, result: Ok
API-Call: CanDrvInfo
Description = Tiny-CAN API Treiber fuer die Module Tiny-CAN I - III
Hardware = Tiny-CAN I, Tiny-CAN II, Tiny-CAN III
Hardware IDs = 0x43414E01, 0x43414E02, 0x43414E03
Version = 3.01
Interface Type = USB
API Version = 1.20
Autor = Klaus Demlehner
Homepage = [Link]
API-Call Enter: CanDrvHwInfo
Hardware Info Variablen:
ID = 0X43414E01
ID String = Tiny-CAN I
Version = 1210
Version String = 1.21
Autor = Klaus Demlehner
Optionen = keine Optionen
Snr = 0
Anzahl CAN Interfaces = 1
Treiber = PCA82C251T
Opto = 0
Term = 0
HighSpeed = 0
Anzahl Interval Puffer = 4
Anzahl Filter = 4
Anzahl I2C Interfaces = 0
Anzahl SPI Interfaces = 0
Hardware Snr = 0
Hardware ID String = Tiny-CAN I
Bios ID String = Fujitsu FLASH Bios, Ver. 4.10 - MHS Elektronik
API-Call Exit: CanDrvHwInfo, result: Ok
API-Call Enter: CanDeviceClose, index: 00000000
API-Call Exit: CanDeviceClose, result: Ok
API-Call: CanDownDriver
Tiny-CAN-API 100
8. Beispiele
Das Include File „can_drv.h“ ist jeder Datei hinzuzufügen, die die API verwendet
#include "can_drv.h"
1. Treiber DLL laden, die angegebene Treiber DLL wird dynamisch geladen
2. Treiber DLL initialisieren, Speicher und Systemressourcen werden allokiert
3. Ein Device mit Empfangs-FIFO erzeugen
4. Die Schnittstelle PC/Hardware wird geöffnet
5. Die Übertragungsgeschwindigkeit auf den CAN-Bus wird eingestellt, diese
Einstellung muss erfolgen, bevor der Bus gestartet wird
6. Der CAN-Bus wird gestartet
Tiny-CAN-API 101
// Fehler bearbeiten
}
CanGetDeviceStatus(device_index, &status);
if ([Link] == CAN_STATUS_BUS_OFF)
{
printf("CAN Status BusOff\n");
CanSetMode(device_index, OP_CAN_RESET, CAN_CMD_NONE);
}
Programm beenden
// **** CAN Bus Stop
CanSetMode(device_index, OP_CAN_STOP, CAN_CMD_NONE);
// **** Schnittstelle PC <-> Tiny-CAN schließen
CanDeviceClose(device_index);
// **** Treiber Ressourcen freigeben
CanDownDriver();
// **** DLL entladen
UnloadDriver();
Tiny-CAN-API 102
/* Datum : 29.09.11 */
/* Autor : Demlehner Klaus, MHS-Elektronik, 94149 Kößlarn */
/* info@[Link] [Link] */
/* ---------------------------------------------------------------------- */
/* Compiler : GNU C Compiler */
/**************************************************************************/
#include "config.h"
#include "global.h"
#include <string.h>
#include <stdio.h>
#ifdef __WIN32__
#include <conio.h>
#endif
#include "can_drv.h"
/**************************************************************/
/* M A I N */
/**************************************************************/
int main(int argc, char **argv)
{
int err;
unsigned long i;
struct TDeviceStatus status; // Status
struct TCanMsg msg;
uint32_t device_index;
device_index = INDEX_INVALID;
/******************************/
/* Initialisierung */
/******************************/
// **** CAN Bus Start, alle FIFOs, Filter, Puffer und Fehler löschen
CanSetMode(device_index, OP_CAN_START, CAN_CMD_ALL_CLEAR);
/******************************/
/* Message versenden */
/******************************/
Tiny-CAN-API 103
// msg Variable Initialisieren
[Link] = 0L; // Alle Flags löschen, Stanadrt Frame Format,
// keine RTR, Datenlänge auf 0
while (!KeyHit())
{
/******************************/
/* Status abfragen */
/******************************/
CanGetDeviceStatus(device_index, &status);
/******************************/
/* Treiber beenden */
/******************************/
ende :
// Device schließen
(void)CanDeviceClose(device_index);
// Device löschen
(void)CanExDestroyDevice(&device_index);
// CanDownDriver wird auch automatisch von UnloadDriver aufgerufen,
// der separate Aufruf ist nicht zwingend notwendig
CanDownDriver();
// **** DLL entladen
UnloadDriver();
return(0);
}
Tiny-CAN-API 104
8.3 Verwendung der Tiny-CAN API im Event-Modus
Wird der Paramteter AutoConnect nicht auf 1 gesetzt, wird nur ein Disconnect der
Hardware erkannt.
Die Eventhandler für „Plug & Play, Status und Receive“ setzen und freigeben.
// **** Event-Funktionen setzen
CanSetPnPEventCallback(&CanPnPEvent);
CanSetStatusEventCallback(&CanStatusEvent);
CanSetRxEventCallback(&CanRxEvent);
// **** Alle Events freigeben
CanSetEvents(EVENT_ENABLE_ALL);
Wenn der Parameter „CanRxDMode“ auf 1 gesetzt ist, übergibt die Funktion die
empfangenen CAN-Messages, andernfalls müssen die Messages mit „CanReceive“
gelesen werden. Der index-Wert wird immer gesetzt.
Tiny-CAN-API 105
/* Datum : 09.08.11 */
/* Autor : Demlehner Klaus, MHS-Elektronik, 94149 Kößlarn */
/* info@[Link] [Link] */
/* ---------------------------------------------------------------------- */
/* Compiler : GNU C Compiler */
/**************************************************************************/
#include "config.h"
#include "global.h"
#include <string.h>
#include <stdio.h>
#include "util.h"
#ifdef __WIN32__
#include <conio.h>
#else
#include "linux_util.h"
#endif
#include "can_drv.h"
CRITICAL_SECTION Lock;
uint32_t DeviceIndex[4];
int32_t DevicesListCount = 0;
struct TCanDevicesList *DevicesList = NULL;
void PrintUsbDevices(void)
{
int32_t i;
uint32_t idx;
char *str;
char str_puf[100];
struct TCanDevicesList *l;
l = DevicesList;
if (DevicesListCount)
{
printf("=========================================================================\n");
for (i = 0; i < DevicesListCount; i++)
{
idx = l[i].TCanIdx;
if (idx == INDEX_INVALID)
printf("Key '%d', %s [%s]\n\r", i+1, l[i].Description, l[i].SerialNumber);
else
printf("Key '%d', %s [%s] Open: 0x%08lX\n\r", i+1, l[i].Description, l[i].SerialNumber,
idx);
printf(" Id : 0x%08lX\n\r", l[i].HwId);
if (l[i].HwId)
{
Tiny-CAN-API 106
printf(" CanClock : %u\n\r", l[i].[Link]);
str = str_puf;
if (l[i].[Link] & CAN_FEATURE_LOM) // Silent Mode (LOM = Listen only Mode)
str = mhs_stpcpy(str, "LOM ");
if (l[i].[Link] & CAN_FEATURE_ARD) // Automatic Retransmission disable
str = mhs_stpcpy(str, "ARD ");
if (l[i].[Link] & CAN_FEATURE_TX_ACK) // TX ACK
str = mhs_stpcpy(str, "TX_ACK ");
if (l[i].[Link] & CAN_FEATURE_HW_TIMESTAMP)
str = mhs_stpcpy(str, "HW_TIMESTAMP ");
printf(" Features-Flags : %s\n\r", str_puf);
printf(" CanChannelsCount : %u\n\r", l[i].[Link]);
printf(" HwRxFilterCount : %u\n\r", l[i].[Link]);
printf(" HwTxPufferCount : %u\n\r", l[i].[Link]);
}
printf("\n\r");
}
printf("=========================================================================\n");
}
else
printf("keine Devices gefunden.\n");
}
int32_t GetUsbDevices(void)
{
int32_t num_devs;
DevicesListCount = 0;
CanExDataFree(&DevicesList);
if ((num_devs = CanExGetDeviceList(&DevicesList, 0)) > 0)
DevicesListCount = num_devs;
return(num_devs);
}
// Status Event-Funktion
void CALLBACK_TYPE CanStatusEvent(uint32_t index, struct TDeviceStatus *status)
{
EnterCriticalSection(&Lock);
printf(">>> Status: Drv:%s, Can:%s, FIFO:%s\n\r", DrvStatusStrings[status->DrvStatus],
CanStatusStrings[status->CanStatus], CanFifoStrings[status->FifoStatus]);
LeaveCriticalSection(&Lock);
}
// RxD Event-Funktion
void CALLBACK_TYPE CanRxEvent(uint32_t index, struct TCanMsg *msg, int32_t count)
{
struct TCanMsg message;
unsigned long i;
EnterCriticalSection(&Lock);
while (CanReceive(0x80000000, &message, 1) > 0)
{
printf("[%02X] ", [Link]);
printf("id:%03lX dlc:%01d data:", [Link], [Link]);
if ([Link])
{
for (i = 0; i < [Link]; i++)
printf("%02X ", [Link][i]);
}
else
printf(" keine");
printf("\n\r");
}
Tiny-CAN-API 107
LeaveCriticalSection(&Lock);
}
EnterCriticalSection(&Lock);
dev_idx = DeviceIndex[key_idx];
// Device in der Liste suchen
open = 0;
for (i = 0; i < DevicesListCount; i++)
{
if (dev_idx == DevicesList[i].TCanIdx)
{
open = 1;
break;
}
}
if (open)
{
(void)CanDeviceClose(dev_idx);
printf("CanDeviceClose [Key '%d']\n\r", key_idx+1);
}
else
{
if (key_idx < DevicesListCount)
{
sprintf(str, "Snr=%s", DevicesList[key_idx].SerialNumber);
if ((err = CanDeviceOpen(dev_idx, str)) < 0)
printf("CanDeviceOpen [Key '%d'] Error-Code:%d\n\r", key_idx+1, err);
else
{
printf("CanDeviceOpen [Key '%d'] ok\n\r", key_idx+1);
// **** CAN Bus Start
(void)CanSetMode(dev_idx, OP_CAN_START, CAN_CMD_ALL_CLEAR);
}
}
}
LeaveCriticalSection(&Lock);
}
/**************************************************************/
/* M A I N */
/**************************************************************/
int main(int argc, char **argv)
{
int i, err;
char ch;
/*****************************************************/
/* Message versenden */
/*****************************************************/
printf("Tiny-CAN \"GetDeviceList\" Demo\n\r");
printf("=============================\n\r\n\r");
InitializeCriticalSection(&Lock);
/*****************************************************/
/* Treiber laden & Initialisieren */
/*****************************************************/
Tiny-CAN-API 108
}
/*****************************************************/
/* Device Objekte erzeugen */
/*****************************************************/
for (i = 0; i < 4; i++)
{
if ((err = CanExCreateDevice(&DeviceIndex[i], NULL)))
printf("CanExCreateDevice [%u] Error-Code:%d\n\r", i, err);
else
printf("CanExCreateDevice [%u] Index:0x%08X\n\r", i, DeviceIndex[i]);
}
/*****************************************************/
/* Devices konfigurieren */
/*****************************************************/
for (i = 0; i < 4; i++)
{
// **** Übertragungsgeschwindigkeit auf 1MBit/s einstellen
if ((err = CanExSetAsUWord(DeviceIndex[i], "CanSpeed1", 1000)) < 0)
printf("Set \"CanSpeed1\" Fehler: %d\n\r", err);
// **** 0 = Transmit Message Request sperren
if ((err = CanExSetAsUByte(DeviceIndex[i], "CanTxAckEnable", 0)) < 0)
printf("Set \"CanTxAckEnable\" Fehler: %d\n\r", err);
// **** 3 = Hardware Time-Stamps
if ((err = CanExSetAsUByte(DeviceIndex[i], "TimeStampMode", 3)) < 0)
printf("Set \"TimeStampMode\" Fehler: %d\n\r", err);
}
/*****************************************************/
/* Empfangs FIFO erzeugen */
/*****************************************************/
if ((err = CanExCreateFifo(0x80000000, 10000, NULL, 0, 0xFFFFFFFF)))
{
printf("CanExCreateFifo Error-Code:%d\n\r", err);
}
else
printf("CanExCreateFifo ok\n\r");
printf("\n\r");
/*****************************************************/
/* Device Liste erzeugen & ausgeben */
/*****************************************************/
GetUsbDevices();
PrintUsbDevices();
ch = '\0';
do
{
if (KeyHit())
{
ch = getch();
switch (ch)
{
case '1' : {
ProcessOpenClose(0);
break;
}
case '2' : {
ProcessOpenClose(1);
break;
}
case '3' : {
ProcessOpenClose(2);
break;
}
case '4' : {
ProcessOpenClose(3);
break;
}
}
}
}
Tiny-CAN-API 109
while (ch != 'q');
/******************************/
/* Treiber beenden */
/******************************/
ende :
DeleteCriticalSection(&Lock);
return(0);
}
Tiny-CAN-API 110
8.5 Verwendung von Filtern und Sende-Puffern
Einen CAN Sende-Puffer laden und den Intervalltimer auf 100ms setzen
#define mS(t) (t * 1000) // Wandelt ms in us um
struct TCanMsg msg;
// Bit 11 - Bit0
// Maske 0 1 1 1 1 1 1 1 1 1 0 => 0x3FE
// Code 0 0 0 0 0 0 0 0 0 0 0 => 0x000
// Filter X 0 0 0 0 0 0 0 0 0 X
// Die CAN Messages 0x000 - 0x001 und 0x400 - 0x4001 werden gefiltert
msg_filter.Maske = 0x3FE;
msg_filter.Code = 0x000;
msg_filter.[Link] = 0L;
msg_filter.FilEnable = 1; // Filter freigeben
Tiny-CAN-API 111