Skip to main content

CANbus on the Omega2

Omega2S
Omega2+

If you are as big a fan of the Omega2 as I am I'm guessing you want to do as much with the platform as possible. Recently I've been looking to get a low cost Linux system on a CANbus, to sniff on some traffic. What are the options for adding a CAN interface to your Omega2, either when you are designing a solution or looking to easily add it to an existing system?

eLinux has a great guide on a number of CANbus adapters that I'd recommend to anyone looking to integrate CAN into their system.

Interface Typical use case Available on Omega2 / Omega2S
serial (via SLCAN) Design-in/Add-on Simple protocol but not considered reliable, efficient or fast by Linux CAN developers.
SPI Design-in Not usable, the Omega2 (MT7688 cpu) is only half duplex SPI
Software SPI Design-in Higher cpu load than hardware SPI
USB Design-in/Add-on Available (Omega2 has one USB host port)

Note that all of the design-in options could be used for prototyping with extra effort. This would consist of:
  • Finding the SPI lines for your micro
  • Some way to connect the SPI lines to your CAN controller, like a breakout or devel board
  • Wiring the SPI lines to the SPI lines of the CAN controller
Comparing this to plugging in a USB adapter and you can see why, for this comparison, I'm indicating that the non-usb interfaces are more suitable for a design-in approach.

slcan / serial

The slcan protocol, documented at http://www.can232.com/docs/can232_v3.pdf, is a simple command set for wrapping CAN functionality over a serial connection.

Limitations of slcan are:
  • Controllers with slcan protocol support, such as the SJA1000T, are 10+ years old and no CAN-FD support is anticipated
  • Serial ports can operate up to 2MBit over short distances. CAN-FD can support 5MBit+.
  • slcan does not currently support CAN-FD features and afaict there are no CAN-FD slcan devices.

SPI

Many CAN controllers, such as the popular MCP251x series of controllers, interface via SPI. A number of these controllers, such as the MCP2517FD support CAN-FD.

SPI may also be more suitable from a system design standpoint as it is a bus. It's possible to connect a number of devices to a SPI bus using per-device chip select signals. Compare this to the single USB host port on the Omega2 / Omega2S. If the USB CAN device isn't your only usb device 
you'll have to add a USB hub to have more than one USB device connected to your Omega2 at the same time.

SPI sounds like a reasonable interface until you find out that Mediatek MT7688 processor used in the Omega2 has a design error that causes full duplex SPI to be inoperative. The Linux drivers for the common MCP251x controller appear to be designed for full duplex SPI functionality. In addition, in my brief review of the MCP251x data sheets, it appears that full duplex SPI is required for proper functionality.

Bitbanged / software SPI

The Linux kernel contains drivers that support GPIO, or bit banged, SPI. A driver called 'spi-gpio-custom' was created and added to OpenWRT, the base distribution used in the Omega2, to expose this software based SPI interface.

Downsides to software gpio drivers are high cpu usage under high SPI bus loads. Secondarily is the potential that the bus load and system load will result in data being dropped if the CANbus load results in SPI loads that the processor can't keep up with.

USB

Usb is hands down the easiest approach. Typically it is as difficult as plugging the adapter in. I highly recommend the canable adapter due to its low cost and solid performance.

The Omega2 has a single USB interface. This means that you'll need a USB hub if you would like to use a USB CAN adapter AND have one or more USB ports available. These aren't too costly but adding a USB hub is for sure more costly than if the Omega2 had a working full duplex SPI available (see above).



Comments

Popular posts from this blog

Debugging an imprecise bus access fault on a Cortex-M3

This information may apply to other cortex series processors but is written from practical experience with the Cortex-M3. Imprecise bus access faults are ambiguous, as noted by the term "imprecise". Compared to precise bus errors, imprecise errors are much trickier to debug and especially so without a deep understanding of arm processors and assembly language. Imprecise and precise flags are found in the BusFault status register, a byte in the CFSR (Configurable Fault Status Register). BusFault status register bits The definition for imprecise and precise bits is: [2] IMPRECISERR Imprecise data bus error: 0 = no imprecise data bus error 1 = a data bus error has occurred, but the return address in the stack frame is not related to the instruction that caused the error. When the processor sets this bit to 1, it does not write a fault address to the BFAR. This is an asynchronous fault. Therefore, if it is detected when the priority of the current pr...

Travelling on Spirit airlines out of Boston Logan airport? Here are some tips.

I attended CES 2017 in Las Vegas. Booking the trip late I ended up on Spirit airlines. It was both non-stop, making it six hours to Las Vegas from Boston, and affordable, less than $300 for a one way trip compared to around $700 with JetBlue. Here are some tips that might help you when travelling on Spirit from Boston Logan airport. Eat Spirit is located in the B-terminal, gates B-37 and 38, with its own TSA security checkpoint. While it does have restrooms and places to sit the food selection is limited to a single food stand. I'd recommend eating at the Legal C Bar (number 77 in the image below) prior to going through the terminal security checkpoint. The food and service there were great. Drink The water and other drinks are cheaper if you buy them at the food cart rather than on the flight. Seats The seats on Spirit don't recline. They do this to reduce weight, seat cost, seat maintenance costs, and so seats don't impact the free space of other passengers,...

Yocto recipe SRC_URI for a BitBucket / GitHub ssh git repository

This is a particularly geeky post but because Google searches didn't turn up any information I thought it would be helpful to document the issue and solution for others. I was writing  Yocto recipes that pulled from BitBucket git repositories in ssh form and ran into several issues getting a SRC_URI that worked. GitHub uses the same syntax for their ssh repositories. A BitBucket / GitHub git url, in ssh form, looks like: < username >@bitbucket.org:< account name >/< repository name >.git a more concrete example for a git repository in one of my BitBucket accounts looks like: git@bitbucket.org:cmorgan/somerepository.git Yocto recipes can pull from git repositories by setting the SRC_URI variable appropriately. Unfortunately you can't just do: SRC_URI = "git@bitbucket.org:cmorgan/somerepository.git You'll get errors because the Yocto won't know what kind of url this is. You need to specify the protocol for Yocto to k...