Component: CAN (Internal, MCP2515) (Comms: Interface)
Author | Matrix Ltd |
Version | 2.1 (Release) |
Category | Comms: Interface |
Contents
CAN (Internal, MCP2515) component
Low level routines for controling the CAN interface either using an external MCP2515 IC and a SPI bus connection or using an internal CAN peripheral if available on your device. Both methods will require a CAN driver IC like the MCP2551 to drive the CAN signals on the bus.
Examples
Internal CAN schematic
External CAN schematic
CAN Message Decoding
The CAN component works together with the injector component to allow you to decode a CAN message ID into a meaningful command.
Example File
CAN_Example1
When a key on the keypad is pressed the CAN components transmits a CAN packet.
The CAN packet is decoded by the injector component to give us a meaningful log on the console window.
High Level CAN Data Console
Low Level CAN Data Console
Reference from CAN Injector to ID decode file, $(srcdir) refers to the current project directory.
Demo CAN ID file File:CANID.csv
CAN Masks and Filters
How to work out which messages will be trapped by a particular mask/filter combination
Note that all values for message id's, masks and filters are numbers between 0x000 and 0x7FF.
Example 1
Mask0 = 0x0FF
Filter0 = 0x100
Filter1 = 0x050
In binary, this looks like:
Mask0 = 000 1111 1111
Filter0 = 001 0000 0000
Filter1 = 000 0101 0000
For the mask, a "1" signifies "check this bit" and a "0" means "ignore this bit"
So, these filters will accept the following messages ("x" = don't care)
Filter0 = xxx 0000 0000
Filter1 = xxx 0101 0000
i.e.
Filter0 = 0x000, 0x100, 0x200, 0x300, 0x400, 0x500, 0x600, 0x700
Filter1 = 0x050, 0x150, 0x250, 0x350, 0x450, 0x550, 0x650, 0x750
Example 2
Mask1 = 0x350
Filter2 = 0x200
Filter3 = 0x123
Filter4 = 0x3FF
Rewriting in binary:
Mask1 = 111 0101 0000
Filter2 = 010 0000 0000
Filter3 = 001 0010 0011
Filter4 = 111 1111 1111
Here, the mask will only check 4 bits and ignore the other 6. Here's what the filters will accept:
Filter2 = 010 x0x0 xxxx
Filter3 = 001 x0x0 xxxx
Filter4 = 111 x1x1 xxxx
They will actually trap a lot of messages (64 each!):
Filter2 = 0x200, 0x201, 0x202, ... 0x220, 0x221, ... 0x280, 0x281, ... 0x2A0, 0x2A1, ... 0x2AF
Filter3 = 0x100, 0x101, 0x102, ... 0x120, 0x121, ... 0x180, 0x181, ... 0x1A0, 0x1A1, ... 0x1AF
Filter4 = 0x750, 0x751, 0x752, ... 0x770, 0x771, ... 0x7D0, 0x7D1, ... 0x7F0, 0x7F1, ... 0x7FF
This second example is not very practical. In general, it is more logical to set the mask so that each filter accepts a consecutive range of messages.
As you can see, the mask determines which bits of the filters are actually looked at. Setting the mask to 0x000 will effectively mean that the filter will accept any incoming message. Also, the value of the mask directly relates to how many messages each filter will trap - i.e. 2^(number of '0' bits in the mask).
A useful way to use the mask would be to ignore the least significant bits. Lets say that you wanted the filters to accept 16 messages each - setting the Mask0 to 0x7F0 would achieve this. Then, setting the filters to the following:
Filter0 = 0x100
Filter1 = 0x110
would mean that the following messages are accepted:
Filter0 = 0x100, 0x101, 0x102, 0x103, 0x104, ... 0x10D, 0x10E, 0x10F
Filter1 = 0x110, 0x111, 0x112, 0x113, 0x114, ... 0x11D, 0x11E, 0x11F
Of course, for simple CAN applications you may wish to only accept one or two messages. Setting the mask to 0x7FF in this instance would mean that only the message ID specified by each filter would be accepted, e.g.
Mask1 = 0x7FF
Filter2 = 0x100
Filter5 = 0x200
This would mean that only messages 0x100 and 0x200 would be accepted into buffer 1.
Downloadable macro reference
ReadSwitches
Returns switch input states from the external MCP2515 device.
0 = No Switch Pressed, 1 = Switch 1 Pressed, 2 = Switch 2 Pressed, 3 = Both Pressed
(External CAN only)
Parameters
- This macro has no parameters
Return value
SetTxData
Assigns one of the outgoing transmit buffers with data ready to be sent.
Parameters
- BYTE Buffer
- BYTE Count
- BYTE d0
- BYTE d1
- BYTE d2
- BYTE d3
- BYTE d4
- BYTE d5
- BYTE d6
- BYTE d7
Return value
- This call does not return a value
SetRxMask
Allows the receive ID mask to be configured on the fly allowing different ID ranges to be received.
Parameters
- BYTE Mask
- Specifies which receive mask to modify. Range: 0-1
- ULONG ID
- The ID mask value you wish to use
Return value
- This call does not return a value
GetRxData
Returns last received message data byte at position Index.
Buffer parameter is currently ignored
Parameters
- BYTE Buffer
- BYTE Index
Return value
GetRxIDHi
Gets the Hi byte Rx ID in register format.
Standard ID only 0-2047.
Compatible with v5 component and previous,
Parameters
- BYTE Buffer
- Receive Buffer. Range 0-1
Return value
SetTxIDSimple
Set the Tx CAN ID as a generic number.
Standard IDs only 0-2047.
Parameters
- BYTE Buffer
- Transmit buffer to load. Range: 0-2
- UINT ID
- The ID value you wish to use. Range: 0-2047
Return value
- This call does not return a value
SendBuffer
Transmits one of the transmit buffers which should have already been populated with an ID and data.
Parameters
- BYTE Buffer
- Specifies which transmit buffer to send
Return value
- This call does not return a value
GetRxDataCount
Returns last received message data length.
Buffer parameter is currently ignored
Parameters
- BYTE Buffer
Return value
SetRxFilterID
sets the Filter
Standard mode only
(for V5 compatibility only)
Parameters
- BYTE Filter
- Specifies which filter to modify. Range: 0-5
- BYTE Hi
- ID bits 3-10
- BYTE Lo
- ID bits 0-2 stored in the upper 3 bits of the byte
Return value
- This call does not return a value
GetRxIDLo
Gets the Lo byte Rx ID in register format.
Standard ID only 0-2047.
Compatible with v5 component and previous,
Parameters
- BYTE Buffer
Return value
SetRxMaskID
set the Mask
Standard ID mode only
(for V5 compatibility)
Parameters
- BYTE Mask
- Specifies which receive mask to modify. Range: 0-1
- BYTE Hi
- ID bits 3-10
- BYTE Lo
- ID bits 0-2 stored in the upper 3 bits of the byte
Return value
- This call does not return a value
SetRxFilter
Allows the receive ID filter to be configured on the fly allowing different ID ranges to be received.
Parameters
- BYTE Filter
- Specifies which receive filter to modify. Range: 0-5
- ULONG ID
- The ID filter value you wish to use
Return value
- This call does not return a value
SetTxIdent
Set the Tx CAN ID as a generic number.
Standard and extended IDs
Standard 0-2047
Extended 2048-536870911
Parameters
- BYTE Buffer
- Transmit buffer to load. Range: 0-2
- ULONG ID
- The ID or Extended ID value you wish to use. Range: 0-536870911
Return value
- This call does not return a value
CheckRx
Checks to see if any messages are available for 'Buffer' specified
Parameters
- BYTE Buffer
- Send buffer: 0 to 1
Return value
GetRxIDSimple
Gets the Rx ID as a Integer
Standard ID only 0-2047.
Parameters
- BYTE Buffer
- Receive Buffer. Range 0-1
Return value
SetTxID
Set the Tx CAN ID in register format.
Standard ID only 0-2047.
Compatible with v5 component and previous,
Parameters
- BYTE Buffer
- Transmit buffer to load. Range: 0-2
- BYTE Hi
- ID bits 3-10 e.g. ((ID & 0x7F8) >> 3)
- BYTE Lo
- ID bits 0-2 stored in the upper 3 bits of the byte e.g. ((ID & 0x7) << 5)
Return value
- This call does not return a value
ShowLEDs
Set LED state
(External CAN only)
Parameters
- BYTE led1
- Controls LED 1. Range: 0-1
- BYTE led2
- Controls LED 2. Range: 0-1
Return value
- This call does not return a value
GetRxIdent
Gets the Rx ID as a Integer
Standard and Extended IDs.
Parameters
- BYTE Buffer
Return value
Initialise
Must be called before any other CAN component macros to enable and initialise the CAN peripheral.
Parameters
- This macro has no parameters
Return value
- This call does not return a value
Simulation macro reference
SetBaud
No additional information
Parameters
- This macro has no parameters
Return value
- This call does not return a value
Property reference
Channel
This property is of type Fixed list of ints and can be referenced with the variable name CHANNEL.
Switches between Internal CAN peripheral and External CAN controller IC MCP2515.
Controller Osc
This property is of type Fixed list of ints and can be referenced with the variable name EXT_OSC.
No additional information
Bus Rate
This property is of type Fixed list of ints and can be referenced with the variable name BUS_RATE.
Data rate of the bus specified in thousand bits per second, Kbps.
Sample Point
This property is of type Fixed list of ints and can be referenced with the variable name SAMPLE.
Point in each bit period where the incoming data is sampled.
Sync Jump Width
This property is of type Fixed list of ints and can be referenced with the variable name SJW.
Defines how far a resyncronisation may move the sample point
ID Type
This property is of type Fixed list of ints and can be referenced with the variable name EXID.
Switches between using Standard, or Standard and Extended CAN
Channel
This property is of type Fixed list of ints and can be referenced with the variable name SPIChannel.
External CAN - SPI Channel
Internal CAN - CAN Channel
Data Out MOSI / SDO
This property is of type Single digital pin and can be referenced with the variable name SDO.
External CAN Data Out Pin
Data In MISO / SDI
This property is of type Single digital pin and can be referenced with the variable name SDI.
External CAN Data In Pin
Clock SCK
This property is of type Single digital pin and can be referenced with the variable name SCK.
External CAN Clock Pin
Chip Select
This property is of type Single digital pin and can be referenced with the variable name SPI_CS.
External CAN Chip Select Pin
Message ID
This property is of type Signed integer and can be referenced with the variable name TXB0ID.
TX Buffer 0 Message Identifier
Length
This property is of type Signed integer and can be referenced with the variable name TXB0LEN.
TX Buffer 0 Number of data bytes
D0
This property is of type Signed integer and can be referenced with the variable name TXB0DB0.
TX Buffer 0 Data Byte 0
D1
This property is of type Signed integer and can be referenced with the variable name TXB0DB1.
TX Buffer 0 Data Byte 1
D2
This property is of type Signed integer and can be referenced with the variable name TXB0DB2.
TX Buffer 0 Data Byte 2
D3
This property is of type Signed integer and can be referenced with the variable name TXB0DB3.
TX Buffer 0 Data Byte 3
D4
This property is of type Signed integer and can be referenced with the variable name TXB0DB4.
TX Buffer 0 Data Byte 4
D5
This property is of type Signed integer and can be referenced with the variable name TXB0DB5.
TX Buffer 0 Data Byte 5
D6
This property is of type Signed integer and can be referenced with the variable name TXB0DB6.
TX Buffer 0 Data Byte 6
D7
This property is of type Signed integer and can be referenced with the variable name TXB0DB7.
TX Buffer 0 Data Byte 7
Message ID
This property is of type Signed integer and can be referenced with the variable name TXB1ID.
TX Buffer 1 Message Identifier
Length
This property is of type Signed integer and can be referenced with the variable name TXB1LEN.
TX Buffer 1 Number of data bytes
D0
This property is of type Signed integer and can be referenced with the variable name TXB1DB0.
TX Buffer 1 Data Byte 0
D1
This property is of type Signed integer and can be referenced with the variable name TXB1DB1.
TX Buffer 1 Data Byte 1
D2
This property is of type Signed integer and can be referenced with the variable name TXB1DB2.
TX Buffer 1 Data Byte 2
D3
This property is of type Signed integer and can be referenced with the variable name TXB1DB3.
TX Buffer 1 Data Byte 3
D4
This property is of type Signed integer and can be referenced with the variable name TXB1DB4.
TX Buffer 1 Data Byte 4
D5
This property is of type Signed integer and can be referenced with the variable name TXB1DB5.
TX Buffer 1 Data Byte 5
D6
This property is of type Signed integer and can be referenced with the variable name TXB1DB6.
TX Buffer 1 Data Byte 6
D7
This property is of type Signed integer and can be referenced with the variable name TXB1DB7.
TX Buffer 1 Data Byte 7
Message ID
This property is of type Signed integer and can be referenced with the variable name TXB2ID.
TX Buffer 2 Message Identifier
Length
This property is of type Signed integer and can be referenced with the variable name TXB2LEN.
TX Buffer 2 Number of data bytes
D0
This property is of type Signed integer and can be referenced with the variable name TXB2DB0.
TX Buffer 2 Data Byte 0
D1
This property is of type Signed integer and can be referenced with the variable name TXB2DB1.
TX Buffer 2 Data Byte 1
D2
This property is of type Signed integer and can be referenced with the variable name TXB2DB2.
TX Buffer 2 Data Byte 2
D3
This property is of type Signed integer and can be referenced with the variable name TXB2DB3.
TX Buffer 2 Data Byte 3
D4
This property is of type Signed integer and can be referenced with the variable name TXB2DB4.
TX Buffer 2 Data Byte 4
D5
This property is of type Signed integer and can be referenced with the variable name TXB2DB5.
TX Buffer 2 Data Byte 5
D6
This property is of type Signed integer and can be referenced with the variable name TXB2DB6.
TX Buffer 2 Data Byte 6
D7
This property is of type Signed integer and can be referenced with the variable name TXB2DB7.
TX Buffer 2 Data Byte 7
Settings
This property is of type Fixed list of ints and can be referenced with the variable name RXB0CFG.
RX Buffer 0 Message Receive Mode
Settings
This property is of type Fixed list of ints and can be referenced with the variable name RXB1CFG.
RX Buffer 1 Message Receive Mode
Label
This property is of type Line of text and can be referenced with the variable name label.
Comms Flasher Identification Label
Injector
This property is of type Fixed list of ints and can be referenced with the variable name Injector.
Data Injector to allow CAN data to work with simulated external devices or ID decoding