EasySync USB-CAN Bus Adapter – Works great in Ubuntu after some fiddling

Neat little package
Neat little package

The toys just keep coming in!  Another one of those wallet killing impulsive orders whilst I was sick in bed last week just arrived today, a USB-CAN bus converter module by EasySync that promises a great interface and should work in Linux!  This will give a little bump start to my Mazda CAN Bus / mChumby projects.

Note : EasySync UK’s online form doesn’t allow international shipping but a short E-mail or two managed that.  There is a US subsidiary with US and international shipping, but the international shipping rates on the US site is plain ridiculous [$68USD to ship a $88 device to Australia].

Note 2 : I hear the interface is mimicking the Lawicel CAN-USB interface…only hearsay…

Plugged it in – didn’t work.  Doh!  Took a peek at the manual and website, nothing on Linux other than “Linux drivers provided”… So much for the marketing material, guess I have to try make it work myself.  (Yes I got it working, read on for the quick run-down post aimed at helping others)

Sneak peek inside the box
Sneak peek inside the box

Now with the photos out of the way, a little bit of detective work is ahead of us… why doesn’t this thing work… I paid so much money for it to replace the qprotos adapter!

A little bit of lsusb (or cat /proc/bus/usb/devices if you’ve got usbdevfs) sleuthing later…

Bus 003 Device 004: ID 0403:fac6 Future Technology Devices International, Ltd 
Device Descriptor:
 bLength                18
 bDescriptorType         1
 bcdUSB               2.00
 bDeviceClass            0 (Defined at Interface level)
 bDeviceSubClass         0 
 bDeviceProtocol         0 
 bMaxPacketSize0         8
 idVendor           0x0403 Future Technology Devices International, Ltd
 idProduct          0xfac6 
 bcdDevice            6.00
 iManufacturer           1 EasySync
 iProduct                2 USB2-F-7001 CAN-Plus Adapter
 iSerial                 3 ESNFWLPL
 bNumConfigurations      1
 Configuration Descriptor:
 bLength                 9
 bDescriptorType         2
 wTotalLength           32
 bNumInterfaces          1
 bConfigurationValue     1
 iConfiguration          0 
 bmAttributes         0x80
 (Bus Powered)
 MaxPower              150mA
 Interface Descriptor:
 bLength                 9
 bDescriptorType         4
 bInterfaceNumber        0
 bAlternateSetting       0
 bNumEndpoints           2
 bInterfaceClass       255 Vendor Specific Class
 bInterfaceSubClass    255 Vendor Specific Subclass
 bInterfaceProtocol    255 Vendor Specific Protocol
 iInterface              2 USB2-F-7001 CAN-Plus Adapter
 Endpoint Descriptor:
 bLength                 7
 bDescriptorType         5
 bEndpointAddress     0x81  EP 1 IN
 bmAttributes            2
 Transfer Type            Bulk
 Synch Type               None
 Usage Type               Data
 wMaxPacketSize     0x0040  1x 64 bytes
 bInterval               0
 Endpoint Descriptor:
 bLength                 7
 bDescriptorType         5
 bEndpointAddress     0x02  EP 2 OUT
 bmAttributes            2
 Transfer Type            Bulk
 Synch Type               None
 Usage Type               Data
 wMaxPacketSize     0x0040  1x 64 bytes
 bInterval               0
Device Status:     0x0000
 (Bus Powered)

Yup definitely a FTDI device, even with the FTDI vendor ID (Did I mention I love FTDI?).  Looks like EasySync decided they wanted their own unique product ID, unfortunately that means the vanilla ftdi_sio drive won’t pick it up without a little bit of coercing.

The little bit of coercing goes like…

modprobe ftdi_sio vendor=0x0403 product=0xfac6

And bingo…

[ 6372.229046] usb 2-2: new full speed USB device using uhci_hcd and address 3
[ 6372.437247] usb 2-2: configuration #1 chosen from 1 choice
[ 6372.439834] ftdi_sio 2-2:1.0: FTDI USB Serial Device converter detected
[ 6372.439872] usb 2-2: Detected FT232RL
[ 6372.439934] usb 2-2: FTDI USB Serial Device converter now attached to ttyUSB0

Using putty to connect to ttyUSB0 at 115200, and typing “H” followed by “Enter” gives us

=~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2009.06.30 21:23:18 =~=~=~=~=~=~=~=~=~=~=~=
H
List of Supported Commands
O - Open CAN Channel
C - Close CAN Channel
t - Transmit Standard Frame
T - Transmit Extended Frame
F - Read Status Flag
V - USB2-F-7001 Version
N - Serial Number of USB2-F-7001
Z - TimeStamp Option On/Off
S - Set CAN Bit Rate
s - Set BRGCON Registers
m - Set Acceptance Mask
M - Set Acceptance Filter
B - Enter Bootload Mode
L - Set Listen Mode
E - Clear Buffers and Echo Char
R - Reset USB2-F-7001
H, ? or h - Help on USB2-F-7001 Commands

Only problem is that its Mac style line endings.  Even the append CR to LF option in putty is useless because the stream seems to be CR without LF…  Doesn’t hurt too much except displaying it is a bit annoying.

The EasySync USB-CAN adapter’s pinout is pretty much standard DB9 for CAN Bus and all I had to do was connect my existing J1962 (aka OBD-II aka DLC-2) cable on and onto the car I went.

A couple of short “S6” (500kbps) “L” (Open connection for listen mode) commands later, I had CAN data being spat back at me

t04680601FF0000000000
t04680601FF0000000000
t04680601FF0000000000
t04680601FF0000000000
t04680601FF0000000000
t20F8FFFF27104000FF01
t2118FFFF000040000001
t4B082710271027102710
t19080000000000000000

All is good…except I just deleted my Chumby Development Virtual Machine a few hours ago…ooops…another day before I use this neat little adapter for mChumby.

22 thoughts on “EasySync USB-CAN Bus Adapter – Works great in Ubuntu after some fiddling”

  1. The Windows Virtual COM driver works, but the speeds are not up to par with my application. The USB drivers seem to be quite underdeveloped. It seems that the device accept some Identifiers even though they are valid. In reading the CAN Documentation, bits 4 through 10 of the 11 bit identifier cannot be all recessive, and that is the only valid reason to reject a CAN identifier.

    Anyways, I’ve been in correspondence with Easy-Sync, but been stuck on this for about a month now.

    1. While you’re at it ask the why they’re so averse to ‘LF’… it was driving me nuts. Not only do all status come back from the device with just ‘CR’ and no ‘LF’, putting any ‘LF’s in the commands gives you a nice beep (‘BEL’) back…gah…

      What do you mean the device accepts ID’s even though they’re valid?… invalid? Masked?

      1. PS : What speeds are you running at that the V Com isn’t coping with? 2Mbps?

        From memory (vague) of Windows, I had V COM drivers up to 1Mbps so it was all good there.
        You can try downloaded the FTDI drivers and modifying them as per the FTDI website.

        1. As for the speeds question.

          I have an board sending out about 1Mbps. 10 frames every 2ms. And I am only able to pick up 3 of them on average.

          According to my calculations this is around 160 Kbps.

          This is using Java’s RXTX library which replaced java.com for communicating with the device.

          Were you able to test the 1Mbps capabilities? and how so?

    1. There are a few adapters though that are based on microprocessors with both USB and CAN….and those tend to be a pain to interface to 🙁 [Hello qprotos!]

  2. I rapidly gave up on using TTY with the thing, and started writing a (Windows) C++ program to do some logging. Then some off-line processing software to search the logs for meanings. I’m just at the point where I can do some meaningful research, I think.

    On EasySync, I found a lot of little problems, in addition to the quirks you’ve mentioned. For instance there’s ONE command (E) that echos the command back to you! The rest don’t. Somebody wasn’t thinking. I also had trouble finding the right data rate, since the device likes to frame up totally illegal stuff — frames that are hundreds of bytes long, for instance.

    It also won’t handle remote frames, although they say that may come in a firmware update next quarter. Not needed for OBD-II, but who knows if Mazda uses any, unless the device can detect them?

  3. Hi Jim again,

    Its quirky alright, really quirky up to including which CR/LF it takes before accepting a command (I don’t think I’ve mastered it but my program spams it with every kind of command as a temporary hack so it works :P). Its actually stated that none of the commands actually echo and you’re meant to set your terminal program to echo.

    Have you had a look at the Test Run post (http://www.madox.net/blog/2009/07/15/mchumby-test-run/) with the two videos I posted? Kind of works 🙂

    Had the problem you mentioned with weirdo frames, those started with a capital ‘T’ rather than the usual ‘t’ for me. What is a remote frame?

    1. Sorry I never answered your last question above. A remote frame is really a query from one CAN node to another, timed so that it at least “could” happen within the same CAN frame. The requester essentially sends the ID, and the answering node fills in the data, all in the same frame.

      Initially I assumed that OBD-II under CAN would use this mechanism, but it doesn’t. In practice it’s probably only useful on very specialized equipment, since the latency requirements on the answering node are so high. It makes sense that they didn’t use remote frames, but it took a while for me to realize it.

      From the EasySync’s point of view, they claim they will be supporting it later, but I kind of doubt it — at least not in the one-frame mode that the designers intended. To do so, the EasySync would have to be sent a response in advance, and I think their little box isn’t intended to be so sophisticated. I wouldn’t blame them for just not implementing that feature.

  4. The capital-T frames are in themselves legit. The incoming frames are formatted like the outgoing transmit frames (although they never bother telling you that…) — the ‘t’ frames are standard CAN frames with 11-bit IDs; the ‘T’ frames are extended frames, with 29-bit IDs. My guess is that if a frame does match ‘t’, they just shove it out as ‘T’, without any error-checking.

    Not sure about the CR-LF ambiguity you’re seeing. I always send out CR, never LF, and it seems to accept all the commands I’ve tried. The “E” return is indeed mentioned in the docs.

  5. Another one. When you transmit a frame, it returns either ‘z’ or ‘Z’. Not real useful when you’re buffering the input, and the input and output are asynchronous. 🙁

  6. Another interesting “feature”! When the car (Mazda MX5 in my case) is under hard acceleration, the ECU stops answering OBD requests — probably too busy with its own work. But the interesting thing (about the EasySync) is that CAN frames often come in out of sequence during that time! I turned on the EasySync’s timer, and the timestamps show a different order than the receipt of the frames. Kinda weird, actually.

    I don’t think it hurts anything (at least anything I’m doing), but you have to wonder about the firmware in there.

  7. hi, what version of ubuntu did you use?
    I have the same CAN-adapter, but its not working. I’m using Ubuntu 10.04, kernel 2.6.32-23-generic
    all I get is:

    [ 3504.440258] usb 2-1.1.2: new full speed USB device using ehci_hcd and address 13
    [ 3504.540766] usb 2-1.1.2: configuration #1 chosen from 1 choice

    no ftdi stuff

    but if i plug in a usb2rs232 adapter, ftdi_sio is showing up

    [ 3670.576139] usb 2-1.1.7: new full speed USB device using ehci_hcd and address 14
    [ 3670.675374] usb 2-1.1.7: configuration #1 chosen from 1 choice
    [ 3670.677982] ftdi_sio 2-1.1.7:1.0: FTDI USB Serial Device converter detected
    [ 3670.678041] usb 2-1.1.7: Detected FT232RL
    [ 3670.678047] usb 2-1.1.7: Number of endpoints 2
    [ 3670.678053] usb 2-1.1.7: Endpoint 1 MaxPacketSize 64
    [ 3670.678058] usb 2-1.1.7: Endpoint 2 MaxPacketSize 64
    [ 3670.678063] usb 2-1.1.7: Setting MaxPacketSize 64
    [ 3670.678360] usb 2-1.1.7: FTDI USB Serial Device converter now attached to ttyUSB0

    any idea whats going on here?

    thx

    1. You didn’t read the post did you? 🙂


      The little bit of coercing goes like…

      modprobe ftdi_sio vendor=0×0403 product=0xfac6

      The device doesn’t use a standard vendor/product ID so it is not recognised by the driver. You’ll have to modprobe with the correct vendor/product ID (above) to get the driver to load.

      Hope that helps you 🙂

  8. hey Madox,

    of course i read your post, several times ;), and it works on my laptop

    its just: it works on 1 machine, and not on the other ( mac mini running ubuntu 10.04 ), and i can’t figure out why…. damn apple….

    but thx anyway….

  9. Tnx Madox, I’ve been fiddling with this all day with no success at all. Finally I noticed that your “modprobe ftdi_sio vendor=0×0403 product=0xfac6” was not for copy/paste. 0×0403 should read 0x0403…
    Any how, now up and running thanks 2 U.

    Regards from Sweden.

    /AGW

    1. Wow nice pick, sorry about that but it is a WordPress thing! Just went to try change it but it is ‘x’ for xylophone instead of multiplication in the original…

  10. When I was reading that I have an idea come to my mind. I have standalone ECU that allows me to talk through CANBUS or ethernet ply. I can remap types of datas should the ECU stream through CAN BUS. So I mean datas are not encrypted. This feature to communicate motorsport dashes like that

    http://www.aimsports.com/products/mxl-strada/index.html

    I have also Linux based Palm Pre smartphone. So the idea is to communicate through Palm Pre mini-usb to Canbus protocol. I am not coder but the a javascript application for smartphone should not be that hard? I just need good motivation. Tell me I can do this =) feel free to email.

Leave a Reply

Your email address will not be published. Required fields are marked *