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

Ошибки при обмене по протоколу CAN 2.0B в многопроцессорной системе

Здравствуйте!

На этом форуме я новичок, поэтому прошу прощения, если разместил вопрос не в том топике.

 

Ситуация следующая - есть многопроцессорная система (на базе процессоров семейства ST10), обмен данными между ними ведется по протоколу CAN 2.0B.

 

Каждый процессор выдает через КАН информаци, необходимую для расчетов другому. Выдача настроена на частоту 100Гц (выставление данных на шину КАН производится по прерыванию от таймера).

 

Другие процессора сравнивают принятые значения с измеренными ими самими и производят вычисления.

 

Проблема в том, что наблюдается потеря кадров при выдаче по шине при работе нескольких микропроцессоров одновременно. Второй процессор ведет счетчик обновления данных от первого (к примеру) и наблюдает потери (для теста МК1 выдает инкрементирующийся каждые 100Гц счетчик циклов, второй обрабатывает его прием с частотой 800Гц - второй процессор наблюдает в итоге "разрывы" по пришедшему счетчику - приходят значения 1000, 1001, 1002, 1003, 1005, 1006 - пропущено 1004).

 

Если включен только один передатчик(передача вдется только с одного из МК - потерь фактически не наблюдается). Если на шину выдает два передатчика - идут потери.

 

Обьясните пожалуйста чайнику, вследствие чего могут возникать потери при приеме\передаче по CAN 2.0B?

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


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

UP!

можно долго апать, но это дело не сдвинет с места.

Ваш вариант описания ситуации мало что говорит.

По всей видимости дело в программе или в протоколе, который вы пытаетесь огранизовать.

Каким образом распределены ID CAN-сообщений по устройствам?

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


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

можно долго апать, но это дело не сдвинет с места.

Ваш вариант описания ситуации мало что говорит.

По всей видимости дело в программе или в протоколе, который вы пытаетесь огранизовать.

Каким образом распределены ID CAN-сообщений по устройствам?

Прошу прощения, апнул исключительно от безысходности:).

 

Описывать весь алгоритм слишком долго, возможно кто либо еще сталкивался с ошибками в CAN'e иил есть причины для наиболее часто встречаемых багов (в этой теме я новичок - но тема то как раз для новичков:)).

 

Используется расширенный формат кадров (29 бит). В ОЗУ каждого процесора содержатся одинаковые таблицы с описанием кадров (номер кадра, что заполняется в поля данных кадра и прочее).

11 бит идентификатора определяют номер строки в этой таблице (определяют уникальность идентификатора кадра), распределение по процессорам ведется по этому номеру - т.е. МК1 выдает кадры например от 0 до 50, МК2 - от 51 до 100 и тп.

Остальные биты могут быть не уникальными, но в целом ситуация, когда 2 процессора пытаются выдать кадр с одним идентификаторам невозможна (проверял, хотя учитывая, что я чайник может быть что то прозевал)

 

Процедуры чтения/записи написаны по алгоритму, указанному в документации на процессор (блок схема), так что логически в этом ошибки быть не должно.

Из 15 обьектов CAN контроллера CAN процессора обьект №15 используется для приема (он буферизированный), обьекты 0-7 - для передачи.

 

Процессоры могут стартовать асинхронно, выдачу кадров осуществляют (всех, которые предназначены к выдаче с этого МК) с частотой 100 Гц. Тесты показали, что контроллер успевает выставить все данные на шину до наступления следующего цикла.

 

Перегрузки на шине тоже не наблюдается, сокращали поток выдачи до 1 кадра с частотой 100Гц - количество пропусков снизилось, но осталось на высоком и неприемлимом уровне.

 

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

Изменено пользователем Fledgling

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


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

вследствие чего могут возникать потери при приеме\передаче по CAN 2.0B?

А частота у генераторов достаточно одинаковая ?

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


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

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

И не нужно...

Вот тот скажите лучше ... тот контроллер, который передавал потерянное сообщение - сколько попыток передачи этого сообщения он сделал?

Ах, не знаете ....

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


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

И не нужно...

Вот тот скажите лучше ... тот контроллер, который передавал потерянное сообщение - сколько попыток передачи этого сообщения он сделал?

Ах, не знаете ....

Однократная попытка передачи.

При следующем обращении к CAN обьекту, который передевал кадр проверяется только освободился он или нет.

Вот как раз вопрос в том, можно ли получить подтверждение принятия кадра несколькими приемниками и необходимо ли повторять передачу (по идее CAN считается защищенным от ошибок протоколом?).

А частота у генераторов достаточно одинаковая ?

 

Частота по идее абсолютно одинаковая

Изменено пользователем Fledgling

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


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

У вас восемь каналов у каждого узла сконфигурированы как передатчики, используется ли реально более одного для отправки сообщений?

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


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

У вас восемь каналов у каждого узла сконфигурированы как передатчики, используется ли реально более одного для отправки сообщений?

Практически не проверялось.

При срабатывании в основном канале функции (моей) SendFrame кадр ставится в очередь (стек FIFO).

Очередь орбрабатывается при каждом вызове SendFrame, процедура обработки циклически проверяет CAN обьекты 0-7, являются ли они свободными, если да - кадр из очереди ставится на передачу в этот обьект.

Теоретически вероятна ситуация когда в очереди всегда 1 кадр (при малой нагрузке) и для передачи используется только обьект 0. В данном случае он просто справляется со всем потоком.

Однако даже в таком случае упомянутые в первом сообщении ошибки остаются.

 

P.S.: Нагрузка на контроллер CAN может менятся в процессе разработки ПО устройства, поэтому количество CAN обьектов-передатчиков возможно взято "с запасом". Чтобы люди, занимающиеся разработкой функциональных алгоритмов, не заморачивали себя вопросами обмена по CAN.

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


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

Перегрузки на шине тоже не наблюдается, сокращали поток выдачи до 1 кадра с частотой 100Гц - количество пропусков снизилось, но осталось на высоком и неприемлимом уровне.

Перегрузка легко считается.

Какая скорость используется?

Сколько байт данных в сообщении?

Какие драйвера применены?

Какие расстояния?

Терминаторы на месте?

Контролируете ошибки в контроллере CAN?

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


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

... Однократная попытка передачи...

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

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


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

Очередь орбрабатывается при каждом вызове SendFrame, процедура обработки циклически проверяет CAN обьекты 0-7, являются ли они свободными, если да - кадр из очереди ставится на передачу в этот обьект.

Если соотношение тактовой частоты контроллера и шины большое, возможна ситуация, когда при последовательной отправке двух и более сообщений один канал начнет передачу первого сообщения, а флаг занятости передатчика (либо канала) будет выставлен позднее, чем будет выполнена его проверка для возможности передачи второго сообщения. В итоге пойдет запись второго пакета в тот-же канал, он будет частично переписан, т.е. комбинация двух сообщений (CRC будет верна). Сообщение м.б. отфильтровано приемником (если это выполняется по каким-либо признакам), т.е. получится пропуск.

Вообще причину легко будет понять, если проанализировать статусные регистры can-контроллера после каждой отправки/получения.

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


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

Вот как раз вопрос в том, можно ли получить подтверждение принятия кадра несколькими приемниками и необходимо ли повторять передачу (по идее CAN считается защищенным от ошибок протоколом

В CAN сообщение считается переданным только тогда, когда все "сказали" что все до них дошло без ошибок.

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


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

...а флаг занятости передатчика (либо канала) будет выставлен позднее, ...

Здесь говорилось про "проверяет CAN обьекты 0-7" - до передатчика еще далеко, не то.

 

 

В CAN сообщение считается переданным только тогда, когда все "сказали" что все до них дошло без ошибок.

!!!!!!!!!!!!!! Не _все_, а _хоть один_ кто-то !!!!

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


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

В CAN сообщение считается переданным только тогда, когда все "сказали" что все до них дошло без ошибок.

Для передатчика достаточно, чтобы хотя-бы один узел сказал "да" (поставил доминанту в слот подтверждения).

 

upd.

ответ синхронно про одно и то-же :)

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


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

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

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

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

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

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

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

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

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

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