Библиотека MCP_CAN

Пеппев
Сб 15 августа 2015 г. 13:27
Когда я пробую примеры, включенные в это библиотека Эскиз скомпилируется без ошибки (я изменяю штифт Defincemion для штифта SS), но когда я загружаю его в Maple Mini, контроллер получает заблокированный (нет серийного порта, без светодиода). Любая помощь?

Пеппев
Сб 15 августа 2015 г., 16:15
Если я объявляю класс MCP_CAN CAN(SPI_CS_PIN);

ZMEMW16
Сб 15 августа 2015 г., 18:02
И ваше оборудование - что?
Есть ли на самом деле интерфейс CAN? Не иметь, возможно, вполне заморозить/повесить набросок
Можем ли мы увидеть весь эскиз?

Стивен

Rogerclark
Сб 15 августа 2015 г., 21:31
Разве нет проблемы с USB и CAN Comming некоторых ресурсов?

Я знаю, что кто -то исследует, как обойти проблему общих ресурсов, но я не думаю, что они когда -либо разместили решение

Смотрите эту ветку

ViewTopic.PHP?f = 15&t = 72&P = 4269

victor_pv
Солнце 16 августа 2015 2:19
Rogerclark написал:Разве нет проблемы с USB и CAN Comming некоторых ресурсов?

Я знаю, что кто -то исследует, как обойти проблему общих ресурсов, но я не думаю, что они когда -либо разместили решение

Смотрите эту ветку

ViewTopic.PHP?f = 15&t = 72&P = 4269

Пеппев
Солнце 16 августа 2015 г., 4:18
Мое оборудование - это Exsternal MCP2515 модуль, он работает, если я объявляю класс внутри настройки и цикла, он не работает, если я объявляю класс как глобальный.

Эскиз:
/ demo: CAN-BUS Shield, receive data with interrupt mode // when in interrupt mode, the data coming can't be too fast, must >20ms, or else you can use check mode // loovee, 2014-6-13 #include #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 byte SPI_CS_PIN = 31; // Set CS pin SPIClass SPI_3(2); unsigned char flagRecv = 0; unsigned char len = 0; unsigned char buf[8]; char str[20]; void setup() { Serial.begin(115200); pinMode(33, OUTPUT); digitalWrite(33, HIGH); delay(25000); digitalWrite(33, LOW); delay(1000); digitalWrite(33, HIGH); MCP_CAN CAN(SPI_CS_PIN); 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(100); goto START_INIT; } attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt } void MCP2515_ISR() { flagRecv = 1; } void loop() { MCP_CAN CAN(SPI_CS_PIN); INT8U ret; digitalWrite(SPI_CS_PIN, LOW); SPI_3.transfer(0x02); SPI_3.transfer(0x0D); SPI_3.transfer(0x00); digitalWrite(SPI_CS_PIN, HIGH); delay(100); for (int i = 0; i < 150; i++) { digitalWrite(SPI_CS_PIN, LOW); SPI_3.transfer(0x03); SPI_3.transfer(i); ret = SPI_3.transfer(0x00); digitalWrite(SPI_CS_PIN, HIGH); Serial.print(i, HEX); Serial.print(" "); Serial.println(ret, BIN); delay(100); } 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); // print the data for (int i = 0; i < len; i++) { Serial.print(buf[i]); Serial.print("\t"); } Serial.println(); } } } /********************************************************************************************************* END FILE *********************************************************************************************************/

Mrburnette
Солнце 16 августа 2015 г. 14:41
Пеппев написал:Мое оборудование - это Exsternal MCP2515 модуль, он работает, если я объявляю класс внутри настройки и цикла, он не работает, если я объявляю класс как глобальный.
<...>

ZMEMW16
Солнце 16 августа 2015 г. 15:46
flagrecv должен быть объявлен нестабильным.

Я только что заказываю пару модулей CAN :-)

Стивен

Пеппев
Солнце 16 августа 2015 г. 15:52
ZMEMW16 написал:flagrecv должен быть объявлен нестабильным.

Я только что заказываю пару модулей CAN :-)

Стивен

victor_pv
Солнце 16 августа 2015 г., 17:11
Пеппев написал:Мое оборудование - это Exsternal MCP2515 модуль, он работает, если я объявляю класс внутри настройки и цикла, он не работает, если я объявляю класс как глобальный.

Эскиз:
/ demo: CAN-BUS Shield, receive data with interrupt mode // when in interrupt mode, the data coming can't be too fast, must >20ms, or else you can use check mode // loovee, 2014-6-13 #include #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 byte SPI_CS_PIN = 31; // Set CS pin SPIClass SPI_3(2); unsigned char flagRecv = 0; unsigned char len = 0; unsigned char buf[8]; char str[20]; void setup() { Serial.begin(115200); pinMode(33, OUTPUT); digitalWrite(33, HIGH); delay(25000); digitalWrite(33, LOW); delay(1000); digitalWrite(33, HIGH); MCP_CAN CAN(SPI_CS_PIN); 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(100); goto START_INIT; } attachInterrupt(0, MCP2515_ISR, FALLING); // start interrupt } void MCP2515_ISR() { flagRecv = 1; } void loop() { MCP_CAN CAN(SPI_CS_PIN); INT8U ret; digitalWrite(SPI_CS_PIN, LOW); SPI_3.transfer(0x02); SPI_3.transfer(0x0D); SPI_3.transfer(0x00); digitalWrite(SPI_CS_PIN, HIGH); delay(100); for (int i = 0; i < 150; i++) { digitalWrite(SPI_CS_PIN, LOW); SPI_3.transfer(0x03); SPI_3.transfer(i); ret = SPI_3.transfer(0x00); digitalWrite(SPI_CS_PIN, HIGH); Serial.print(i, HEX); Serial.print(" "); Serial.println(ret, BIN); delay(100); } 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); // print the data for (int i = 0; i < len; i++) { Serial.print(buf[i]); Serial.print("\t"); } Serial.println(); } } } /********************************************************************************************************* END FILE *********************************************************************************************************/

ZMEMW16
Sun 16 августа 2015 г., 17:49
Пеппев написал:ZMEMW16 написал:flagrecv должен быть объявлен нестабильным.

Я только что заказываю пару модулей CAN :-)

Стивен

Пеппев
Солнце 16 августа 2015 г. 18:06
victor_pv написал:
Ваша библиотека, вероятно, пытается что -то сделать с булавками IO (я думаю) во время декларации.
В этом есть несколько потоков, но в основном происходит то, что конструктор вашего объекта работает перед инициализацией io. Таким образом, после того, как ваши объекты установили то или иное в порту iO, подпрограмма инициализации IO Libmaple работает и сбрасывает все настройки портов.

Переместите любую операцию IO PIN -штифта за пределами конструктора, или вам придется дважды выполнять установку PIN -iO.
Попробуйте сделать так, как LCD библиотеки. Они объявляют объект вне настройки или цикла, но не выполняют никакой установки PIN -кода до TFT.begin () называется внутри петли. В этот момент рутина Libmaple Init уже запускается и не сбросит настройки IO.

victor_pv
Солнце 16 августа 2015 г., 8:08 вечера
Пеппев написал:victor_pv написал:
Ваша библиотека, вероятно, пытается что -то сделать с булавками IO (я думаю) во время декларации.
В этом есть несколько потоков, но в основном происходит то, что конструктор вашего объекта работает перед инициализацией io. Таким образом, после того, как ваши объекты установили то или иное в порту iO, подпрограмма инициализации IO Libmaple работает и сбрасывает все настройки портов.

Переместите любую операцию IO PIN -штифта за пределами конструктора, или вам придется дважды выполнять установку PIN -iO.
Попробуйте сделать так, как LCD библиотеки. Они объявляют объект вне настройки или цикла, но не выполняют никакой установки PIN -кода до TFT.begin () называется внутри петли. В этот момент рутина Libmaple Init уже запускается и не сбросит настройки IO.