Вийшло!
І так по порядку. На CAN модулі кварц був перепаяний на 16Mhz. Якщорозколупати бібліотеку, то можна і на 8 завести, але зазамовчуванням для 8Mhz немає налаштування на нашу швидкість83.3kbps, а для 16 є. Безпосередньо для керування магнітолою булозібрано ось такий девайс.
/FSAAAgFA--A-960.jpg"/>
Ну і власне для ардуїни ось такий скетч
#include
#include "mcp_can.h"
/*SAMD core*/
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE< br/>
#define SERIAL SerialUSB
#else
#define SERIAL Serial
#endif
< p>
= 10;
const int CAN_INT_PIN = 2;
//KEY PINS
#define KP1 3
#define KP2 4
#define KP3 5
#define KP4 6
#define KP5 7
#define KP6 8
//CAN KEYS
#define CAN_RU 0x02
#define CAN_RD 0x04
> #define CAN_RC 0x01
#define CAN_LU 0x08
#define CAN_LD 0x10
#define CAN_LC 0x20
#define CAN_MAIN 0x00<
//CAN id
#define CAN_KEY_id 0x3A0
//PRESS TIME
#define DELAY_TIME 250
MCP_CAN CAN(SPI_CS_PIN); //Set CS pin
buf 8; unsigned long t = 0;
unsigned char set_pin = 255;
void setup ) {
pinMode(KP1, OUTPUT);
pinMode(KP2, OUTPUT);
pinMode(KP3, OUTPUT);
> pinMode(KP4, OUTPUT);
pinMode(KP5, OUTPUT);
pinMode(KP6, OUTPUT);
digitalWrite(KP1, LOW);
digitalWrite(KP2, LOW);
digitalWrite(KP3, LOW);
digitalWrite(KP4, LOW);
digitalWrite (KP5, LOW);
digitalWrite(KP6, LOW);
SERIAL. begin(115200);
while (! SERIAL) {
; //wait for serial port to connect. Потрібен для природного USBport тільки
}
= 500k
SERIAL.println("CAN BUS Shield init fail");
SERIAL.println("Init CAN BUS Shield again");
delay (100); CAN.setMode (MODE_CONFIG); CAN.init_Mask (0, 0, 0xfff);
CAN.init_Mask(1, 0, 0xfff);
CAN.init_Filt(0, 0, CAN_KEY_id);
CAN.init_Filt( 1, 0, CAN_KEY_id);
CAN.init_Filt(2, 0, CAN_KEY_id);
CAN.init_Filt(3, 0, CAN_KEY_id);
CAN.init_Filt(4, 0, CAN_KEY_id);
CAN.init_Filt(5, 0, CAN_KEY_id);
CAN.setMode(MODE_NORMAL);
SERIAL.println("CAN BUS Shield init ok! "); //start interrupt
}
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 можуть бути в використанні і reading single
//message does не clear the IRQ conditon.
while (CAN_MSGAVAIL == CAN.checkReceive ()) {/read data, len:datalength, buf:data buf
CAN.readMsgBuf(& len; buf);
unsigned long canId = CAN.getCanId();
if (canId == CAN_KEY_id){
switch (buf0){
case CAN_RC:
if (set_pin! = 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP1, HIGH);
t = millis();
set_pin = KP1;
break;
case CAN_UA:
if (set_pin! = 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP2, HIGH);
t = millis();
set_pin = KP2;
break;
case CAN_RD:
if (set_pin! = 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP3, HIGH);
t = millis();
set_pin = KP3;
break;
case CAN_LC:
if (set_pin! = 255){
digitalWrite (set_pin, LOW);
}
digitalWrite(KP4, HIGH);
t = millis();
set_pin = KP4;
break;
case CAN_LU:
if (set_pin! = 255){
digitalWrite(set_pin, LOW);
}
digitalWrite(KP5, HIGH);
t = millis();
set_pin = KP5;
case CAN_LD:
if (set_pin! = 255){
digitalWrite(set_pin, LOW);
> }
digitalWrite(KP6, HIGH);
t = millis();
set_pin = KP6;
break; < br/>
}
}
//print the data
/*for (int i = 0; i < len; i++) {
SERIAL.print(bufi); SERIAL.print("\t");
}
SERIAL.println(); */
}
}<
if (set_pin! digitalWrite(set_pin, LOW);
}
t = 0;
set_pin = 255;
}
” LOW);
}
digitalWrite(KP6, HIGH);
t = millis();
set_pin = KP6; < br/>
break;
}
}
//print the data
/*for (int i = 0; i
SERIAL.print(bufi); SERIAL.print("\t");
}
SERIAL.println(); */
}
}<
if (set_pin! digitalWrite(set_pin, LOW);
}
t = 0;
set_pin = 255;
}
” LOW);
}
digitalWrite(KP6, HIGH);
t = millis();
set_pin = KP6; < br/>
break;
}
}
//print the data
/*for (int i = 0; i
SERIAL.print(bufi); SERIAL.print("\t");
}
SERIAL.println(); */
}
}<
if (set_pin! digitalWrite(set_pin, LOW);
}
t = 0;
set_pin = 255;
}
”






Коментарі
Поки немає коментарів — будьте першим.