kincajou: (Default)
[personal profile] kincajou
00: 00 00 00 00 00 00 00 00 00 00 00 00 3C 05 40 45  ................
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 45  ................
20: 00 00 00 00 00 00 00 00 02 62 02 BF 00 00 40 45  ................
30: 00 5A 20 54 02 4F 50 41 54 54 45 52 4E 31 40 45  ......PATTERN1..
40: 00 A5 20 03 04 07 2D 2D 50 69 50 41 54 54 40 45  ......--PiPATT..
50: 00 A5 40 05 06 0B 53 65 6C 66 54 65 73 74 40 45  ......SelfTest..
60: 06 69 A8 0A 4E 3B 51 E2 6E CE 3D FA E4 4C 40 45  ................
70: 00 92 10 7E 7D 59 B8 E3 63 3B D6 95 73 95 40 45  ................


Я офигеваю ваще. Эта гадская чипуха умудряется портить записанные в неё данные сразу же после записи! Дамп выше - это её память, считанная прямо после процедуры инициализации.

Выделил справа те символы, которые должны быть такими:
PATTERN1
--Ping--
SelfTest


Как видим, вторая строчка поломалась (похоже, что на неё как-то наслоился фрагмент первой).
Кроме того, первые три строки, почти полностью занятые нулями, должны быть заполнены совсем не ими, а специфическими константами, которые я туда токашо записал. Где они?

Ну и какого ваще это всё?! разобрался кое-как, на уровне шаманизма. Но старая проблема осталась:
1) Узел А кладёт в свой TX буфер сформированный кадр №1 и начинает передачу
2) *что-то происходит* и узел А решает, что надо повторить передачу кадра - и он повторяет, повторяет, повторяет...
3) Если посмотреть в RX буфер узла Б, то в нём пока ничего нет (кроме мусора, оставшегося после power-on)
3) Узел Б, ничего не "подозревая" о происходящем на шине (а там продолжает колбаситься узел А), готовит свой кадр №2 и начинает передачу. В этот момент он внезапно принимает кадр №1 - удивлению его нет границ. Кадр помещается в буфер, генерится прерывание и - о, чудо! - процессор узла Б наконец-то получает долгожданные данные от узла А. А узел А, в свою очередь, наконец-то успокаивается. 4) ...и получает кадр №2 от узла Б.

Ergo до тех пор, пока удалённый узел не вышлет какой-то пакет данных (любой), передающая сторона будет повторять передачу, ровным слоем насрав на то, что подтверждение ДОЛЖНО генерироваться железом сугубо автоматически - этот процесс программисту абсолютно неподконтролен.

Казалось бы - ну и хер бы с ним, раз так ндао высылать ответный кадр, будем высылать... Но! А как мы узнаем, что это надо сделать? В буфере ничего нет, прерывания тоже нет - момент этот угадывать, что ли? Потому что если попытаться просто так выслать кадр, в какой-нибудь отвлечённый момент, то ситуация повторится для узла Б точно так же.

Короче говоря, трансиверы MCP2515 ведут себя НЕНОРМАЛЬНО и возможно триварианта:
1) либо в даташите что-то умалчивается, а я не знаю. И программы, соотв., получаются нефункциональными
2) либо это бракованная партия, которая просто глючит
3) либо я шизофреник и мне всё это кажется.

Склоняюсь к третьему варианту...


Upd зарубежный товарищ столкнулся с подозрительно похожей проблемой. Но у меня хотя бы дифференциальный сигнал на магистрали есть: when the CAN Tx error counter TEC gets stuck at 128 decimal and you have never ending CAN Tx automatic retries, it means the only error is no ACK response

Date: 2008-07-01 01:43 pm (UTC)
From: [identity profile] potan.livejournal.com
Мы как-то целый день пытались записать в полукилобайткую епромину 4K. И очень удивлялись, что какая-то херня от туда читается. :-)
Может микросхема битая или задержки при записи слишком маленькие?

Date: 2008-07-01 01:55 pm (UTC)
From: [identity profile] kincajou.livejournal.com
Пишется всё в ейную SRAM, это практически мгновенный процесс (быстрее транзакции по SPI,это уж точно). Микросхемы новые. Несколько плат одинаково себя ведут.

Причём, похоже, я нашёл то ли глюк ЦПУ, то ли компилятор козлит - когда размер кода превышает какой-то порог (но НЕ объём флэшки, там ещё есть место), то процессор вообще не стартует или начинает исполнение программы со случайного адреса

О_о

Date: 2008-07-01 01:58 pm (UTC)
From: [identity profile] kincajou.livejournal.com
я чувствую себя опустившимся идиотом, не способным справиться с одной маленькой микросхемой :(

Date: 2008-07-01 02:17 pm (UTC)
From: [identity profile] ermiak.livejournal.com
Сбой при кодировке/передаче? Скорость интерфейса? Гремлин-эффект?

Date: 2008-07-01 02:20 pm (UTC)
From: [identity profile] ermiak.livejournal.com
Вдогонку: глюки каждый раз разные?

Date: 2008-07-01 02:35 pm (UTC)
From: [identity profile] kincajou.livejournal.com
я уже и не знаю, что с этим делать. Я кое-где ужал программу, перекрываться строчки перестали (видимо, всё-таки компилер интересно себя вёл).

Но предыдущий глюк с генерацией прерываний остался

Date: 2008-07-01 02:43 pm (UTC)
From: [identity profile] ermiak.livejournal.com
[перечитал пост]Каких прерываний?

Date: 2008-07-01 03:17 pm (UTC)
From: [identity profile] kincajou.livejournal.com
это не первый пост :)
Проблема основная - не генерятся прерывания о приёме данных. И, как показывает вскрытие, они вообще не принимаются, пока что-нибудь не попытаешься выслать наружу

Date: 2008-07-01 03:32 pm (UTC)
From: [identity profile] kincajou.livejournal.com
http://kincajou.livejournal.com/1220837.html

Date: 2008-07-01 03:55 pm (UTC)
From: [identity profile] ermiak.livejournal.com
В RXB0 в самом деле падает то, что я отослал, но не всё. Идентификатор верный, поле DLC заполнено верно, счётчик ошибок приёма равен нулю, но при этом байты данных принимаются не все (т.е. часть из них может быть искорёжена, а часть верна)
Это, а "физика" _точно_ правильная? Линия; уровни сигналов, их форма; нет ли расхождения по частотам (не уплывает ли синхронизация между контроллерами); нет ли расхождения по скоростям приема-передачи (иногда это не проверяется на аппаратном уровне; тогда сигнал "старт" окажется незамеченным) и все такое?

Date: 2008-07-01 04:03 pm (UTC)
From: [identity profile] kincajou.livejournal.com
этих эффектов точно нет. Длина линии меньше 30 см, все терминаторы на месте, тактовые генераторы из одной партии (в даташите на идвайс указано, что расхождение может быть до 1.7% - если устройство поймало стартовый бит, то дальше оно засинхронизируется само). В общем, я не знаю, что делать.

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

Date: 2008-07-02 10:02 am (UTC)
From: [identity profile] ermiak.livejournal.com
А нет ли в этих контроллерах случаем приоритетов типа "ведущий-ведомый"? Когда ведомый имеет право передать информацию только после разрешения ведущего? А в остальное время вход закрыт?

Вдогонку: а в других режимах эта самая связь работает?

Date: 2008-07-02 11:21 am (UTC)
From: [identity profile] kincajou.livejournal.com
Сама сеть CAN равноправна, ведущих или ведомых устройств нет. Есть арбитраж, но он тут не причём.
Разделение на ведущих/ведомых может быть на более высоком уровне, но в данной ситуации их точно нет.

В режиме Loopback работает, естественно. А в других режимах не пробовал (ещё есть sleep, в котором вообще всё вырублено, и listen-only, когда дивайс слушает шину, но ничего не передаёт)

December 2016

S M T W T F S
    123
45678910
11121314151617
18192021222324
25 262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 7th, 2026 02:01 am
Powered by Dreamwidth Studios