Problem with receiving can bus data by using MCP2515 Can Bus Shield

Hi everybody,

We have a project which we have to use a steering angle sensor for. It is Bourns Type 6002 Non-contacting Steering Angle Sensor document . We use mcp2515 as CAN controller and did appropriate connections. But we cannot receive any data from sensor. Library from this link . We actually tried different libraries and no luck. We double-checked everything physically and sure that it is not a circuit issue. Also,we tried to set different clock speeds but again,nothing happens.

However, it send some data when we set MCP2515 to a Loopback mode in this library . But as far as I know,it is not the one we want and I guess that can work in previous library,too.
Here is 2 of the codes that we have tested:

/* 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 FUNCTIONAL_ID 0x7DF
#else
  #define LISTEN_ID 0x98DAF101
  #define REPLY_ID 0x98DA01F1
  #define FUNCTIONAL_ID 0x98DB33F1
#endif

// 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 10 (Old shields use pin 10) */


void setup(){

  Serial.begin(115200);
  while(!Serial);
 
  // 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!");
  else{
    Serial.println("Error Initializing MCP2515... Permanent failure!  Check your code & connections");
    while(1);
  }

//
//  // 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...

#else
  // 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...
#endif

  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.
  // ========================================================================
  //CAN0.setMode(MCP_LOOPBACK);

  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);
    else
      sprintf(msgString, "Standard ID: 0x%.3lX       DLC: %1d  Data:", rxID, dlc);
 
    Serial.print(msgString);
 
    if((rxID & 0x40000000) == 0x40000000){    // Determine if message is a remote request frame.
      sprintf(msgString, " REMOTE REQUEST FRAME");
      Serial.print(msgString);
    } else {
      for(byte i = 0; i<dlc; i++){
        sprintf(msgString, " 0x%.2X", rxBuf[i]);
        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...");
    }
  }
}
// demo: CAN-BUS Shield, receive data with check mode
// send data coming to fast, such as less than 10ms, you can use this way
// loovee, 2014-6-13


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


// the cs pin of the version after v1.1 is default to D9
// v0.9b and v1.0 is default D10
const int SPI_CS_PIN = 9;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup()
{
    Serial.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS))              // init can bus : baudrate = 500k
    {
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}


void loop()
{
    unsigned char len = 0;
    unsigned char buf[8];

    if(CAN_MSGAVAIL == CAN.checkReceive())            // check if data coming
    {
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        unsigned long canId = CAN.getCanId();
        
        Serial.println("-----------------------------");
        Serial.print("Get data from ID: 0x");
        Serial.println(canId, HEX);

        for(int i = 0; i<len; i++)    // print the data
        {
            Serial.print(buf[i], HEX);
            Serial.print("\t");
        }
        Serial.println();
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

did you try using the examples that came with the library to read (without any filters set) the CAN bus?

does it initialise correctly at least?

first step: try two identical setups with two arduinos and two shields to ensure you get proper communication and all your wiring and configuration ist correct.

second step: check the resonator on your shield, does it fit to (MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) ???

tipp: don't bother around with can filters as long as basic communication is not working.

if you still have problems to establish communication, please provide GOOD pictures how you have connected your devices.

sherzaad:
did you try using the examples that came with the library to read (without any filters set) the CAN bus?

does it initialise correctly at least?

Although I am not sure about the filtering, I am sure that we tried all read examples that came with the libraries.

noiasca:
first step: try two identical setups with two arduinos and two shields to ensure you get proper communication and all your wiring and configuration ist correct.

second step: check the resonator on your shield, does it fit to (MCP_STDEXT, CAN_500KBPS, MCP_16MHZ) ???

tipp: don’t bother around with can filters as long as basic communication is not working.

if you still have problems to establish communication, please provide GOOD pictures how you have connected your devices.

Unfortunately, we don’t have a second mcp2515.

The datasheet of MCP2515 says:
-High-speed SPI interface up to 10MHz
-And I believe it suggests 125KBPS

Let me try these, just in case I am uploading our circuit schematic.

oscillatorTollerance.png

second step: check the resonator on your shield, does it fit to (MCP_STDEXT, CAN_500KBPS, MCP_16MHZ)

Do you know what MCP_16MHZ will do in your code?
Check the resonator on your shield.

Still not clearified?
Please post a REALLY picture of your setup wherein we can clearly see the printing on the resonator of the CAN-Bus shield.

If the resonator on the shield says 16Mhz, post a REALLY picture with your wiring.




noiasca:
Do you know what MCP_16MHZ will do in your code?
Check the resonator on your shield.

Still not clearified?
Please post a REALLY picture of your setup wherein we can clearly see the printing on the resonator of the CAN-Bus shield.

If the resonator on the shield says 16Mhz, post a REALLY picture with your wiring.

I uploaded some photos from our setup. Our resonator is 8MHz but when we changed MCP_16MHz to MCP_8MHz it is still not working.

In MCP2515::begin function, MCP2515::configrate function is called. MCP_16MHZ is basically a constant which helps configrate to choose correct setting which can be found in mcp_can_df.h :
#define MCP_16MHz_500kBPS_CFG1 (0x00)

#define MCP_16MHz_500kBPS_CFG2 (0xF0)

#define MCP_16MHz_500kBPS_CFG3 (0x86)

We solved the problem by replacing oscillator from 8MHz to 16MHz. Thanks for your efforts and quick response. So if anyone else wants to buy a steering angle sensor and receive data by using mcp2515 should use a 16MHz oscillator.

good, if you found a way that will work for you. Nevertheless I want to stress the fact, that I get stable results between this shield and other devices when I initialize the object with the right frequency - without any hardwarechange

e.g.:

CAN.begin(MCP_STDEXT, CAN_250KBPS, MCP_8MHZ)

perfectly communicates with an ESP32 internal CAN Bus if initialized with CAN.begin(250E3)