Il y a quand même un truc qui ne va pas : les cartes émettent bien des messages CAN puisque que je les reçois bien sur mon moniteur CAN.
Par contre, elles ne voient pas les messages reçus, sous interruption ou pas.
J'ai bricolé un test qui émet et reçoit avec des Id aléatoires pour permettre de charger le même code sur 2 cartes connectées par le bus CAN.
J'ai adapté l'initialisation de l'interruption à la méthode recommandée du moment. L'interruption est bien sur la pin 3.
Il manque l'initialisation des filtres, mais ça ne devrait rien filtrer.
// Demo: CAN-BUS Shield, send data & receive data with interrupt mode
// Dominique 21/04/2016
// TEST des cartes 8 servos conçues et réalisées par Jean-Luc Bechennec
#include <SPI.h>
#include "mcp_can.h"
// La pin CS du 2515 sur la carte 8 servos est 10
const int SPI_CS_PIN = 10;
// L'IT_CAN est sur D3
const byte interruptPin = 3;
MCP_CAN CAN(SPI_CS_PIN); // Set CS pin
unsigned char flagRecv = 0;
unsigned char len = 0;
unsigned char buf[8];
char str[20];
unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
unsigned long _Seconde;
int Id;
void setup()
{
Serial.begin(115200);
START_INIT:
if(CAN_OK == CAN.begin(CAN_500KBPS)) // init can bus : baudrate = 500k
{
Serial.println("CAN BUS Shield init ok!");
}
else
{
Serial.println("CAN BUS Shield init fail");
Serial.println("Init CAN BUS Shield again");
delay(500);
goto START_INIT;
}
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), MCP2515_ISR, FALLING); // start interrupt
_Seconde = millis(); // start tache emission periodique
randomSeed(analogRead(A6));
Id = random(10,200); // pour éviter d'avoir la même adresse des 2 cotés
}
void MCP2515_ISR()
{
flagRecv = 1;
}
void loop()
{
if(flagRecv) { // check if get data
flagRecv = 0; // clear flag
// iterate over all pending messages
// If either the bus is saturated or the MCU is busy,
// both RX buffers may be in use and reading a single
// message does not clear the IRQ conditon.
while (CAN_MSGAVAIL == CAN.checkReceive()) {
// read data, len: data length, buf: data buf
CAN.readMsgBuf(&len, buf);
unsigned char canId = CAN.getCanId();
// print the data
Serial.print(canId);Serial.print("\t");
for(int i = 0; i<len; i++) {
Serial.print(buf[i]);Serial.print("\t");
}
Serial.println();
} // while
} // if(flagRecv)
if (_Seconde + 1000 < millis()) {
_Seconde = millis();
CAN.sendMsgBuf(Id,0, 8, stmp);
Serial.println("envoi message");
stmp[0]++;
if (stmp[0]==0) {
stmp[1]++;
if (stmp[1]==0) {
stmp[2]++;
if (stmp[2]==0) {
stmp[3]++;
if (stmp[3]==0) {
stmp[4]++;
if (stmp[4]==0) {
stmp[5]++;
if (stmp[5]==0) {
stmp[6]++;
if (stmp[6]==0) {
stmp[7]++;
}
}
}
}
}
}
}
}
}
Je n'ai pas réussi à recevoir les messages qui sont pourtant bien émis.
Il est tard, je verrai ça demain soir.