Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI интерфейс мк-мк, но как устроен протокол?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Alexeus
Введение: Разбираюсь с системой климат контроля автомобиля. Подцепился осциллографом (ну как осциллографом... звуковой картой smile.gif ) между СПИ интерфейсом двух МК. Один в режиме мастера передает второму, тот интерпретирует данные и отдает короче дальше, пусть на ЖК экран... Когда разберусь, планирую на МК AVR сделать подмену ведомого, так нужно... smile.gif

Описание: Данные передаются в пакете. пакет состоит из 6 посылок по 8 бит. Не все 8 бит используются под перенос данных, а, например первая посылка имеет вид "1ххх1ххх" где ххх- биты данных, 1 вначале и 1 посередине я так понимаю используется для контроля и распознавания вторым мк, что это посылка с информацией о скорости и положении заслонки вентилятора, за этой посылкой следуют еще 5 штук, у них соответственно другие биты неизменны, они несут информацию о температуре и др. (я еще не разобрался какие именно не меняются, пока анализирую), в последней посылке (шестой) первый бит неизменный "0"ххххххх -"х" я так и не понял к чему, так как все необходимые данные передаются в первых 5 посылках, но они меняются.

Непонятки: Может подскажете, каким образом второй мк узнает, что это посылка с инф. о скорости вентилятора, вторая о температуре и т.п. казалось бы, первая посылка имеет маску 1ххх1ххх, но и вторая может принять такой же вид, например при температуре 25 градусов, абстрактно: 10011101 - маска 1ххх1ххх та же, но посылка то вторая, а не первая, таким же образом и следующие посылки могут принимать вид предыдущих. Напомню что всего в пакете 6 посылок и последняя не поддается интерпретированию (я еще не допетрил что она несет, так как все что нужно передается в первых 5ти посылках)

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

Вопрос: Как 6 посылок собираются в один пакет во втором МК? (ведь мк должен сохранить 5 посылок, затем получить 6ю и сравнить, все ли правильно, являются ли те посылки, что он принял действительными и не содержащими ошибок)

ЗЫ: Сорри, картинки одинаковыя, не ищите отличия. так получилось... как удалить не найду.

Модератор. Удалил лишнюю (вторую).
Палыч
Цитата(Alexeus @ Jan 14 2009, 15:16) *
Непонятки: Может подскажете, каким образом второй мк узнает, что это посылка с инф. о скорости вентилятора, вторая о температуре и т.п. казалось бы, первая посылка имеет маску 1ххх1ххх, но и вторая может принять такой же вид...
По счету, т.е. по номеру байта в пакете... Чтобы не было рассинхронизации, обычно "дрыгают" ногой SS (Slave Select, ещё может называться "Выбор микросхемы"): при выборе слейва счетчик байт пакета, обычно, сбрасывается, и пакет передаётся с первого байта...
Цитата(Alexeus @ Jan 14 2009, 15:16) *
Вопрос: Как 6 посылок собираются в один пакет во втором МК? (ведь мк должен сохранить 5 посылок, затем получить 6ю и сравнить, все ли правильно, являются ли те посылки, что он принял действительными и не содержащими ошибок)
Собственно ответ - в Вашем вопросе: наверное, так и делается.
Alexeus
Цитата(Палыч @ Jan 14 2009, 15:52) *
По счету, т.е. по номеру байта в пакете... Чтобы не было рассинхронизации, обычно "дрыгают" ногой SS (Slave Select, ещё может называться "Выбор микросхемы"): при выборе слейва счетчик байт пакета, обычно, сбрасывается, и пакет передаётся с первого байта...


Да вот похоже что не дергает ss, я переключал режим и момент перехода был четким- т.е. заканчивался один пакет и только тогда начинался начинался другой. Разрывов пакета я пока не наблюдал... (но не факт что их не бывает)

Вот может мне кто помочь проанализировать пакеты:
1 2 3 4 5 6
1 пакет: 00101001 00010000 00010010 01001101 00000000 11101000
2 пакет: 00111001 00010000 00010010 01001101 00000000 11011000
3 пакет: 00101001 00010000 00010010 01000101 00000000 11110000
(похоже что передается младшим битом вперед)

тут меняются биты первой посылки, и последней. Первая посылка- реальная информация дисплея, последняя посылка ничему не соответствует, но изменяется. 2,3,4,5 посылки так же несут полезную информацию на дисплей.

Является ли последняя посылка контрольной суммой предыдущих пяти или осуществляет выборку только пары-тройки постоянных бит из пяти посылок и отображает их контрольную сумму?
Cyber_RAT
а какая собственно машина? и какой там протокол? а то из осциллографных посылок тяжеловато будет (ведь может быть и kwp1281 kw2000 и CAN)...
Alexeus
Цитата(Cyber_RAT @ Jan 15 2009, 10:28) *
а какая собственно машина? и какой там протокол? а то из осциллографных посылок тяжеловато будет (ведь может быть и kwp1281 kw2000 и CAN)...


Машина тут совсем ни при чем, да, на машине есть CAN шина, но сейчас не о ней, т.к. то, что я описал и изобразил выше, передается чисто по SPI интерфейсу между двумя микроконтроллерами NEC. Есть еще третий мк, он забирает со второго и как раз направляет в шину CAN, но это я опять увожу в сторону, хотелось бы пока сосредоточиться на МК<-SPI->МК Вот этот пакет я и хочу разобрать. Пока никак не дается последняя 6я посылка, видимо контрольная сумма, но из каких битов она складывается, подразумеваю, что не из всех...

.......................

Сейчас провел еще эксперименты, пока вырисовывается, что и в 6й посылке есть не меняющийся бит. Маска не меняющихся битов пока такова:
(Вроде я перепробовал уже всевозможные комбинации режимов климат контроля, так что эта маска в достаточной степени полна и достоверна)

0xxx1xxx 0xx1xx0x 0x0xxxxx 0xxxxx0x 00xxxxxx 1xxxxxxx

ну а в шестой посылке может какие нть коды самодиагностики находятся, никто не работал с похожими системами?
видимо МК получает все 6 посылок и потом сравнивает с одной конкретной контрольной суммой именно по этим битам, в таком раскладе она ведь всегда будет неизменна...
Alexeus
Циклично передается пакет с информацией из 48 бит (6 байт), в каждом байте есть неизменные биты. Как сделать проверку по контрольной сумме??? Подскажите кто в ассемблере программирует, ну от остальных примеров не откажусь...

"х"- полезная информация

маска такая: 0xxx1xxx 0xx1xx0x 0x0xxxxx 0xxxxx0x 00xxxxxx 1xxxxxxx -эти биты всегда неизменны.

ЗЫ: это посылает промышленный прибор, мне нужно подцепиться своим мк (мега8) к его spi интерфейсу и принимая эту цепочку байт выделять именно такой пакет из 6 байт.
Палыч
Поскольку последовательность - циклическая, то я бы не утверждал категорично, что информация передаётся именно в такой последовательности! Даже - более: логично предположить, что байт с единицей вначале (у Вас - это шестой) и является первым. В случае рассинхранизации на передающей и приёмной сторонах по этому биту легко определить начало пакета.
Alexandr
В любом случае придется слушать линию и ждать байт 0xxx1xxx. Все принятые байты домножать (and) на 10001000 и сравнивать результат (xor) с числом 00001000. А дальше принимаем еще 5 байт, домножаем каждый (and) на свою маску 10010010 и т.д. И далее попарно складываем (xor) все 6 чисел. Если на выходе число 10011000, то это нужные Вам 6 байт
Alexeus
Цитата(Палыч @ Jan 15 2009, 13:21) *
Поскольку последовательность - циклическая, то я бы не утверждал категорично, что информация передаётся именно в такой последовательности! Даже - более: логично предположить, что байт с единицей вначале (у Вас - это шестой) и является первым. В случае рассинхранизации на передающей и приёмной сторонах по этому биту легко определить начало пакета.



Пакет содержит именно такую последовательность и начинается именно так. Записано в звуковой файл и визуально проверялось во множестве режимов.
Палыч
Цитата(Alexeus @ Jan 14 2009, 16:30) *
Является ли последняя посылка контрольной суммой предыдущих пяти или осуществляет выборку только пары-тройки постоянных бит из пяти посылок и отображает их контрольную сумму?
Возможно, что один из этих байтов действтельно содержит контрольную сумму. Если считать, что первый бит каждого байта - служебный (единица - то ли начало пакета, то ли - конец) и не учитывать её; при суммировании всех шести байтов (по семь оставшихся битов, считая старшим записанный слева) получаем число в младших семи битах которого - нули.
Палыч
Цитата(Alexeus @ Jan 15 2009, 12:35) *
Как сделать проверку по контрольной сумме???
Ответил там http://electronix.ru/forum/index.php?showt...st&p=530299
Alexeus
Цитата(Alexandr @ Jan 15 2009, 13:43) *
В любом случае придется слушать линию и ждать байт 0xxx1xxx. Все принятые байты домножать (and) на 10001000 и сравнивать результат (xor) с числом 00001000. А дальше принимаем еще 5 байт, домножаем каждый (and) на свою маску 10010010 и т.д. И далее попарно складываем (xor) все 6 чисел. Если на выходе число 10011000, то это нужные Вам 6 байт


1. Александр, можно попросить вас поучить меня и расписать, почему именно на 10001000 домножаем каждый байт, почему сравниваем именно с 00001000 и в результате сравниваем с 10010010?

2. А можно как нть так сделать- например я принял 8 бит в переменную и хочу сравнить биты только 7й с "0" и только 3й с "1", если совпадают перехожу к приему следующего и проверяю его маску- только 7,4,1 биты на соответствующие значения, если не совпадает проверяю следующий бит на первую маску, и так далее перебираю пока не совпадут все шесть (практически всегда идет без помех и все шесть бит передаются нормально, т.е. такой алгоритм не должен надолго зацикливаться, а достаточно быстро построит весь пакет).
вот как мне сравнить в регистре R16=01101001, только 7й и 3й бит?
Alexeus
Цитата(Палыч @ Jan 15 2009, 14:10) *
Возможно, что один из этих байтов действтельно содержит контрольную сумму. Если считать, что первый бит каждого байта - служебный (единица - то ли начало пакета, то ли - конец) и не учитывать её; при суммировании всех шести байтов (по семь оставшихся битов, считая старшим записанный слева) получаем число в младших семи битах которого - нули.


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

и еще наблюдение: пакет идет младшим разрядом вперед. Незнаю насколько это важно, мне показалось что не очень важно, главное знать что они инверсны при производимых расчетах...
Палыч
Цитата(Alexeus @ Jan 15 2009, 14:29) *
Александр, можно попросить вас поучить меня и расписать...?
Он пытался предложить Вам алгоритм проверки корректности вашей последовательности. Но, больно сложный... Если считать, что байт с контрольной суммой идет шестым по счету в пакете и он снабжён маркером - первый (старший) бит равен единице, то всё гораздо проще:
1. Принимаем и складываем в буфер пакета байты, проверяя, что старший бит каждого байта равен 0.
2. При приёме байта с единицей в старшем бите проверяем, что в буфере пакета лежит уже 5 байт (т.е. байт контрольной суммы пришел шестым).
3. Вычисляем сумму пяти байт, лежащих в буфере пакета и прибавляем к ней байт контрольной суммы
4. Если верен п.2 и семь младших бит суммы, вычисленной в п.3 равны нулю, то пакет принят верно, и в буфере пакета лежат корректные данные - обрабатыем их, очищаем буфер и на п1.
Палыч
Цитата(Alexeus @ Jan 15 2009, 14:42) *
судя по вычисленной маске, там не только первый бит служебный, в основном пара бит служебных и даже три, в последнем, шестом один.
Поскольку, Вы не имеете описания протокола обмена, то интерпретация полученных в экспеременнте данных (как говаривает один мой знакомый) - "Всего лишь Ваше неправильное мнение" rolleyes.gif Отдельные биты пакета могут быть неиспользуемыми - тогда они заполняются нулями (всегда равны нулю); возможно, пакет "заточен" под широкий спектр систем климат-контроля, и для указания Вашей конкретной модели некоторые поля заполняются некими (не нулевыми) константами. Вот Вы поспешно и решили, что на данные пакета нужно накладывать маску, приведенную Вами выше...
Alexandr
Alexeus все достаточно просто. Так как вы предложили тоже можно сделать, но тогда придется работать с битами. Проще работать с байтами. Вы принимаете все байты подряд, но стартовый байт Вашей последовательности имеет 0 в 7-ом разряде, 1 в 3-ем. Именно эти два разряда являются для нас значимыми. Поэтому мы делаем операцию AND с маской стартового байта (10001000). Получаем байт Х000Y000, где Х и Y интересующие нас биты. При этом для нас важно чтобы Х=0, Y=1. Для этого мы делаем операцию XOR данного байта и байта 00001000. Если результат операции равен 0 - значит принятый нами байт может являеться стартовым (я исхожу из того, что в линии может идти сплошной поток данных из которого нам надо выдрать только 6 байт). Далее принимаете и подсчитывае контрольную сумму (операцией xor или есть специальнвй алгоритм?) следующих 5 байт и сравниваете с контрольной суммой, принятой последней, как и предложил Палыч. Но можно и каждый принятый байт анализировать методом описанным в начале только маски будут меняться 10010010 10100000 10000010 11000000 10000000
Alexeus
Палыч, Александр, спасибо, действительно, опираясь на ваши подсказки вычислил, что если складывать все 6 байт пакета, как раз как предложил Палыч, отлавливая последний байт по старшему биту в 1, то при сложении всех 6ти, всегда получаю 0х80 или 0b10000000 !!!

Круто smile.gif Спасибо.

/а я голову ломал, что за данные в этом 6том байте...
Палыч
Цитата(Alexeus @ Jan 15 2009, 15:52) *
всегда получаю 0х80 или 0b10000000 !!!
Подозреваю, что можно получить и просто 0.
Alexeus
Я и сам придерживаюсь такой идеологии, что если что то вычислили опираясь на свое мнение, то очень большая вероятность что большинство заключений все-равно будет не верно...

В данном случае в действительности есть стартовые биты пяти байт равные "0" и шестой равный "1" и, как подсказал Палыч, сохраняя пять байт с "0" и при поступлении шестого со стартовым битом в "1", нужно проверять их сумму (всех 6ти байт) если она равна 0х80 (0b10000000) то пакет считается принятым удачно, и из него берется информация... (пробовал суммировать на пакетах, содержащих информацию о разных режимах)

За что ему большое спасибо! smile.gif

Цитата(Палыч @ Jan 15 2009, 15:58) *
Подозреваю, что можно получить и просто 0.


Ну возможно... Все варианты я не проверял, но в тройке выборочно получил именно 10000000 или если идет младшим битом вперед, то просто еденицу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.