Arduino UNO и MCP2515 CAN

MaksVV
Offline
Зарегистрирован: 06.08.2015

все библы связазнные с CAN удалить из папки библиотек ардуино. Эти залить  

77777_777
Offline
Зарегистрирован: 22.02.2019

поменял,толку ноль(все из папки убрал.,ваши поставил)

#include <SPI.h>
#include <mcp_can.h>

const int spiCSPin = 10;
int ledHIGH    = 1;
int ledLOW     = 0;

MCP_CAN CAN(spiCSPin);

void setup()
{
    Serial.begin(115200);


    while (CAN_OK != CAN.begin(CAN_250KBPS))
    {
        Serial.println("CAN BUS init Failed");
        delay(100);
    }
    Serial.println("CAN BUS Shield Init OK!");
}

unsigned char stmp[8] = {ledHIGH, 1, 2, 200, ledLOW, 5, 6, 7};
    
void loop()
{   
  Serial.println("In loop");
  CAN.sendMsgBuf(535, 1, 8, stmp);
  delay(500);
}
это передатчик,в предпоследней строке ставлю 0 всё работает(id до 2047 .2 в11) ставлю 1 тишина...заводской сканер видит и то и то
ak62
Offline
Зарегистрирован: 03.01.2019

А не пробовали отправлять в таком формате CAN0.sendMsgBuf(0x00217FFC, 1, 8, data)?

77777_777
Offline
Зарегистрирован: 22.02.2019

только сейчас ваше 16число вставил.... тоже самое

ak62
Offline
Зарегистрирован: 03.01.2019

https://drive.google.com/open?id=1moxeYAOaA_m3omyRAMMAgi2GNlw2rZMx Вот тот, с которым у меня все работает.

MaksVV
Offline
Зарегистрирован: 06.08.2015

Возможно у вас это #47

77777_777
Offline
Зарегистрирован: 22.02.2019

Спаси Вас Бог, добрый человек!!! Из вашей ссылки залил скетчи,работают идеально,то что Было нужно!  Но почему мои не работают,это загадка...  

sadman41
Offline
Зарегистрирован: 19.10.2016

Разве у CAN-контроллера есть чем запомнить фильтры? Может достаточно было с него просто питание снять?

MaksVV
Offline
Зарегистрирован: 06.08.2015

Вот хз. Похоже у mcp2515 есть еепром. Надо почитать даташит внимательно. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

77777_777 пишет:

Спаси Вас Бог, добрый человек!!! Из вашей ссылки залил скетчи,работают идеально,то что Было нужно!  Но почему мои не работают,это загадка...  

Может сейчас и ваши заработают

sadman41
Offline
Зарегистрирован: 19.10.2016

MaksVV пишет:

Вот хз. Похоже у mcp2515 есть еепром. Надо почитать даташит внимательно. 

Не вижу никаких упоминаний о возможности внутренней записи параметров.

MaksVV
Offline
Зарегистрирован: 06.08.2015

тоже не нашёл. Не понятно почему модули так себя ведут. Может блин китайская подделка mcp2515 как это было с FTDI ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Зачем китайцам лишний функционал за те же деньги отдавать?

MaksVV
Offline
Зарегистрирован: 06.08.2015

всмысле какой лишний функционал? 

sadman41
Offline
Зарегистрирован: 19.10.2016

Функционал сохранения фильтров/масок.

MaksVV
Offline
Зарегистрирован: 06.08.2015

не, я имел ввиду что просто глючит. А все это совпадение с масками фильтрами.  Кстати взять вавгат, функционала добавили, а цена, такая же? не заказывал не знаю. 

sadman41
Offline
Зарегистрирован: 19.10.2016

Так у вавгата чип зовется иначе. В сущности  это просто частично совместимый с АТМелом МК, а не тот же самый + что-то еще.

По-моему надо просто попробовать установить левые фильтры, а потом обесточить и проконтролировать.

MaksVV
Offline
Зарегистрирован: 06.08.2015

врядли конечно подделка, все таки не такая массовая микруха как фтди. Так мысли в слух. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

sadman41 пишет:
По-моему надо просто попробовать установить левые фильтры, а потом обесточить и проконтролировать.
дак да , у меня вроде так и оживлялись модули от своей глючности с приёмом сообщений. 

ak62
Offline
Зарегистрирован: 03.01.2019

MaksVV пишет:

не, я имел ввиду что просто глючит. А все это совпадение с масками фильтрами.  Кстати взять вавгат, функционала добавили, а цена, такая же? не заказывал не знаю. 

Случайно заказал, не понимая, что это. Может это и классная штука (wavgate), но я бы с радостью поменял их на атмегу. Но не смотря на это с МСР работают. и даже с масками. А по поводу прошить сто пятьсот раз разными скетчами - самому так показалось. То ли что то сбивается в нем(модуле), то ли просто совпадение.

MaksVV
Offline
Зарегистрирован: 06.08.2015

видимо нужно просто уметь их готовить

sadman41
Offline
Зарегистрирован: 19.10.2016

ak62 пишет:
А по поводу прошить сто пятьсот раз разными скетчами - самому так показалось. То ли что то сбивается в нем(модуле), то ли просто совпадение.

Не надо ничего прошивать сто раз. Вы один раз поставили неправильный фильтр, а потом его не меняете. От того, что перешиваете mcp чем-то не изменяющим настройки фильтров, ничего не занулится, так как при этом ресетится только ардуина. В mcp все будет храниться, пока не обесточите модуль или не сбросите фильтры случайно каким-то скетчем.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Там вообще если внимательно читать даташит есть намек, что после ресета нужно инициализировать фильтры и маски.

MaksVV
Offline
Зарегистрирован: 06.08.2015

sadman41 пишет:
Не надо ничего прошивать сто раз. Вы один раз поставили неправильный фильтр, а потом его не меняете. От того, что перешиваете mcp чем-то не изменяющим настройки фильтров, ничего не занулится, так как при этом ресетится только ардуина. В mcp все будет храниться, пока не обесточите модуль или не сбросите фильтры случайно каким-то скетчем.

золотые слова, однако. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

brokly пишет:

Там вообще если внимательно читать даташит есть намек, что после ресета нужно инициализировать фильтры и маски.

после своих танцев с бубном я так и стал делать. Маски по нулям и всё. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да я тоже лет пять назад такой проект наворотил какого-то кан фильтра-анализатора что аж страшно. Припомнил, что и я долго с масками мучался. Нужно было ваговским телевизором прикинуться :), для этого отреверсить протокол. После этого в такие проекты не ввязываюсь. Хотя в тот раз все получилось.

MaksVV
Offline
Зарегистрирован: 06.08.2015

реверс сложная штука, но интересная блин. Кроссворды отдыхають. 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Да ладно, сейчас у вагов например протокол стал с подтверждением. И просто послать команду в кан прикинувшись  мастером мало. Периферийный блок выполнять ее не станет. Только фильтры ставить. А там уже такой поток данных, что только STMки с двумя канами или ESPшки. И вот эти MCP, становятся ненужными.

И пртокол такой отреверсит ваще невыполнимо, все мозги сломаешь :( 

MaksVV
Offline
Зарегистрирован: 06.08.2015

согласен. ваги мерседес бмв там жесть. Но по япам можно поковырять. в качестве фильтра в разрыв, да,  дуня не вывезет. Тут стм нужно курить.

Но есть в продаже готовые фильтры на стм. для пользователей так сказать. Как и двухканальные кан анализаторы, которые позволяют зацепиться в разрыв чтобы узнать какие именно ID шлёт исследуемый девайс . ну и ещё некоторые плюшки в ПО CANализаторов бывают.  

кто реверсить собирается оставлю полезные ссылки 

http://can.web-box.ru/work_with_can

http://canhacker.ru

http://www.autokey.com.ua/2CAN/2can.html

http://www.autokey.com.ua/CAN%20FILTER/canfilter.html

 

77777_777
Offline
Зарегистрирован: 22.02.2019

Доброго вечера всем. Опять та же проблема, но уже с canhakerV2. 00.01(mcp2515 и ардуинка). Невидет29 битные сообщения. Кварцы и библы, исключается.

MaksVV
Offline
Зарегистрирован: 06.08.2015

возьмите второй такой модуль. Обесточить mcp2515, Залить скетч канхакера,   включите два канхакера между собой. Если и в этом случае не заработает - беда.  Иначе шлёте 29 бит неправильно или очень быстро. 

77777_777
Offline
Зарегистрирован: 22.02.2019

У меня есть рабочий вариант, через сериал порт, там всё работает. Но там неудобно парсить сообщения. В чём-же дело??? И скетчи и библы все перепробовал...

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

sadman41 пишет:
Не надо ничего прошивать сто раз. Вы один раз поставили неправильный фильтр, а потом его не меняете. От того, что перешиваете mcp чем-то не изменяющим настройки фильтров, ничего не занулится, так как при этом ресетится только ардуина. В mcp все будет храниться, пока не обесточите модуль или не сбросите фильтры случайно каким-то скетчем.

золотые слова, однако. 

MaksVV
Offline
Зарегистрирован: 06.08.2015

MaksVV пишет:

вот только что потратил 2 минуты.  Убрал ВСЕ библы из папки libreries моидокументы/ардуино и библы, связанные с кан, из папки в ProgrammFiles/Arduino. Разорхивировал в папку libreries моидокументы/ардуино архив по ссылке выше. Залил скетч из примера usb can . в оба модуля. Открыл две проги кан хакер. Всё работает. Что я делаю не так? 

77777_777
Offline
Зарегистрирован: 22.02.2019

10 раз сегодня делал тоже самое. А можно ссылку по которой вы делали, ёщё раз попробую

MaksVV
Offline
Зарегистрирован: 06.08.2015
77777_777
Offline
Зарегистрирован: 22.02.2019

У вы чудо не случилось. Вё тоже самое.

MaksVV
Offline
Зарегистрирован: 06.08.2015

а кто источник 29 бит?

77777_777
Offline
Зарегистрирован: 22.02.2019
// CAN Send Example
//

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(10);     // Set CS to pin 10

void setup()
{
  Serial.begin(115200);

  // Initialize MCP2515 running at 16MHz with a baudrate of 500kb/s and the masks and filters disabled.
  if(CAN0.begin(MCP_ANY, CAN_100KBPS, MCP_8MHZ) == CAN_OK) Serial.println("MCP2515 Initialized Successfully!");
  else Serial.println("Error Initializing MCP2515...");

  CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted
}

byte data[8] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xe, 0xff};
byte data2[8] = {0xff, 0x01, 0x02, 0x03, 0x04, 0x05, 0xe, 0xfe};
void loop()
{
  // send data:  ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
  byte sndStat = CAN0.sendMsgBuf(0xff, 0, 8, data);
  if(sndStat == CAN_OK){
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message...");
  }
  delay(500);   // send data per 100ms
  byte sndStat2 = CAN0.sendMsgBuf(0xffff, 1, 8, data2);
  if(sndStat2 == CAN_OK){
    Serial.println("Message Sent Successfully!");
  } else {
    Serial.println("Error Sending Message...");}
    delay(500);
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

залей такой скетч, потом скетч канхакера

#include <mcp_can.h>
#include <SPI.h>

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(10);                          // Set CS to pin 10

void setup()
{
  Serial.begin(115200);
  if(CAN0.begin(MCP_STDEXT, CAN_100KBPS, MCP_8MHZ) == CAN_OK) Serial.print("MCP2515 Init Okay!!\r\n");
  else Serial.print("MCP2515 Init Failed!!\r\n");
  pinMode(2, INPUT);                       // Setting pin 2 for /INT input

  CAN0.init_Mask(0,1,0);                // Init first mask...
  CAN0.init_Filt(0,1,0x00FFEE00);                // Init first filter...
  CAN0.init_Filt(1,1,0x00FFDD00);                // Init second filter...
  
  CAN0.init_Mask(1,0,0x00000000);                // Init second mask... 
  CAN0.init_Filt(2,0,0x00000000);                // Init third filter...
  CAN0.init_Filt(3,0,0x00000000);                // Init fouth filter...
  CAN0.init_Filt(4,0,0x00000000);                // Init fifth filter...
  CAN0.init_Filt(5,0,0x00000000);                // Init sixth filter...
  
  Serial.println("MCP2515 Library Mask & Filter Example...");
  CAN0.setMode(MCP_NORMAL);                // Change to normal mode to allow messages to be transmitted
}

void loop()
{
    if(!digitalRead(2))                    // If pin 2 is low, read receive buffer
    {
      CAN0.readMsgBuf(&rxId, &len, rxBuf); // Read data: len = data length, buf = data byte(s)
      Serial.print("ID: ");
      Serial.print(rxId, HEX);
      Serial.print(" Data: ");
      for(int i = 0; i<len; i++)           // Print each byte of the data
      {
        if(rxBuf[i] < 0x10)                // If data byte is less than 0x10, add a leading zero
        {
          Serial.print("0");
        }
        Serial.print(rxBuf[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
    }
}

/*********************************************************************************************************
END FILE
*********************************************************************************************************/

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

кстати на 100 кбитах не будет работать. минимум 125 кбит

77777_777
Offline
Зарегистрирован: 22.02.2019

Вам нужно нужно памятник при жизни ставить,заработало!!!! .....Но после сброса питания,такая же хрень,пока опять не прошьёшь.

Это маски и фильтра в мспшке воду мутят.

77777_777
Offline
Зарегистрирован: 22.02.2019

В кан-хакер ставиш настройки фильтровю,ругается не компелир.как их туда загнать?

MaksVV
Offline
Зарегистрирован: 06.08.2015

та библа не поддерживает вроде эти маски фильтры. Попробуй залить настройку масок фильтров, убрать питание, потом уже канхакер лить

77777_777
Offline
Зарегистрирован: 22.02.2019

 не непомогло .Надо библу править

MaksVV
Offline
Зарегистрирован: 06.08.2015

будет время может сделаю, а то ты не первый с такой хренью сталкиваешься

77777_777
Offline
Зарегистрирован: 22.02.2019

Благодарствую

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

пробуем такой скетч канхкера, встроил настройку нулевых фильтров в setup(). 

#include <can.h>
#include <mcp2515.h>

#include <CanHacker.h>
#include <CanHackerLineReader.h>
#include <lib.h>

#include <SPI.h>

const int SPI_CS_PIN = 10;
const int INT_PIN = 2;

CanHackerLineReader *lineReader = NULL;
CanHacker *canHacker = NULL;

#define MCP_SIDH        0
#define MCP_SIDL        1
#define MCP_EID8        2
#define MCP_EID0        3
#define MCP_TXB_EXIDE_M     0x08                                        /* In TXBnSIDL                  */
#define MCP_DLC_MASK        0x0F                                        /* 4 LSBits                     */
#define MCP_RTR_MASK        0x40                                        /* (1<<6) Bit 6                 */
#define MCP_WRITE           0x02


#define MCP_RXF0SIDH    0x00
#define MCP_RXF1SIDH    0x04
#define MCP_RXF2SIDH    0x08
#define MCP_RXF3SIDH    0x10
#define MCP_RXF4SIDH    0x14
#define MCP_RXF5SIDH    0x18
#define MCP_RXM0SIDH    0x20
#define MCP_RXM1SIDH    0x24





void setup() {
    Serial.begin(115200);
    SPI.begin();
    
    canHacker = new CanHacker(&Serial, NULL, SPI_CS_PIN);
    lineReader = new CanHackerLineReader(canHacker);
init_Mask(0,1,0);                // Init first mask...
init_Filt(0,1,0x00000000);                // Init first filter...
init_Filt(1,1,0x00000000);                // Init second filter...
  
init_Mask(1,0,0x00000000);                // Init second mask... 
init_Filt(2,0,0x00000000);                // Init third filter...
init_Filt(3,0,0x00000000);                // Init fouth filter...
init_Filt(4,0,0x00000000);                // Init fifth filter...
init_Filt(5,0,0x00000000);                // Init sixth filter...
    
    pinMode(INT_PIN, INPUT);
}

void loop() {
    if (digitalRead(INT_PIN) == LOW) {
        canHacker->processInterrupt();
    }

    // uncomment that lines for Leonardo, Pro Micro or Esplora
    // if (Serial.available()) {
    //   lineReader->process();    
    // }
}

// serialEvent handler not supported by Leonardo, Pro Micro and Esplora
void serialEvent() {
    lineReader->process();
}

void init_Mask(byte num, byte ext, uint32_t ulData)
{        if (num == 0) mcp2515_write_mf(MCP_RXM0SIDH, ext, ulData);
    else if (num == 1) mcp2515_write_mf(MCP_RXM1SIDH, ext, ulData);
}


void init_Filt(byte num, byte ext, uint32_t ulData)
{
        
    switch( num )
    {
        case 0:
        mcp2515_write_mf(MCP_RXF0SIDH, ext, ulData);
        break;

        case 1:
        mcp2515_write_mf(MCP_RXF1SIDH, ext, ulData);
        break;

        case 2:
        mcp2515_write_mf(MCP_RXF2SIDH, ext, ulData);
        break;

        case 3:
        mcp2515_write_mf(MCP_RXF3SIDH, ext, ulData);
        break;

        case 4:
        mcp2515_write_mf(MCP_RXF4SIDH, ext, ulData);
        break;

        case 5:
        mcp2515_write_mf(MCP_RXF5SIDH, ext, ulData);
        break;

       
    }
    
    }








void mcp2515_write_mf( const byte mcp_addr, const byte ext, const uint32_t id )
{
    uint16_t canid;
    byte tbufdata[4];

    canid = (uint16_t)(id & 0x0FFFF);

    if ( ext == 1) 
    {
        tbufdata[MCP_EID0] = (byte) (canid & 0xFF);
        tbufdata[MCP_EID8] = (byte) (canid >> 8);
        canid = (uint16_t)(id >> 16);
        tbufdata[MCP_SIDL] = (byte) (canid & 0x03);
        tbufdata[MCP_SIDL] += (byte) ((canid & 0x1C) << 3);
        tbufdata[MCP_SIDL] |= MCP_TXB_EXIDE_M;
        tbufdata[MCP_SIDH] = (byte) (canid >> 5 );
    }
    else 
    {
        tbufdata[MCP_EID0] = (byte) (canid & 0xFF);
        tbufdata[MCP_EID8] = (byte) (canid >> 8);
        canid = (uint16_t)(id >> 16);
        tbufdata[MCP_SIDL] = (byte) ((canid & 0x07) << 5);
        tbufdata[MCP_SIDH] = (byte) (canid >> 3 );
    }
    
    mcp2515_setRegisterS( mcp_addr, tbufdata, 4 );
}


void mcp2515_setRegisterS(const byte address, const byte values[], const byte n)
{
    byte i;
    SPI.beginTransaction(SPISettings(10000000, MSBFIRST, SPI_MODE0));
    digitalWrite(SPI_CS_PIN, LOW);
    SPI.transfer(MCP_WRITE);
    SPI.transfer(address);
       
    for (i=0; i<n; i++) 
        SPI.transfer(values[i]);
  
    digitalWrite(SPI_CS_PIN, HIGH);
    SPI.endTransaction();
}


 

77777_777
Offline
Зарегистрирован: 22.02.2019

Я уже домой уехал, завтра попробую, но дело кажется не в фильтра. Заливаю скетч для пертдачти, потом канх и всё работает, до откл пит.??? Видать какие нить другие настройки в сетапе

77777_777
Offline
Зарегистрирован: 22.02.2019

Батенька, да Вы Гений, всё работает идеально! Я такую галиматью, для мнея бестолкового, только в библах лицезрел. Низкий Вам поклон.