Здравствуйте.
Нужно связать два устройства по беспроводному каналу через SI4432. Вроде всё правильно настроил, передаю пакеты с разной длиной (указываю вручную). Приемник принимает, но с каждым пакетом устанавливается бит icrcerror (CRC Error). На обеих сторона тип CRC одинаковый. Мощность выставлена максимальная, платы лежат рядом.
Даташит курил, вроде всё правильно. Подскажите, пожалуйста, куда вообще копать, какая инфа могла бы пролить свет на проблему?
Спасибо.
Jurenja
Nov 6 2017, 17:24
Цитата(YuryD @ Nov 6 2017, 18:48)

1. Мощность выставлена максимальная.
2. платы лежат рядом.
Сочетание этих двух факторов будет вызывать проблему - перегрузку входных каскадов приемника.
Параметры приёмника гарантируются только при входной мощности не более чем +5 дБм.
А выходная мощность передатчика должна быть не менее чем +20 дБм.
Я пробовал уменьшать мощность до –1 dBм (установка 000 в регистр 0х6D), результат тот же.
Пакет то смотрели? Он реально битый или нет?
Пока Вы на максимальной мощности работали, могли и припалить приемные цепи.
А Вы их КИТ используете или самопал какой наваяли?
Я использую готовые модули. Фото в приложении. Вряд ли я что-то подпалил, т.к. начал испытывать с мощности -1дБм. При минимальной и максимальной мощности результат одинаковый - ошибка CRC. Посмотреть реально ли битый пакет пока не могу, т.к. буду возле "пациента" в четверг. Пока пытаюсь понять, что я мог не так сделать.
Я так понимаю, что CRC модуль формирует на передающей стороне, записывает в конец пакета. А на приёмной стороне другой сам модуль пересчитывает CRC и сравнивает с принятым. Т.е., по сути, я никак не участвую в этом процессе, просто выставляю "включение CRC" и "тип CRC", одинаковые на обоих сторонах. Что тут можно сделать не так?....
Slonofil
Nov 9 2017, 15:05
Цитата(YuryD @ Nov 8 2017, 17:26)

Что тут можно сделать не так?....
Форматы пакетов на передающей и приёмной стороне? Может, он считает CRC правильно, но сравнивает не с тем полем/не по тому смещению?
А как я в этом процессе участвую? Я включаю CRC, вид CRC и всё. Дальше он сам всё делает. Он сам знает куда класть CRC и откуда его читать. Я же ни где это не настраиваю.
Slonofil
Nov 10 2017, 08:15
Цитата(YuryD @ Nov 9 2017, 20:34)

А как я в этом процессе участвую? Я включаю CRC, вид CRC и всё. Дальше он сам всё делает. Он сам знает куда класть CRC и откуда его читать. Я же ни где это не настраиваю.
Эээ... Вы разработчик или наладчик? Если разработчик, то такие вопросы выглядят ересью. Вникните в суть, ознакомьтесь с механизмами, отвечающими за формирование пакета, сличите переданный и принятый пакет, в конце концов! Или Вы думаете, всё просто обязано работать только по факту того, что Вы так хотите?..
k155la3
Nov 10 2017, 10:54
Какой размер пакета ? Какой размер буфера трансивера ?
Как считается CRC - трансивером или иначе ? Если трансивером, то размер пакета должен быть не более размера евойного буфера.
(см. док, для Ti CC1101 насколько помню, не более 64 байта, кажется)
Я с Si4432 только начал разбираться, но это общее для подобных девайсов.
Курить даташит.
Цитата(YuryD @ Nov 9 2017, 21:34)

А как я в этом процессе участвую? Я включаю CRC, вид CRC и всё. Дальше он сам всё делает. Он сам знает куда класть CRC и откуда его читать. Я же ни где это не настраиваю.
Может быть 2 режима, проверьте по DS. (эта инф. по трансиверам Ti, для силабс может быть также или похоже)
Для маленьких пакетов, которые полностью ложаться в буфер трансивера, включая окноечную CRC, он (трансивер)
может быть настроен на их "самопроверку" и соответственно выставить флаг пакет битый или нет.
Для больших пакетов (больше размера буфера) прием-передача организуются по другому. Как я еще не раскуривал.
Я проверил, что приемник принимает. Принимается мусор, но всегда то же самое количество байт, что отправлено. Т.е. ошибка контрольной суммы не врёт, в принятом пакете действительно не те данные, что передавались, но, что примечательно, количество принятых байт всегда (я пробовал несколько вариантов) совпадает с длиной передаваемого пакета.
Может быть проблема в частотных настройках модулей? Функциональные настройки я проверил, вроде всё по даташиту, но я не особо разбираюсь в ВЧ, поэтому взял RF настройки из первого попавшегося в И-нете примера.
Может кто-то поделится ссылкой или примером корректной настройки модуля на частоту 434МГц?
Спасибо.
Вы там whitening не включили случайно?
Или манчестер какой нибудь..
А количество принятых байт не показатель в случае fixed packet length, он примет сколько задано и все.
Но сам факт приема говорит о том, что синхрослово принимается верно, а это уже хорошо
Возьмите второй попавшийся пример, лучше от производителя. А конфиг делайте сами через WDS
Цитата(DASM @ Nov 11 2017, 16:57)

Вы там whitening не включили случайно?
Или манчестер какой нибудь..
Не ничего такого не включено.
Цитата(DASM @ Nov 11 2017, 16:57)

А количество принятых байт не показатель в случае fixed packet length, он примет сколько задано и все.
У меня плавающая длина пакета. Я меняю на передающей стороне количество передаваемых байт, и на приемной стороне принимается аккурат столько же. Но при этом выставляется флаг error CRC. Если я выключаю CRC, то принимается чётко переданное количество байт, но там мусор, вообще ни один байт не совпадает. От приема к приему это содержимое меняется, т.е. явно шум какой-то.
Чертовщина какая-то!....
Если принимаете то же самое количество байт каждый раз, то первый байт точно верен, в нем длина и передается. Похоже что в эфир передатчик излучает обрезок от пакета. Такое может быть, например, если запустить tx, а далее по коду перевести чип в идле. Преамбулу, синхру и первый байт.. несколько уйдут, а далее в эфире тишина. Симптомы совпадут. Посмотрите что код делает после того, как дал команду передачи. Пока не сработает tx done ничего делать с чипом не надо
Кроме того, возможно ошибка в коде, переменна, длина это втрой этап. Поставьте фиксед для начала, может вы данные на отправку мусорите сами, а тут уже миллион причин может быть, в завимости от "таланта". Напишите предельно тупой код заполнения буфера передачи для начала, типа for(i=0;i<len;i++) put_si4432(i). Кстати а длину пакета в этом чипе указывают вместе с байтом самой длины и црц, или только длину payload? Тож могут быть грабли
Примеров в сети ведь полно, берите от самого Силабса, а потом портить можно как хочется уже
Corner
Nov 11 2017, 16:42
Цитата(DASM @ Nov 11 2017, 18:32)

Если принимаете то же самое количество байт каждый раз, то первый байт точно верен, в нем длина и передается. Похоже что в эфир передатчик излучает обрезок от пакета. Такое может быть, например, если запустить tx, а далее по коду перевести чип в идле. Преамбулу, синхру и первый байт.. несколько уйдут, а далее в эфире тишина. Симптомы совпадут. Посмотрите что код делает после того, как дал команду передачи. Пока не сработает tx done ничего делать с чипом не надо
Кроме того, возможно ошибка в коде, переменна, длина это втрой этап. Поставьте фиксед для начала, может вы данные на отправку мусорите сами, а тут уже миллион причин может быть, в завимости от "таланта". Напишите предельно тупой код заполнения буфера передачи для начала, типа for(i=0;i<len;i++) put_si4432(i). Кстати а длину пакета в этом чипе указывают вместе с байтом самой длины и црц, или только длину payload? Тож могут быть грабли
Примеров в сети ведь полно, берите от самого Силабса, а потом портить можно как хочется уже
Еще вариант, рядом с ТСом кто то излучает на 434 МГц. Или КИТы бракованные. Но, идея скопировать что то с интернета не глядя и не разбираясь, мне очень нравится))).
С проблемой я частично разобрался. Я неправильно вёл передачу. Запись данных в FIFO я делаю Burst-ом, и я забыл, что надо в старшем бите адреса FIFO ставить для записи 1. Теперь проблема другая - дальность. Дальность у меня аж 10 метров. При большем разнесении начинаются ошибки CRC. Тут я подозреваю, что дело в управлении выводами приема-передачи. На мой Кит схемы я не нашёл и я не знаю точно как надо управлять GPIO0-2. В разных исходниках конечно же разное управление, т.к. разные схемы. Надо, наверное, просто взять и прозвонить мой Кит. Видно, что GPIO2 идет только на SI4432, а вот GPIO0 и 1 заходят ещё на 6-тиногую микросхемку (думаю, switch).
Собственно, вопрос: как лучше управлять направлением? Я видел два подхода:
1. Выводы назначаются как TX и RX State, т.е. управляются автоматически при входе и выходе в/из соответствующего режима.
2. Выводы назначаются как Direct Digital Output и в ПО вручную переключают их в нужной полярности с созданием задержек перед переключением при выходе из режима передачи.
На первый взгляд удобней 1-й подход (автоматом), но не будет ли подводных камней, связанных с тем, что какой-нибудь последний бит посылки не успеет передаться? Т.е. является ли прерывание о завершении передачи гарантией, что уже всё передалось и можно переключаться на приём?
Спасибо.
1. Проблем не будет, так и надо делать.
Вот ваш свитч кстати (я телепат)
k155la3
Nov 11 2017, 23:39
Обзаведитесь свистком SDR - приемник. Используйте в качестве контрольного.
На немже можно проверить мощность сигнала, соответствие частот (синитезатора) приемника и передатчика.
Цитата(k155la3 @ Nov 12 2017, 01:39)

Обзаведитесь свистком SDR - приемник. Используйте в качестве контрольного.
А можно по-подробнее, что это?
k155la3
Nov 15 2017, 17:09
Цитата(YuryD @ Nov 13 2017, 12:27)

А можно по-подробнее, что это?
Это широкополосный универсальный радиоприемник с цифровой обработкой сигналов на на базе чипов свистка и PC (50/50).
ссылка
DASM + googl
Мне это обошлось в 9 кваксов. Для контрольного Rx подойдет самый дешевый и соответственно туповатый.
А если для работы в эфире - надо брать более продвинутые на тойже базе, но более дорогие (уже не виде свистка, а USB-коробочка под кабель с 2 антенными входами).
Ну в эфире нынче скучно. Купил tescun pl660 с ssb, только пару раз на 14 МГц слышал разговоры. А так - тишина и шум технологический .
Вроде всё заработало.
А поделитесь, пожалуйста, опытом, если мне надо организовать какую-то примитивную сеть (несколько устройств в одним мастером), как мне лучше всего организовать адресацию? Лобовое решение - это, например, в первом байте посылки указывать адрес. Реализуется, конечно, просто, но это все слэйвы в сети должны полностью принимать пакет, анализировать, а только потом принимать решения, это был им или не им пакет. А нельзя каким-то более изящным образом (может каким-то настройками модуля) настроить модуль так, чтобы он не дергал процессор, если посылка не ему адресована?
Спасибо.
Ну можете синхрослова разные делать на разные модули, например если синхрослово из двух байт, то первый байт общий у всех, а второй - адрес. Правда геммор тогда общевещательные делать. В некоторых чипах Силабса есть возможность задать два варианта синхрослова, как раз для таких случаев. Но я вообще не вижу проблемы дергать процессор каждый раз, да и чужую посылку не обязательно же полностью принимать
А там есть какие-то TX и RX headers. Это не из этой оперы?
k155la3
Nov 18 2017, 16:56
Цитата(YuryD @ Nov 18 2017, 19:36)

А там есть какие-то TX и RX headers. Это не из этой оперы?
Из той.
6.4.2. Packet Handler Enabled
When the packet handler is enabled, all the fields of the packet structure need to be configured. Register contents
are used to construct the header field and length information encoded into the transmitted packet when
transmitting. The receive FIFO can be configured to handle packets of fixed or variable length with or without a
header. If multiple packets are desired to be stored in the FIFO, then there are options available for the different
fields that will be stored into the FIFO. Figure 21 demonstrates the options and settings available when multiple
packets are enabled. Figure 22 demonstrates the operation of fixed packet length and correct/incorrect packets.
The extensive programmability of the packet header
allows for advanced packet filtering which in turn enables a mix of broadcast,
group, and point-to-point communication.
А нет где примера или описания с примером, как это реализовать?
Разобрался. Адресация работает.
Следующая проблема - RSSI. При максимальной мощности, если антенны поднести друг к другу, RSSI показывает 146. Судя по графику, RSSI может при максимальной мощности достигать 230. Как-то маловато 146.... Битрейт у меня 2400, переключение RX-TX делается правильно (при других комбинациях RSSI намного уменьшается). Из-за чего может быть такой низкий RSSI?
Чурову нормально, а Вам мало?

Дальность то какая вышла?
Ну, может и мне нормально, но я ещё об этом не знаю
Просто по даташиту должна быть до 230, начиная с мощности 0 дБм. Я, конечно, не рассчитывал прямо на 230, конечно, из-за неидеальности схемы, питания и т.д. максимального показателя достичь непросто, но 146 тоже как-то маловато.
Максимальную дальность пока не было возможности проверить, но в пределах квартиры на минимальной мощности -1дБм через 2 ЖБ стены на расстоянии метров 10-15 получал снижение RSSI до 76, потерь не было.
Может 230 можно получить, если соединить напрямую антенные контакты, а также земли?
k155la3
Nov 21 2017, 14:36
Цитата(YuryD @ Nov 20 2017, 15:27)

. . .
Может 230 можно получить, если соединить напрямую антенные контакты, а также земли?
Ну зачем это Вам ? Рискуете по(под)палить девайсы. Если нужна мощность - см. решения подобные Ti (CC1101 + CC1190 усилитель).
А туповатость может быть по причине не очень правильной комплектухи, установленной на РЧ.
И мерять ее (мощность/чувствительность) надо приборами, сильнодорогими,
Как вариант - взять "эталонный" кит от Silabs.
не, у китайцев обычно все пучком. Надо дальность посмотреть вначале
Проверили дальность. Получилось 200м в прямой видимости при максимальной мощности. Ну, и где обещанные километры?
Можно, правда, грешить на антенну. Мы использовали ту спиральку, которой комплектуется этот модуль.
А есть способ получить бОльшую дальность на этих модулях?
Антенну поставьте нормальную
Если не надо скорости - можно Lora поставить, они реально на низких скоростях далеко
Здравствуйте.
Вынужден вернуться к этой теме, т.к. есть вопросы по работе модуля. А именно: малая дальность работы модуля. Когда модули с антеннами лежат рядом (на расстоянии 30 см) я имею RSSI 130 при максимальной мощности. Как-то это совсем мало... При этом максимальная дальность не превышает 100 м в прямой видимости. В то же время у меня на руках есть аналогичное устройство конкурентов на тех же самых модулях, с такими же антеннами, и дальность превышает 500 м в прямой видимости.
Можно конечно говорить, что антенны-спиральки - это плохо, но рядом на столе я имею RSSI 130 вместо 255. Я ставлю антенны-спиральки на модули конкурентов и дальность практически не снижается. Думаю, дело не в антеннах.
Я меняю уровень выходной мощности от 7 до 0 и RSSI снижается со 130 до 96. Т.е. реакция на изменение мощности в принципе есть, но абсолютный уровень очень мал. Я так понимаю, что логика работы модуля правильная, т.к. принципиально модуль работает, отправка-прием-прерывания и прочий логический функционал работает нормально. Скорее всего что-то неправильно настроено в RF-части. Управление switch-ем я проверил осциллографом, вроде всё правильно, как минимум аналогично модулям конкурентов.
Что я мог не так настроить?
Может кто-то поделится примером, где всё настроено корректно и работает на максимальной, какую можно достичь, дальности?
Спасибо.
Причин может быть много. От ...не за то дело взялись, без знаний и понимания как все работает. Особенно без базовых знаний RF-части.
Разводка платы, некорректная с точки RF разводки. Сам материал платы, элементы согласования, кварц, ... вплодь до флюса или не той пасты при сборе, пайки, перегрев и тп. Если все покупное на али, то там можно на такое попасть. Особенно если чипы на платах там бракованные или поддеки. Наблюдал такие чипы, некоторые прибегали померить. Так что помочь можно, если больше инфы дадите о вашем проекте, платах, RF части.
У меня не ЧИПы, а уже готовые платы. Фотки есть на 1й странице темы. Я, по-сути, только подвожу питание и SPI интерфейс. Вряд ли можно что-то с этим так накосячить, что RSSI упадёт в 2 раза. Покупал у местного поставщика электронных компонентов, нормальная фирма, торгует качественным товаром.
Во вложении архив с драйвером SI4432. Может кто-то подскажет, что я неправильно настраиваю? Какие ещё данные есть смысл предоставить?
Спасибо.
P.S. Я за эту работу и взялся только потому, что модуль шел готовым изделием и вроде как, кроме программы, ничего не надо было делать. Вроде как RF-знаний почти что и не нужно. Но, как оказалось, программу тоже можно сделать криво...
Может я ни в ту тему пишу? Может надо в Микроконтроллеры? Может это вопрос не к RF специалистам?