openblt/Host/Source/interfaces/can/peak/Pcan_usb.pas

297 lines
11 KiB
ObjectPascal

///////////////////////////////////////////////////////////////////////////////
// PCAN-Light
// PCAN_USB.pas
//
// Version 1.5
//
// ~~~~~~~~~~
//
// Basic Idea:
//
// ~~~~~~~~~~
//
// Definition of the PCAN-Light API.
// The Driver support a Hardware and a Software who want to communicate with CAN-busses
//
// ~~~~~~~~~~~~
//
// PCAN-Light -API
//
// ~~~~~~~~~~~~
//
// - CAN_Init(wBTR0BTR1: Word; CANMsgType: Integer)
// - CAN_Close()
// - CAN_Status()
// - CAN_Write(var MsgBuff: TPCANMsg)
// - CAN_Read(var MsgBuff: TPCANMsg)
// - CAN_VersionInfo(lpszTextBuff: PChar)
// - CAN_ResetClient()
// - CAN_MsgFilter(FromID, ToID: LongWord; _Type: Integer)
// - CAN_ResetFilter()
// - SetUSBDeviceNr(DevNum: Longint)
// - GetUSBDeviceNr(var DevNum: Longint)
//
// ------------------------------------------------------------------
// Author : Hoppe, Wilhelm
// Modified By: Wagner (13.08.2008)
//
// Sprache: PASCAL OO
// ------------------------------------------------------------------
//
// Copyright (C) 1999-2006 PEAK-System Technik GmbH, Darmstadt
//
unit pcan_usb;
interface
const
// Constants definitions - Frame Type
//
CAN_INIT_TYPE_EX = $01; //Extended Frame
CAN_INIT_TYPE_ST = $00; //Standart Frame
// Constants definitions - ID
//
CAN_MAX_STANDARD_ID = $7ff;
CAN_MAX_EXTENDED_ID = $1fffffff;
// Constants definitions - CAN message types
//
MSGTYPE_STANDARD = $00; // Standard Data frame (11-bit ID)
MSGTYPE_RTR = $01; // 1, if Remote Request frame
MSGTYPE_EXTENDED = $02; // 1, if Extended Data frame (CAN 2.0B, 29-bit ID)
MSGTYPE_ERROR = $80; // 1, if Status information
// Baud rate codes = BTR0/BTR1 register values for the CAN controller.
// You can define your own Baudrate with the BTROBTR1 register !!
// take a look at www.peak-system.com for our software BAUDTOOL to
// calculate the BTROBTR1 register for every baudrate and sample point.
//
CAN_BAUD_1M = $0014; // 1 MBit/s
CAN_BAUD_500K = $001C; // 500 kBit/s
CAN_BAUD_250K = $011C; // 250 kBit/s
CAN_BAUD_125K = $031C; // 125 kBit/s
CAN_BAUD_100K = $432F; // 100 kBit/s
CAN_BAUD_50K = $472F; // 50 kBit/s
CAN_BAUD_20K = $532F; // 20 kBit/s
CAN_BAUD_10K = $672F; // 10 kBit/s
CAN_BAUD_5K = $7F7F; // 5 kBit/s
// Error codes (bit code)
//
CAN_ERR_OK = $0000; // No error
CAN_ERR_XMTFULL = $0001; // Transmit buffer in CAN controller is full
CAN_ERR_OVERRUN = $0002; // CAN controller was read too late
CAN_ERR_BUSLIGHT = $0004; // Bus error: an error counter reached the 'light' limit
CAN_ERR_BUSHEAVY = $0008; // Bus error: an error counter reached the 'heavy' limit
CAN_ERR_BUSOFF = $0010; // Bus error: the CAN controller is in bus-off state
CAN_ERR_QRCVEMPTY = $0020; // Receive queue is empty
CAN_ERR_QOVERRUN = $0040; // Receive queue was read too late
CAN_ERR_QXMTFULL = $0080; // Transmit queue is full
CAN_ERR_REGTEST = $0100; // Test of the CAN controller hardware registers failed (no hardware found)
CAN_ERR_NOVXD = $0200; // Driver not loaded
CAN_ERR_RESOURCE = $2000; // Resource (FIFO, Client, timeout) cannot be created
CAN_ERR_ILLPARAMTYPE = $4000; // Invalid parameter
CAN_ERR_ILLPARAMVAL = $8000; // Invalid parameter value
CAN_ERRMASK_ILLHANDLE = $1C00; // Mask for all handle errors
CAN_ERR_ANYBUSERR = (CAN_ERR_BUSLIGHT or CAN_ERR_BUSHEAVY or CAN_ERR_BUSOFF);
// All further error conditions <> 0 please ask PEAK when required.......internal driver failure ........
type
// CAN Message
//
TPCANMsg = record
ID: LongWord; // 11/29 bit identifier
MSGTYPE: Byte; // Bits from MSGTYPE_*
LEN: Byte; // Data Length Code of the Msg (0..8)
DATA: array[0..7] of Byte; // Data 0 .. 7
end;
///////////////////////////////////////////////////////////////////////////////
// CAN_Init()
// This function make the following:
// - Activate a Hardware
// - Make a Register Test of 82C200/SJA1000
// - Allocate a Send buffer and a Hardware handle
// - Programs the configuration of the transmit/receive driver
// - Set the Baudrate register
// - Set the Controller in RESET condition
//
// If CANMsgType=0 ---> ID 11Bit
// If CANMsgType=1 ---> ID 11/29Bit
//
// Possible Errors: NOVXD ILLHW REGTEST RESOURCE
//
function CAN_Init(wBTR0BTR1: Word;
CANMsgType: Integer): LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_Close()
// This function terminate and release the configured hardware and all
// allocated resources
//
// Possible Errors: NOVXD
//
function CAN_Close: LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_Status()
// This function request the current status of the hardware (b.e. BUS-OFF)
//
// Possible Errors: NOVXD BUSOFF BUSHEAVY OVERRUN
//
function CAN_Status: LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_Write()
// This function Place a CAN message into the Transmit Queue of the CAN Hardware
//
// Possible Errors: NOVXD RESOURCE BUSOFF QXMTFULL
//
function CAN_Write(var MsgBuff: TPCANMsg): LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_Read()
// This function get the next message or the next error from the Receive Queue of
// the CAN Hardware.
// REMARK:
// - Check always the type of the received Message (MSGTYPE_STANDARD,MSGTYPE_RTR,
// MSGTYPE_EXTENDED,MSGTYPE_STATUS)
// - The function will return ERR_OK always that you receive a CAN message successfully
// although if the messages is a MSGTYPE_STATUS message.
// - When a MSGTYPE_STATUS mesasge is got, the ID and Length information of the message
// will be treated as indefined values. Actually information of the received message
// should be interpreted using the first 4 data bytes as follow:
// * Data0 Data1 Data2 Data3 Kind of Error
// 0x00 0x00 0x00 0x02 CAN_ERR_OVERRUN 0x0002 CAN Controller was read to late
// 0x00 0x00 0x00 0x04 CAN_ERR_BUSLIGHT 0x0004 Bus Error: An error counter limit reached (96)
// 0x00 0x00 0x00 0x08 CAN_ERR_BUSHEAVY 0x0008 Bus Error: An error counter limit reached (128)
// 0x00 0x00 0x00 0x10 CAN_ERR_BUSOFF 0x0010 Bus Error: Can Controller went "Bus-Off"
// - If a CAN_ERR_BUSOFF status message is received, the CAN Controller must to be
// initialized again using the Init() function. Otherwise, will be not possible
// to send/receive more messages.
// - The message will be written to 'msgbuff'.
//
// Possible Errors: NOVXD QRCVEMPTY
//
function CAN_Read(var MsgBuff: TPCANMsg): LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_VersionInfo()
// This function get the Version and copyright of the hardware as text
// (max. 255 characters)
//
// Possible Errors: NOVXD
//
function CAN_VersionInfo(
lpszTextBuff: PChar
): LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_SpecialFunktion()
// This function is an special function to be used "ONLY" for distributors
// Return: 1 - the given parameters and the parameters in the hardware agree
// 0 - otherwise
//
// Possible Errors: NOVXD
//
function CAN_SpecialFunktion(
distributorcode: LongWord;
codenumber: Integer
): LongWord; stdcall;
//////////////////////////////////////////////////////////////////////////////
// CAN_ResetClient()
// This function delete the both queues (Transmit,Receive) of the CAN Controller
// using a RESET
//
// Possible Errors: ERR_ILLCLIENT ERR_NOVXD
//
function CAN_ResetClient: LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_MsgFilter(FromID, ToID, int Type)
// This function set the receive message filter of the CAN Controller.
// REMARK:
// - A quick register of all messages is possible using the parameters FromID and ToID = 0
// - Every call of this function maybe cause an extention of the receive filter of the
// CAN controller, which one can go briefly to RESET
// - New in Ver 2.x:
// * Standard frames will be put it down in the acc_mask/code as Bits 28..13
// * Hardware driver for 82C200 must to be moved to Bits 10..0 again!
// WARNING:
// It is not guaranteed to receive ONLY the registered messages.
//
// Possible Errors: NOVXD ILLCLIENT ILLNET REGTEST
//
function CAN_MsgFilter(FromID, ToID: LongWord; _Type: Integer): LongWord; stdcall;
///////////////////////////////////////////////////////////////////////////////
// CAN_ResetFilter()
// This function close completely the Message Filter of the Hardware.
// They will be no more messages received.
//
// Possible Errors: NOVXD
//
function CAN_ResetFilter: LongWord; stdcall;
//////////////////////////////////////////////////////////////////////////////
// SetUSBDeviceNr()
// This function set an identification number to the USB CAN hardware
//
// Possible Errors: NOVXD ILLHW ILLPARAMTYPE ILLPARAMVAL REGTEST
//
function SetUSBDeviceNr(DevNum: Longint): LongWord; stdcall;
//////////////////////////////////////////////////////////////////////////////
// GetUSBDeviceNr()
// This function read the device number of a USB CAN Hardware
//
// Possible Errors: NOVXD ILLHW ILLPARAMTYPE
//
function GetUSBDeviceNr(var DevNum: Longint): LongWord; stdcall;
implementation
uses SysUtils;
const DLL_Name = 'PCAN_USB.dll';
function CAN_Init(wBTR0BTR1: Word; CANMsgType: Integer): LongWord; stdcall;
external DLL_Name;
function CAN_Close: LongWord; stdcall;
external DLL_Name;
function CAN_Status: LongWord; stdcall;
external DLL_Name;
function CAN_Write(var MsgBuff: TPCANMsg): LongWord; stdcall;
external DLL_Name;
function CAN_Read(var MsgBuff: TPCANMsg): LongWord; stdcall;
external DLL_Name;
function CAN_VersionInfo(lpszTextBuff: PChar): LongWord; stdcall;
external DLL_Name;
function CAN_SpecialFunktion(distributorcode: LongWord; codenumber: Integer): LongWord; stdcall;
external DLL_Name;
function CAN_ResetClient: LongWord; stdcall;
external DLL_Name;
function CAN_MsgFilter(FromID, ToID: LongWord; _Type: Integer): LongWord; stdcall;
external DLL_Name;
function CAN_ResetFilter: LongWord; stdcall;
external DLL_Name;
function SetUSBDeviceNr(DevNum: Longint): LongWord; stdcall;
external DLL_Name;
function GetUSBDeviceNr(var DevNum: Longint): LongWord; stdcall;
external DLL_Name;
end.