Writing message on VW infotainment bus


I have Arduino UNO and MCP2515 CAN shield

I am trying to emulate VW radio by sending CAN messages to amplifier on infotainment bus.

I am able to read messages on infotainment bus on 100KBPS but cannot send messages back on bus on same speed.

I tried reading/sending messages on convenience bus at 500KBPS and it is working fine.

I also tried changing crystal on CAN shield from 8Mhz to 16 Mhz but it didnt help.

Request members help to fix this.


are you sending the messages with the same arbitration ID as the device you're intending to emulate?

Yes I collected some message ID from radio and tried sending it on infotainment bus as well as directly on OBD port, both didn't work.

Do you have message ID's and their corresponding information for VW infotainment bus?

Hi all.
I tried too with a mega and canbus from seeduino v1.2 and connect with a ME7.5
I can collect data from ecu only wha it send every 100ms automaticaly , but if i try to send it a message i don’t received any response
Somebody can help me? I used a good example code but ecu not respondes!

/* CAN OBD & UDS Simple PID Request

  • Currently requests PID 0x00 at a 1 second interval and
  • displays all received CAN traffic to the terminal at 115200.
  • Written By: Cory J. Fowler April 5th, 2017
  • (Disclaimer: Standard IDs are currently UNTESTED against a vehicle)


#include <mcp_can.h>
#include <SPI.h>

#define standard 0
// 7E0/8 = Engine ECM
// 7E1/9 = Transmission ECM
#if standard == 1
#define LISTEN_ID 0x7EA
#define REPLY_ID 0x7E0
#define LISTEN_ID 0x98DAF101
#define REPLY_ID 0x98DA01F1
#define FUNCTIONAL_ID 0x98DB33F1

// CAN TX Variables
unsigned long prevTx = 0;
unsigned int invlTx = 1000;
byte txData = {0x02,0x01,0x00,0x55,0x55,0x55,0x55,0x55};

// CAN RX Variables
unsigned long rxID;
byte dlc;
byte rxBuf[8];
char msgString[128]; // Array to store serial string

// CAN Interrupt and Chip Select Pins
#define CAN0_INT 2 /* Set INT to pin 2 (This rarely changes) /
MCP_CAN CAN0(10); /
Set CS to pin 9 (Old shields use pin 10) */

void setup(){


// Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
if(CAN0.begin(MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) == CAN_OK)
Serial.println(“MCP2515 Initialized Successfully!”);
Serial.println(“Error Initializing MCP2515… Permanent failure! Check your code & connections”);

// // Allow all Standard IDs
// CAN0.init_Mask(0,0x00000000); // Init first mask…
// CAN0.init_Filt(0,0x00000000); // Init first filter…
// CAN0.init_Filt(1,0x00000000); // Init second filter…
// // Allow all Extended IDs
// CAN0.init_Mask(1,0x80000000); // Init second mask…
// CAN0.init_Filt(2,0x80000000); // Init third filter…
// CAN0.init_Filt(3,0x80000000); // Init fouth filter…
// CAN0.init_Filt(4,0x80000000); // Init fifth filter…
// CAN0.init_Filt(5,0x80000000); // Init sixth filter…

#if standard == 1
// Standard ID Filters
CAN0.init_Mask(0,0x7F00000); // Init first mask…
CAN0.init_Filt(0,0x7DF0000); // Init first filter…
CAN0.init_Filt(1,0x7E10000); // Init second filter…

CAN0.init_Mask(1,0x7F00000); // Init second mask…
CAN0.init_Filt(2,0x7DF0000); // Init third filter…
CAN0.init_Filt(3,0x7E10000); // Init fouth filter…
CAN0.init_Filt(4,0x7DF0000); // Init fifth filter…
CAN0.init_Filt(5,0x7E10000); // Init sixth filter…

// Extended ID Filters
CAN0.init_Mask(0,0x90FF0000); // Init first mask…
CAN0.init_Filt(0,0x90DA0000); // Init first filter…
CAN0.init_Filt(1,0x90DB0000); // Init second filter…

CAN0.init_Mask(1,0x90FF0000); // Init second mask…
CAN0.init_Filt(2,0x90DA0000); // Init third filter…
CAN0.init_Filt(3,0x90DB0000); // Init fouth filter…
CAN0.init_Filt(4,0x90DA0000); // Init fifth filter…
CAN0.init_Filt(5,0x90DB0000); // Init sixth filter…

CAN0.setMode(MCP_NORMAL); // Set operation mode to normal so the MCP2515 sends acks to received data.

// Having problems? ======================================================
// If you are not receiving any messages, uncomment the setMode line below
// to test the wiring between the Ardunio and the protocol controller.
// The message that this sketch sends should be instantly received.
// ========================================================================

pinMode(CAN0_INT, INPUT); // Configuring pin for /INT input

Serial.println(“Simple CAN OBD-II PID Request”);

void loop(){

if(!digitalRead(CAN0_INT)){ // If CAN0_INT pin is low, read receive buffer

CAN0.readMsgBuf(&rxID, &dlc, rxBuf); // Get CAN data

// Display received CAN data as we receive it.
if((rxID & 0x80000000) == 0x80000000) // Determine if ID is standard (11 bits) or extended (29 bits)
sprintf(msgString, “Extended ID: 0x%.8lX DLC: %1d Data:”, (rxID & 0x1FFFFFFF), dlc);
sprintf(msgString, “Standard ID: 0x%.3lX DLC: %1d Data:”, rxID, dlc);


if((rxID & 0x40000000) == 0x40000000){ // Determine if message is a remote request frame.
sprintf(msgString, " REMOTE REQUEST FRAME");
} else {
for(byte i = 0; i<dlc; i++){
sprintf(msgString, " 0x%.2X", rxBuf*);*

  • Serial.print(msgString);*

  • }*

  • }*

  • Serial.println();*

  • }*

_ /* Every 1000ms (One Second) send a request for PID 00 *_
_ * This PID responds back with 4 data bytes indicating the PIDs *_
_ * between 0x01 and 0x20 that are supported by the vehicle. */_

  • if((millis() - prevTx) >= invlTx){*
  • prevTx = millis();*
  • if(CAN0.sendMsgBuf(FUNCTIONAL_ID, 8, txData) == CAN_OK){*
  • Serial.println(“Message Sent Successfully!”);*
  • } else {*
  • Serial.println(“Error Sending Message…”);*
  • }*
  • }*