Page 1 of 1

Using RMT to decode VAN bus protocol

Posted: Mon Mar 11, 2019 5:03 pm
by Captain.Chode
Hi,

I would like to use the RMT peripherial to read VAN bus protocol, but I have a hard time to figure out how to get the correct timings. I wrote an analyzer plugin for Saleae https://github.com/morcibacsi/VanAnalyzer so I know how the protocol looks like. There is also a description on it here: http://graham.auld.me.uk/projects/vanbu ... tocol.html. The point is that I need to sample the input in every 8us (microseconds) but I cannot get my head around the formula to calculating it. I found a simple (at least it seems so) example here in the forums: https://www.esp32.com/viewtopic.php?t=5787, but still no luck.

Code: Select all

#define RMT_RX_CHANNEL 0 /* RMT channel for receiver */
#define RMT_RX_GPIO_NUM PIN_RX /* GPIO number for receiver */
#define RMT_CLK_DIV 100 /* RMT counter clock divider */
#define rmt_item32_tIMEOUT_US 9500 /*!< RMT receiver timeout value(us) */

#define RMT_TICK_10_US (80000000/RMT_CLK_DIV/100000) /* RMT counter value for 10 us.(Source clock is APB clock) */
#define ITEM_DURATION(d) ((d & 0x7fff)*10/RMT_TICK_10_US)

#define PIN_RX 22

static void rx_init()
{
    rmt_config_t rmt_rx;
    rmt_rx.channel = RMT_RX_CHANNEL;
    rmt_rx.gpio_num = RMT_RX_GPIO_NUM;
    rmt_rx.clk_div = RMT_CLK_DIV;
    rmt_rx.mem_block_num = 30;
    rmt_rx.rmt_mode = RMT_MODE_RX;
    rmt_rx.rx_config.filter_en = false;
    rmt_rx.rx_config.filter_ticks_thresh = 100;
    rmt_rx.rx_config.idle_threshold = rmt_item32_tIMEOUT_US / 10 * (RMT_TICK_10_US);
    rmt_config(&rmt_rx);
    rmt_driver_install(rmt_rx.channel, 1000, 0);
}
Could somebody please help me how to setup a channel to have the samples on every 8us? And another question: Sometimes it a bit pulse a a little bit longer than 8us (like 8.8 us) to transfer a bit. Could it cause any issues?

Thanks

Re: Using RMT to decode protocol

Posted: Mon Mar 11, 2019 10:49 pm
by ESP_Angus
Nice project! I used to have a Peugeot 406 and I messed around with VANbus decoding once upon a time (well before ESP32, unfortunately!)
Captain.Chode wrote:
Mon Mar 11, 2019 5:03 pm
Could somebody please help me how to setup a channel to have the samples on every 8us? And another question: Sometimes it a bit pulse a a little bit longer than 8us (like 8.8 us) to transfer a bit. Could it cause any issues?
The RMT peripheral doesn't sample the level (high/low) at a regular period. Instead, it measures the duration of the high and low pulses.

So if you set the clock timing period to be (say) 1us (1MHz clock), then each RMT sample will tell you how many ticks (microseconds in this case) the line was low for, and then how many ticks it was high for.

So altogether, data from the RMT is going to be like "the line was high for X time, then low for X time, then high for X time, then low for X time". Because the VAN data is Manchester encoded, you should be able recover the clock period and data bits from this information.

If you actually want to read the status of the RMT line every Xus instead, you can do this by (mis)using the I2S or SPI peripherals (basically, have the SPI master sample the MISO line at XkHz but don't do anything with the other SPI signals from the peripheral). You will need to oversample though (ie if the time period is 8us, you'll need to sample at least every 4us to make sure you don't miss a transition due to inaccuracy or jitter). I think RMT will probably be easier to get a good result from.

Re: Using RMT to decode protocol

Posted: Tue Mar 19, 2019 5:14 pm
by Captain.Chode
Thank you, based on your answer, I successfully modified this nice example and I was able to get the following values:

Code: Select all

32,-32,8,-8,8,-16,8,-8,8,-16,8,-8,8,-8,16,-24,16,-8,32,-8,32,-8,32,-8,32,-8,32,-32,8,-8,32,-8,8,-8,16,-40,8,-32,8,-32,8,-32,40,-8,32,-40,8,-32,8,-32,8,-32,8,-32,8,-32,40,-8,32,-32,8,-8,16,-16,24,-8,8,-8,16,-8,16,0
This equals to

Code: Select all

664 C 00 00 0E 04 FF FF 00 FF FF FF 00 E3 22 N
which is distributed on the VAN network by an odometer from a Peugeot 307 on the bench.

Now it is time to write some functions to decode the bytes from those values :D How would you proceed with that? I was wondering about creating an array where I can store zeroes and ones based on the above values (leaving out the manchester bits) and in a second run I can build the bytes from the elements in the array.

And another question about your VAN bus experience: what hardware did you use back then when you were experimenting with it?

Re: Using RMT to decode protocol

Posted: Wed Mar 20, 2019 4:14 am
by ESP_Angus
Captain.Chode wrote:
Tue Mar 19, 2019 5:14 pm
Now it is time to write some functions to decode the bytes from those values :D How would you proceed with that? I was wondering about creating an array where I can store zeroes and ones based on the above values (leaving out the manchester bits) and in a second run I can build the bytes from the elements in the array.
I think I'd do something like that, also.
Captain.Chode wrote: And another question about your VAN bus experience: what hardware did you use back then when you were experimenting with it?
It was almost ten years ago so I don't remember exactly. I think I had an 8-bit micro of some kind (probably AVR) and was just using a GPIO timer interrupt to read pulse widths. I just played around a little bit, I didn't get particularly far. :)

Re: Using RMT to decode protocol

Posted: Thu Mar 21, 2019 3:15 pm
by Captain.Chode
So I created the reader, and uploaded it here: https://github.com/morcibacsi/esp32_rmt_van_rx

Is there a way to rename the topic to include the term VAN bus, like "Using RMT to decode VAN bus protocol" I could not find a way.

Re: Using RMT to decode protocol

Posted: Tue Jul 16, 2019 1:56 pm
by dmaxben
Captain.Chode wrote:
Thu Mar 21, 2019 3:15 pm
So I created the reader, and uploaded it here: https://github.com/morcibacsi/esp32_rmt_van_rx

Is there a way to rename the topic to include the term VAN bus, like "Using RMT to decode VAN bus protocol" I could not find a way.
Very cool project!!

I wonder if this code could be adapted to decode the SAE J1850-VPW bus, used on older GM vehicles?

It basically just requires the timing of 64uS and 128uS pulses.

https://www.cnblogs.com/shangdawei/p/4769620.html

Re: Using RMT to decode protocol

Posted: Wed Jul 17, 2019 5:02 pm
by Captain.Chode
I took a quick look on that protocol, and it seems that it wouldn't be so complicated to write an RMT receiver library for it. Basically the rmt_van_rx_parse_byte method and the crc calculation method should be implemented, and the rest would be almost the same.