Выяснилось, что скорость CAN-порта на i.mx53 с предустановленным образом системы не соответствует установкам. При установке 10 кбит/с реальная скорость оказывается 27.8 кбит/с (по осциллографу). В общем, при любых значениях скорость оказывается ровно в 2.78 раза больше заявленной.
ip -d link show can0 показывает, что clock=24 МГц.
В принципе, ошибка не смертельная, можно пока просто скорость скорректировать.
Попробую, когда хотя бы приблизительно пойму, как это сделать.
Тут еще одна неприятная история с CANом: на более-менее высоких скоростях (где-то за 200 кбит/с) работать невозможно из-за неприлично плавных фронтов на выходе драйвера. В качестве примера осциллограмма сигнала CANH-CANL на 500 кбит/с:
Смотрел даташит на драйвер MAX3051. За плавность фронтов отвечает резистор R12, который выбран 11К, хотя в документации рекомендуется 25-200К. Но это сути не меняет, я пробовал замыкать этот резистор, что в теории должно дать максимальную скорость. Но фронты вообще никак при этом не меняются.
Отправляйте, выставим счет за ликбез.
Дифференциальные сигналы так не смотрят, а если и смотрят, то как минимум математикой по двум каналам ...
Не работает же по той причине, что Вы уже выяснили - неправильное вычисление битрейта в драйвере.
Позже попробуем выяснить причину.
И как же их смотрят? Напишите, я перемеряю.
Ошибка со скоростью CANа в этом эксперименте была учтена. Смотрите на время горизонтальной развертки осциллограммы.
UPD: извиняюсь, это действительно моя вина. Не заметил, что крокодил от осциллографа был присоединен к земле, а не к CANL, хотя я собирался как раз измерять сигнал на резисторе.
В общем, при любых значениях скорость оказывается ровно в 2.78 раза больше заявленной.
Ошибка в схеме тактирования у Freescale. Чтобы исправить, допишите переключение референсной частоты для контроллеров FlexCAN в файле arch/arm/mach-mx5/clock.c перед SSI
int __init mx53_clocks_init(unsigned long ckil, unsigned long osc, unsigned long ckih1, unsigned long ckih2)
{
.......
/* starterkit */
clk_set_parent(&can1_clk[0], &lp_apm_clk);
clk_set_parent(&can2_clk[0], &lp_apm_clk);
/* Move SSI clocks to SSI_LP_APM clock */
clk_set_parent(&ssi_lp_apm_clk, &lp_apm_clk);
только не перепутайте - там есть аналогичная ф-ция для imx51, нам нужен imx53. Откатывать на родной драйвер Freescale НЕ НАДО - он глючный, оставляйте в ядре и в юзерспейс при поднятии интерфейсов все как есть в BSP стартеркит, только эти строчки допишите
Вернее сказать ошибка не в схеме, а в том что после сброса FleaxCAN тактируется с ipg 66 МГц, а переключение на lp_apm 24 МГц они сделать забыли. В результате clk_get_rate показывает 24 МГц (как и должно быть) а реально частота 66 МГц. 24 МГц лучше подходит для CAN - все стандартные битрейты получаются без ошибки.
Ошибка в схеме тактирования у Freescale. Чтобы исправить, допишите переключение референсной частоты для контроллеров FlexCAN в файле arch/arm/mach-mx5/clock.c перед SSI
А что потом? Запустить заново buildroot, чтобы он все пересобрал?