Showing posts with label MCP2515. Show all posts
Showing posts with label MCP2515. Show all posts

Monday, February 9, 2015

Arduino, CAN Bus and 29 bit extended IDs

I noticed in my blog traffic stats that people are searching for information about 29 bit CAN IDs and I have been curious about this topic myself. I haven't come across 29 bit CAN IDs in a vehicle until recently and seeing these extended IDs in use in a car made want to understand how to use them with Arduino boards and MCP2515 CAN controllers. I wrote a blog post back in October 2013 that covers how to send data between two Arduino boards using a CAN bus so you may want to check that out if you aren't familiar with how a CAN bus works. That post is available here. This post is specifically about using 29 bit CAN IDs with an Arduino and the MCP2515 CAN controller chip.

CAN Bus IDs


There are two types of CAN Bus IDs. In the first version of the CAN Bus spec (2.0A) the IDs were made up of 11 bits. These are also known as base frame format messages. This allows for message IDs between 0x000 and 0x7FF. Which works out to be 2048 possible CAN IDs.

Binary, Decimal and Hex representation of the max 11 bit ID
 As CAN Busses were added to heavy equipment and as vehicles became more complex those 2048 possible IDs were not enough to handle the increased number of sensors. CAN 2.0B was created which increased the size of IDs from 11 bits to 29 bits. CAN 2.0B allows for over 536 million different IDs. 29 bit messages are also known as extended frame format messages. 18 bits were added to the original 11 bits in an separate field in a CAN message. There is a flag in the message that signals if a message is an 11 bit or 29 bit message. 11 bit and 29 bit messages can coexist on the same CAN bus.

Binary, Decimal and Hex representation of the max 29 bit ID
There are some trade-offs with 29 bit CAN IDs though. The latency is increased, the messages use more bandwidth and error detection performance is decreased. But if you have run out of IDs I suppose these are worthwhile trade-offs.


11 bit code example


Let's take a look at a very simple example of using an MCP2515 CAN controller with an Arduino and 11 bit CAN IDs. I am using a Seeed Studio CAN-BUS Shield but the MCP2515 is just an SPI chip that can be wired up with minimal external components.
In this 11 bit example I am using a CAN ID of 0x07B in hex (123 in decimal).


Here you can see my receiver Arduino is receiving CAN messages with an ID of 123.



29 bit code example


Next let's look at an example of sending 29 bit CAN IDs. In this example I am using a CAN ID of 0x17F8140E in hex (or 402134030 in decimal).


Here you can see my receiver Arduino is receiving CAN messages with an ID of 402134030.



sendMsgBuf format

The key piece of this example code is the sendMsgBuf function. This function is part of the
MCP_CAN_lib. This is where messages are flagged as 11 bit or 29 bit.

11 bit: CAN.sendMsgBuf(0x07B, 0, 8, canMsg);

29 bit: CAN.sendMsgBuf(0x17F8140E, 1, 8, canMsg);


The format for this function is sendMsgBuf(can_id, id_type, dlc, data_buf)

can_id - id number for your message in hex or decimal.

id_type - flag for 11 or 29 bit message id. 0=11bit, 1=29bit

dlc - Number of bytes in the message data

data_buf - The data transmitted in the message.


If you are going to try out these examples you should download Cory Fowler's fork of the MCP_CAN_lib.


Resources