Перейти к содержанию
    

CAN128. Попробуем разобраться.

Начал разработку несложного софта для системы из нескольких at90can128. Фактически, надо сделать несложный исходник на IAR EC++ 4.1 Посмотрел, что есть из готового, но ничего не нашёл.

Единственное - колоссального размера исходник от Atmel'a (вроде адаптированный от прошлой архитектуры).

 

Для начала очень желаемо суметь написать софт, который сможет принять-послать-обработать ошибку.

 

Насчёт более высокого уровня (DeviceNET, CANOpen e.t.c) пока не сумел разобраться - складывается ощущение, что ничего готового (ни одного готового каркаса) невозможно найти...

 

Есть желающие включиться в разработку из идейных или материальных побуждений?

 

Жду ответа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Типа совет. Когда работал с CAN-ом слепил приблуду - управляемый через ByteBlaster контроллер CAN на MCP2510 с опторазвязкой и драйвером линии. Можно посылать-принимать сообщения или подслушивать шину. Для отладки весьма полезно.

Возможно, можно найти что-нибудь не кустарное.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По-моему проще разобраться и своё сгородить. На С это несколько строчек текста, не более того.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала очень желаемо суметь написать софт, который сможет принять-послать-обработать ошибку.

Не поверю что для Atmel'a такого нет. ;-)

Это же пара строк кода, после прочтения доки на can-контроллер и CAN спецификации.

- Инициализация (скорость и т.п)

- Настройка приемных фильтров (далее по прерыванию или контролю флага приема)

- Поместить в буфер сообщение и стартовать передачу

- Анализ регистров ошибок

 

Можно поискать/посмотреть примеры для других CAN-контроллеров, например SJA1000.

 

Насчёт более высокого уровня (DeviceNET, CANOpen e.t.c) пока не сумел разобраться - складывается ощущение, что ничего готового (ни одного готового каркаса) невозможно найти...

Есть такие , один из них - http://www.vscp.org/

 

PS:

Рекомендую приобрести готовое can устройство, для контроля и отладки сети между МК. Подойдут недорогие USB-CAN, цена около 100$, к ним прилагаются библиотеки и примеры.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Найденные в продаже устройства:

1. Славна $70 (г.Свердловск). http://www.slavna.ru/stran/devices.htm

2. Rainbow $? (г.Москва) http://www.rtcs.ru/prod_element2.asp?wh_ke...B-CAN&id=401846

3. Много всего http://www.datamicro.ru/can/interfaces/usb-can.shtml

4. Каскод $160 (г.Ленинград). http://www.kaskod.ru/templates/pdf.dop.php...USB-CAN-адаптер

5. Apox $157, $300 исходники http://www.apoxcontrols.com/usbcan.htm (возможно можно заказать через efo.ru http://www.efo.ru/doc/Ftdi/Ftdi.pl?642 - За $140 вероятно более дешёвая версия без опто, $125 на сайте производителя)

 

По производителям софта (наличию хоть чего-нибудь) пока плохо.

 

В качестве платы выбрал www.miklobit.com (MB128-USB-CAN) - Обещали дать в комплект немного рабочего софта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При начале работы я использовал CAN примерно так:

 

//инициализация кана
static void CanInit(void)
{
  //входим в ресет моду
  CANGCON=0;
  while(CANGSTA & (1<<ENFG));

  // задаем TIME сеги... примеры есть в даташите
  CANBT1=CANBT1_DEF;
  CANBT2=CANBT2_DEF;
  CANBT3=CANBT3_DEF;

  // инициализируем все майлбоксы
  { 
    BYTE i;
    for(i=0x00; i<0xF0; i+=0x10) {
      CANPAGE  = i;
      CANSTMOB = 0;
      CANCDMOB = 0;
    }  
  }
  
  // разрешаем прерывание на прием от майл боксов
  //  но только для полинга что бы использовать CANHPMOB
  CANGIE = 0x20;
  CANIE1=0x7F;
  CANIE2=0xFF;
  
}


// инициализация майл боксов
static void CanInitMailBoxes(void)
{
// инициализируем 6 майл боксов на прием extended frame

  CANPAGE=0;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;
  
  CANPAGE=0x10;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x20;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x30;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x40;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;

  CANPAGE=0x50;
  CANIDT1=??;
  CANIDT2=??;
  CANIDT3=??;
  CANIDT4=??;
  CANIDM1=??;
  CANIDM2=??;
  CANIDM3=??;
  CANIDM4=??;
  CANCDMOB=0x90;
}

// вход в рабочий режим
static void CanEnterOperatingMode(void)
{
  CANGCON=(1<<ENASTB);
  while(!(CANGSTA & (1<<ENFG)));
}




// обработчик CAN (полингом)

static void CanHandler(void)
{
  {
    BYTE Tmp;
    if (CANGSTA & (1<<BOFF)) {
      Reset(); // произошло BUS OFF
    }
    Tmp=CANHPMOB; // Проверка принятых пакетов
    if (Tmp<0xF0) {
      CANPAGE=Tmp;
      if (Tmp<0x20) RxHandler1(); // прием из майл бокса 0 или 1
      else if (Tmp<0x40) RxHandler2(); // прием из майл бокса 2 или 3
      else if (Tmp<0x60) RxHandler3(); // прием из майл бокса 4 или 5
      // удаляем пакет
      CANSTMOB=0;
      CANCDMOB=0x90;

    } else {
      // 7 ой майл бокс используем для отправки
      CANPAGE=0x60;
      if (!(CANSTMOB & (1<<TXOK))) return;
      TxHandler();
    }  
  }
}


void main(void)
{
    CanInit();
    CanInitMailBoxes();
    CanEnterOperatingMode();
      // посылаем стартовый пакет (устройство включилось)
      // примерно так (extended frame без данных)
      CANIDT1=??;
      CANIDT2=??;
      CANIDT3=??;
      CANIDT4=??;
      CANSTMOB=0;
      CANCDMOB=0x50;

    while(1) {
      CanHandler();
    }

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока изучаю, ещё не компилировал. После обдумывания ситуации и изучения просторов интернета я понял, что ясного представления о "CAN" в терминах модели OSI у меня нет. Точнее - то я вижу это как UART, то как RS-232, то как modbus over serial (надюсь, что аналогия понятна: mailbox - это уже больше UART, поскольку это обработка; арбитраж мастеров по приоритету - тоже часть функций более высокого уровня; перепосылка... А обработка количества ошибок и отключение от линии- вообще неясно кем выполняется.).

 

По сути, для моих приложений оказалось достаточно ("можно втиснуть") MODBUS/RS-485 @ 0.5MBit.

На такой скорости вполне можно обойтись мастером и дополнительной линией синхронизации начала выполнения инструкции, переданной через MODBUS (если стартовый пакет не дойдёт до одного из slave, будет катастрофа).

 

В данном исходнике я вижу нечто подобное уровню физической сети + часть гарантированной доставки сообщения. Более высокий уровень надо мастерить руками и продвинутая версия будет называться DeviceNET, CANOpen e.t.c? При этом я так и не нашёл ни одного исходника "бесплатного" типа. Если посмотреть в форум (недавно начатая ветка про программы/библиотеки IAR C), можно увидеть характерное количество скачиваний файлов типа twi.c, lcd.c, timer.c e.t.c. Можно ли попробовать совместно с Вами написать что-то подобное (или просить Вас выложить более прилизанный каркас?) - т.е. готовое приложение "скомпилировал-залил в две CAN128-на правом жмём кнопочку-левый отвечает помаргиванием".

 

 

PS Ответа от slavna.ru с предложением о покупке их адаптера USB-CAN не получил пока.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемый dormouse, Вы пишите:

PS Ответа от slavna.ru с предложением о покупке их адаптера USB-CAN не получил пока.

 

Отвечаю: запроса на покупку от Вас мы не получали.

 

На складе есть все http://www.slavna.ru/stran/devices.htm. Шлите заявку на [email protected] или непосредственно мне [email protected]

 

PS. Заканчиваем тестирование преобразователя USB-rs485 c аппаратными реализациями некоторых протоколов, в том числи и MODBUS (RTU и ASCII)

Изменено пользователем Седой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Письмо я направил на [email protected], 17 Фев 2006 16:39:00. Тогда связываемся через форум.

Мне надо получить внешний CAN (1шт, к нему очень желательно исходник на С - мне надо понять способ реальной работы с CAN, поскольку я никак не могу пробиться на начальную стадию ("когда кто-то кому-то как-то что-то передал")).

 

Иными словами я обещаю, что исходник "дальше меня" не пойдёт, не будет использоваться как часть или целое в коммерческих проектах, не будет опубликован в любом виде и что единственный способ использования - самообразование ;-)

 

В итоге я хочу купить в Москве 1 шт. USB-CAN-ext-06 с исходником (или частью исходника, отвечающей за CAN).

 

Владимир.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пока изучаю, ещё не компилировал. После обдумывания ситуации и изучения просторов интернета я понял, что ясного представления о "CAN" в терминах модели OSI у меня нет.

Два первых уровня реализованы аппаратно

http://www.can-cia.org/can/higher-layer/

На www.datamicro.ru был?

Точнее - то я вижу это как UART, то как RS-232, то как modbus over serial (надюсь, что аналогия понятна: mailbox - это уже больше UART, поскольку это обработка; арбитраж мастеров по приоритету - тоже часть функций более высокого уровня; перепосылка... А обработка количества ошибок и отключение от линии- вообще неясно кем выполняется.).

Арбитраж выполняется аппаратно, перепосылка аппаратно, контроль допустимого количества ошибок приложением пользователя, отключение от шины аппаратно, при достижении порога ошибок. При нормальной работе "отключение от шины " не требуется.

По сути, для моих приложений оказалось достаточно ("можно втиснуть") MODBUS/RS-485 @ 0.5MBit.

На такой скорости вполне можно обойтись мастером и дополнительной линией синхронизации начала выполнения инструкции, переданной через MODBUS (если стартовый пакет не дойдёт до одного из slave, будет катастрофа).

Какая катастрофа?

Каким образом собираетесь контролировать что слейв еще жив?

В данном исходнике я вижу нечто подобное уровню физической сети + часть гарантированной доставки сообщения.

Доставка гарантируется аппаратно.

Более высокий уровень надо мастерить руками и продвинутая версия будет называться DeviceNET, CANOpen e.t.c? При этом я так и не нашёл ни одного исходника "бесплатного" типа.

Ищи лучше, одну ссылку давал, вот вторая:

http://www.microcanopen.com/

Подобные ссылке копил раньше, сейчас они не работают, поэтому приходится "искать" их текущее местоположение...

 

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

 

В CAN самое важное понять принцип арбитража и фильтрации по ID, и как можно больше пользоваться этими возможностями при реализации обмена между абонентами. ID это не только номер абонента, в нем можно выделить поля параметров, приоритетов и т.п.

Если посмотреть в форум (недавно начатая ветка про программы/библиотеки IAR C), можно увидеть характерное количество скачиваний файлов типа twi.c, lcd.c, timer.c e.t.c. Можно ли попробовать совместно с Вами написать что-то подобное (или просить Вас выложить более прилизанный каркас?) - т.е. готовое приложение "скомпилировал-залил в две CAN128-на правом жмём кнопочку-левый отвечает помаргиванием".

Пример уже привели, на его основе уже можно сделать такую поделку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отлично. Почти собрал этот исходник. Осталось только немного разобраться с CANIDT? . Надеюсь, что скоро заработает. Критической ситуацией с подтверждениями я хотел обозначить следующее:

Предположим, надо добиться синхронного начала работы N слейвов. Мастер последовательно настроил их, после этого должен дать инструкцию "старт". Если пользоваться modbus, то вариантов два (с дополнительной линией и без).

1. С дополнительной линией: выставляем на ней сильный ноль - все клиенты стартовали. Так же в неожиданный момент времени любой клиент самостоятельно выставляет ноль на линии => все замирают и мастер начинает последовательно перебирать слейвов, чтобы разобраться, что случилось.

 

2. Мастер всем синхронирнизовал часы, после чего шлёт первому инструкцию стартовать через deltaTn. Получает подтверждение, шлёт второму deltaT(n-1) и т.д. В итоге, если на каком -то слейве произошёл сбой, то мастер шлёт броадкаст, что надо отложить старт на 1 попытку связи.

 

Проблема в том, что для паранои это сообщение само может быть не получено одним из слейвов и он начнёт работать не в нужное время.

 

До сих пор не смог внятно понять, как реализуется подверждения приёма всеми узлами броадкаста в CAN шине.

 

Жду ответа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

До сих пор не смог внятно понять, как реализуется подверждения приёма всеми узлами броадкаста в CAN шине.

 

Жду ответа.

 

Совет один, прочитать спецификацию CAN, она открытая и в общем то понятная. В сети встречаются даже переведенные на русский язык спецификации, если не ошибаюсь, есть на www.datamicro.ru (эту ссылку уже давали выше). Уточняющие вопросы задать здесь.

Желание заниматься преподавательской деятельностью есть далеко не у всех.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При начале работы я использовал CAN примерно так:

 

...............
      CANPAGE=0x60;
      if (!(CANSTMOB & (1<<TXOK))) return;
      TxHandler();

...............

 

А TxHandler() что делает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в том, что для паранои это сообщение само может быть не получено одним из слейвов и он начнёт работать не в нужное время.

 

Такой ситуации просто неможет быть если все устройства сети настроены соответствующим образом(т.е работают на одной скорости и неотпинают пакет своим фильтром).Когда на линии выставляется любое состояние его принимают абсолютно все узлы.

 

Если существует проблема синхронизации действий разных узлов она предусмотрена в высокоуровневых протоколах(например в CANOpen есть пакет под названием SYNC имеющий высокий приоритет).

 

Вобще воспринимать интерфейс CAN в отрыве от конкретного протокола очень странно.А придумывать свой долго и нецелесообразно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...