mcp2515 sleep mode
- Войдите на сайт для отправки комментариев
Втр, 18/12/2018 - 00:22
Всем привет.
Который день голову ломаю, может кто помочь ?
Использую библиотеку https://github.com/Seeed-Studio/CAN_BUS_Shield
Не могу загнать в спящий режим.
Вставляю следующий код:
byte mcp2515_setCANCTRL_Mode(MODE_SLEEP);
Но ничего не происходит...
В одной из статей нашел следущее:
Чтобы войти в режим сна, в регистре CANCTRL устанавливаются биты запроса смены режима (REQOP[2:0]). Биты CANSTAT.OPMODE показывают текущий рабочий режим. Эти биты должны быть прочитаны после отправки команды Sleep контроллеру MCP2515. MCP2515 остается активным и не войдет в режим сна, пока эти биты не покажут вход в режим сна.
Но никак не соображу, кек это реализовать...
Вставляю следующий код:
1bytemcp2515_setCANCTRL_Mode(MODE_SLEEP);А куда вы, пардон, вставляете?
Вставляю следующий код:
1bytemcp2515_setCANCTRL_Mode(MODE_SLEEP);А куда вы, пардон, вставляете?
Пусть это будет пример из данной библиотеки, на приём пакетов, в loop
Приведите пример полноценного кода. А то мне что-то непонятно. setCANCTRL_Mode объявлен как private и вне класса должен быть недоступен.
#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() { byte mcp2515_setCANCTRL_Mode(MODE_SLEEP); 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 *********************************************************************************************************/Если я что то делаю не так, поправьте пождалуйста.
В данном случак в стороке 27 просто объявлен прототип фунции с именем mcp2515_setCANCTRL_Mode() и все. Для работы с методами (фунциями) CAN надо использовать вызов CAN.mcp2515_setCANCTRL_Mode так же как делается, скажем, в строке 33. Проблема в том что тот метод который нужен объявлен как private и не может быть использован вне класса. Нужно править библиотеку. Перенести этот метод в секцию public. Но я с кодом не разбирался, это может потянуть за собой и другие правки.
Видимо всё сложнее, чем я думал.
Видимо всё сложнее, чем я думал.
дело не в том, что "сложнее". а в том что у вас явно маловато знаний в области программирования, особенно в работе с классами
Согласен, мало, по этому и сложнее имелось в виду мне,вот и обратился за помощью....
Почитайте что нибудь вроде "основы С++" или тому подобное. Материалов в сети полно.
Например - https://code-live.ru/post/cpp-classes/
Спасибо, почитаю.