имеется плата на базе TI AM3517. Обнаружилась весьма странная проблема с работой шины CAN на скорости 10k. На всех остальных стандартных скоростях (20k - 1M) никаких проблем нет.
Проблема заключается в следующем: похоже, что некорректно работает bit-stuffing (вставки дополнительного бита противоположного значения для автосинхронизации потока) при передаче более четырех нулей подряд. Вставляемый единичный бит имеет недостаточную длительность и в результате чего вся посылка прерывается по ошибке на линии. При передаче более четырех единиц, когда тоже необходим bit-stuffing ) таких проблем нет.
Все осциллограммы сняты для скорости 10k и отличаются лишь передаваемыми данными
1) Передаем пакет, в котором нет длительных посылок из одинаковых бит и поэтому нет необходимости в дополнительных битах синхронизации. Пакет успешно принимается.
Нажмите для просмотра прикрепленного файла
2) Передаем пакет, в котором передается пять единиц, и вставляется дополнительный нулевой бит синхронизации. Длительность пяти единиц корректная - 500 мкс. В этом случае пакет также передается успешно.
Код
$ cansend can0 -i 0x23F -v 0xA5 0xA5 0x55 0x55
Нажмите для просмотра прикрепленного файла
3) Передаем пакет, в котором передается пять нулей, и вставляется дополнительный единичный бит синхронизации. Длительность пяти нулей в этом случае почему-то получается некорректной (460 мкс вместо 500 мкс). В этом случае передача сразу прерывается, после этого осуществляется повторная передача, которая также обрывается.
Код
$ cansend can0 -i 0x2A0 -v 0xA5 0xA5 0x55 0x55
Нажмите для просмотра прикрепленного файла
4) Избежать обрыва передачи можно, если сместить sample point ближе к началу импульса с 0.85 to 0.6. Тогда весь пакет отправляется. Однако пять нулевых битов все равно имеют неправильную длительность 460 мкс, и поэтому этот битый пакет не принимается другой стороной.
Нажмите для просмотра прикрепленного файла
.