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

Zynq 7000 CAN PS повторы сообщения

Всем доброго дня.

Запустил CAN контроллер из примера ксайлинкса, изменил только битрейт и режим - normal вместо loopback.

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

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

Можно как-то контролировать количество повторов сообщения? Нигде не нашел в документации.

 

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


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

12 hours ago, alexPec said:

CAN контроллер из примера ксайлинкса

Сразу предупрежу, что слово "ксайлинкс" я не знаю, зато имею кой-какой опыт общения с CAN в МК.

12 hours ago, alexPec said:

контроллер постоянно повторяет его (видимо не видит подтверждения)

Да, именно так.

12 hours ago, alexPec said:

FIFO забивается, а контроллер так и пытается отправить, как я понял, первое сообщение.

Да, так всё и работает. Параллельно должны расти счётчики ошибок, и устройство затыкается. Есть, правда, вариант, что после таймаута оно подключается обратно. Реализован ли механизм в вашем примере, я не знаю (см. начало сообщения).

 

12 hours ago, alexPec said:

одно из устройств (не подает признаков жизни, питание на нем пропало и т.д.), то

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

Единственная серьезная пакость - это рассогласование скоростей. Вот там действительно на шине что-то непотребное творится...

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


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

10 часов назад, esaulenka сказал:
23 часа назад, alexPec сказал:

одно из устройств (не подает признаков жизни, питание на нем пропало и т.д.), то

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

Единственная серьезная пакость - это рассогласование скоростей. Вот там действительно на шине что-то непотребное творится...

Тут подробнее. Оно то сидит себе тихо, а сообщение, которое оно должно принять, так и будет передающим контроллером долбиться постоянно и блокировать другие сообщения в передающем контроллере?

 

Цитата

Да, так всё и работает. Параллельно должны расти счётчики ошибок, и устройство затыкается. Есть, правда, вариант, что после таймаута оно подключается обратно. Реализован ли механизм в вашем примере, я не знаю (см. начало сообщения).

Видимо так и есть, вижу осциллом пачки на выходе CAN, которые повторяются через 1-2мс.

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


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

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

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


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

1 hour ago, alexPec said:

Тут подробнее. Оно то сидит себе тихо, а сообщение, которое оно должно принять, так и будет передающим контроллером долбиться постоянно и блокировать другие сообщения в передающем контроллере?

Чуток не так. ACK - это не подтверждение приёма тем узлом, которому сообщение предназначено. ACK одновременно выставляют все узлы, которые приняли это сообщение.

Соответственно, если на шине больше одного корректно работающего узла, все сообщения получат свои ack'и. Но, с другой стороны, если вам нужно знать, что сообщение принял именно ваш приёмник, а не какой-то другой, придётся делать какой-то протокол поверх этого.

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


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

1 минуту назад, esaulenka сказал:

Чуток не так. ACK - это не подтверждение приёма тем узлом, которому сообщение предназначено. ACK одновременно выставляют все узлы, которые приняли это сообщение.

Соответственно, если на шине больше одного корректно работающего узла, все сообщения получат свои ack'и. Но, с другой стороны, если вам нужно знать, что сообщение принял именно ваш приёмник, а не какой-то другой, придётся делать какой-то протокол поверх этого.

Теперь понятно, спасибо за разъяснение.

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


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

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

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

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

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

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

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

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

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

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