На CAN0 приходит первая часть фрейма которую я изменяю и отправляю обратно в CAN0, далее от CAN0 приходит запрос на отправку второй части ответа (flow control), это работает, вторая часть ответа благополучно доходит по назначению.
Но следом на CAN0 приходит другой (отличный от первого) запрос который мне обрабатывать не надо и он нормально фильтруется и отправляется в CAN1, а вот запрос на flow control уже для этого запроса начинает обрабатываться IF (стр. 61) вместо того чтобы также лететь без изменений в CAN1.
Я использовал переменную в качестве флага, но флаг не работает. Где я ошибся?
строки 54-60 работают, 61-67 продолжают исполнять функцию несмотря на сброшенный флаг.
// Demo: Dual CAN-BUS Shields, Data Pass-through
// Written by: Cory J. Fowler
// January 31st 2014
// This examples the ability of this library to support more than one MCP2515 based CAN interface.
#include <mcp_can.h>
#include <SPI.h>
unsigned long rxId;
byte len;
byte rxBuf[8];
bool flag = false;
byte txBuf0[] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};
byte txBuf1[] = {0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA};
char msgString[128]; // Array to store serial string
MCP_CAN CAN0(2); // CAN0 interface usins CS on digital pin 2
MCP_CAN CAN1(3); // CAN1 interface using CS on digital pin 3
#define CAN0_INT 8 //define interrupt pin for CAN0 recieve buffer
#define CAN1_INT 9 //define interrupt pin for CAN1 recieve buffer
void setup()
{
Serial.begin(115200);
pinMode(CAN0_INT, INPUT_PULLUP);
pinMode(CAN1_INT, INPUT_PULLUP);
// init CAN0 bus, baudrate: 500k@8MHz
if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
Serial.print("CAN0: Init OK!\r\n");
CAN0.setMode(MCP_NORMAL);
} else Serial.print("CAN0: Init Fail!!!\r\n");
// init CAN1 bus, baudrate: 500k@8MHz
if (CAN1.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
Serial.print("CAN1: Init OK!\r\n");
CAN1.setMode(MCP_NORMAL);
} else Serial.print("CAN1: Init Fail!!!\r\n");
SPI.setClockDivider(SPI_CLOCK_DIV2); // Set SPI to run at 8MHz (16MHz / 2 = 8 MHz)
CAN0.sendMsgBuf(0x1000000, 1, 8, txBuf0);
CAN1.sendMsgBuf(0x1000001, 1, 8, txBuf1);
}
void loop() {
if (!digitalRead(CAN0_INT)) { // If interrupt pin is low, read CAN0 receive buffer
CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s)
}
if (rxId == 0x7DF && rxBuf[0] == 0x02){
flag = true;
rxId = 0x7E8;
len = 8;
rxBuf[1] = 0x14;
CAN0.sendMsgBuf(rxId, 0, len, rxBuf); // Immediately send message out CAN0 interface
}
if (rxId == 0x7E0 && rxBuf[0] == 0x30 && flag == true){
rxId = 0x7E8;
len = 8;
rxBuf[5] = 0x15;
CAN0.sendMsgBuf(rxId, 0, len, rxBuf); // Immediately send message out CAN0 interface
flag = false;
}
CAN1.sendMsgBuf(rxId, 0, len, rxBuf); // Immediately send message out CAN1 interface
if (!digitalRead(CAN1_INT)) { // If interrupt pin is low, read CAN1 receive buffer
CAN1.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s)
CAN0.sendMsgBuf(rxId, 0, len, rxBuf); // Immediately send message out CAN0 interface
}
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
[/code]```