Hi all, for a while now been trying to read can-bus messages on my Volvo s60 01' and i am just not able to .. I am trying to connect to hi speed can-bus, but as I connect via obd port i need to send constant k-line messages to keep can-bus relay actrive (k-line part is working perfectly, just informing to better understand code).
And with arduino MEGA and MCP2515 I have tried various codes, and the latest one should be working, but it is not - I get some of hex values, but they do not look like real can-bus traffic you would see in a car.
here is the code:
#include <SPI.h>
#include <mcp_can.h>
// MCP2515 CAN interface
#define CAN0_INT 2 // Assuming MCP2515 INT pin is connected to digital pin 2
MCP_CAN CAN0(53); // Assuming you're using digital pin 53 for CS
// MC33290 K-line interface (using Serial1: TX1 and RX1)
#define KLINE_TX 18
#define KLINE_RX 19
unsigned long lastSendTime = 0; // Keep track of the last time the K-line message was sent
unsigned long sendDelay = 3000; // Delay between K-line messages in milliseconds
unsigned long lastRequestTime = 0; // Track the last time CAN request was sent
// unsigned long requestDelay = 1000; // Delay between CAN requests in milliseconds
bool waitForReply = false;
void sendKLineMessage() {
// Timer to manage delay
if ((millis() - lastSendTime) < sendDelay) {
return; // Exit if the delay time hasn't passed yet
}
// Message for keeping the CAN-bus relay active
unsigned char klineMessage[7] = {0x84, 0x40, 0x13, 0xB2, 0xF0, 0x03, 0x7C}; // K-line message
Serial.print("Sending K-line message: ");
for (int i = 0; i < 7; i++) {
Serial.print(klineMessage[i], HEX);
Serial.print(" ");
Serial1.write(klineMessage[i]); // Send each byte of the K-line message
}
Serial.println(); // Print a newline after sending the message
lastSendTime = millis(); // Update the time when K-line message was last sent
}
void setup() {
Serial.begin(115200); // Start serial communication for debugging
Serial1.begin(10800); // Start K-line communication
Serial.println("Setup started.");
// Send initial message on K-line to activate CAN-bus relay
sendKLineMessage();
delay(1000); // Small delay to make sure K-line message is sent initially
Serial.println("Initial K-line message sent.");
// Initialize MCP2515
if (CAN0.begin(MCP_ANY, CAN_250KBPS, MCP_8MHZ) == CAN_OK) {
Serial.println("MCP2515 Initialized Successfully!");
} else {
Serial.println("Error Initializing MCP2515...");
while (1); // Hang if MCP2515 initialization fails
}
//pinMode(CAN0_INT, INPUT);
CAN0.setMode(MCP_NORMAL); // Set MCP2515 to normal mode
Serial.println("MCP2515 in Normal mode.");
}
void loop() {
// Handle K-line messaging independently from CAN messaging
sendKLineMessage(); // Send K-line message if the delay period has passed
long unsigned int rxId;
unsigned char len = 0;
unsigned char buf[8];
if (CAN_MSGAVAIL == CAN0.checkReceive()) {
CAN0.readMsgBuf(&rxId, &len, buf);
Serial.print("Message ID: ");
Serial.println(rxId, HEX);
Serial.print("Data: ");
for (int i = 0; i < len; i++) {
Serial.print(buf[i], HEX);
Serial.print(" ");
}
Serial.println();
CAN0.setMode(MCP_NORMAL);
}
delay(10);
}
and here is what i get from the start (it goes on and on..):
19:53:42.504 -> Setup started.
19:53:43.541 -> Initial K-line message sent.
19:53:43.541 -> Entering Configuration Mode Successful!
19:53:43.541 -> Setting Baudrate Successful!
19:53:43.541 -> MCP2515 Initialized Successfully!
19:53:43.541 -> MCP2515 in Normal mode.
19:53:43.541 -> Message ID: 8010001C
19:53:43.541 -> Data: C0 8E 30 5C 44 0 A3 60
19:53:43.657 -> Message ID: 80600006
19:53:43.657 -> Data: 0 0 5 9B AB FF FC 18
19:53:43.732 -> Message ID: 8050003C
19:53:43.732 -> Data: 83 10 A E C0 20 1A 1C
19:53:43.853 -> Message ID: 8010001C
19:53:43.853 -> Data: 0 8E B0 5C 44 0 23 60
19:53:43.935 -> Message ID: 8010001C
19:53:43.935 -> Data: 80 8E B0 5C 44 0 23 60
19:53:44.037 -> Message ID: 8040001E
19:53:44.037 -> Data: C7 0 91 16 4 0 60 0
19:53:45.583 -> Sending K-line message: 84 40 13 B2 F0 3 7C
19:53:45.653 -> Message ID: 8010001C
19:53:45.653 -> Data: C0 8E 30 5C 44 0 A3 60
19:53:45.768 -> Message ID: 8010001C
19:53:45.768 -> Data: C0 8E 30 5C 44 0 A3 60
19:53:45.898 -> Message ID: 8010001C
19:53:45.898 -> Data: 40 8E 30 5C 44 0 A3 60
19:53:45.988 -> Message ID: 80600006
19:53:45.988 -> Data: 0 0 25 9B AB FF FC 18
19:53:46.107 -> Message ID: 8010001C
19:53:46.107 -> Data: 80 8E 30 5C 44 0 23 60
19:53:46.195 -> Message ID: 8010001C
19:53:46.195 -> Data: 0 8E 30 5C 44 0 23 60
19:53:46.284 -> Message ID: 8010001C
Maybe someone could help me figure it out?