Это принятые пакеты. Где: RX 23: это кол-во принятых байт; Последние 4 байта - CRC32, пятый с конца это счетчик передатчика. И так может продолжаться вечность. Но только стоит мне отправить пакет, загрузить пакет в буфер TX и вызвать команду на отправку, как тут же происходит странный глюк - пакеты принимаются, но в буфере добавляется какой-то мусор ровно на длину отправленного пакета:
Цитата:
TX 12: b 0 ec a2 1 a9 db 1 dd cc bb aa
TX 12: Отправили 12 байт. И тут же при приеме читаем из буфера:
Причем первые 23 байта это реально наш правильный пакет, счетчик увеличивается, CRC считается, дальше до 35 байт уже идет мусор рандомный. Если передернуть питание приемника (чтоб чип перезагрузить), то все опять встает на свои места. Т.е. явно проблема не в передатчике. Буферы TX/RX раздельные. Как с этим бороться я уже не знаю.
Передатчик передаёт 23 байта (согласно размеру своего буфера), а приёмник принимает 35 байт (согласно размеру своего бефера).
Это не мусор, а просто шум приёмника. Передатчик передал 23 байта и отключился. А приёмник продолжает принимать шум эфира - Белый шум. https://ru.wikipedia.org/wiki/Белый_шум Получаем в буфере приёмника случайный набор цифр)).
greeka писал(а):
Как с этим бороться
Сделать чтобы буфера RX был равен буферу TX. Как в вашем случае это сделать... я без понятия)) Никакие библиотеки и дефайны я не использую. И вот эту фигню printf("\n"); и т.д.... я тоже не использую))
Я работаю напрямую с регистрами радиомодуля... Тупо все регистры забиваю вручную, согласно таблице регистров...
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Я тоже до этого работал со многими чипами и таких косяков не наблюдал. У меня все самописное, никаких библиотек нет. В регистры модуля вы сами ничего записать не можете, только через SPI. Буферы там по 64 байта, их нельзя ни уменьшить ни увеличить они в чипе так сделаны. Разве что их можно объединить, но такая настройка отключена. Я сначала думал что проблема из-за переменной длинны пакета, но оказалось это не так. Выставил фиксированную длину на приемнике и передатчике и все равно косяк повторяется. Приемник принимает пакеты нормально до тех пор, пока не передать что-то. Потом прием ломается. Почему даже при фиксированной длинные пакета чип после приема начинает выдавать другую длину пакета это загадка. Смотрел по SPI сигналы, думал может где что-то перекрываю, но нет. Все соблюдено как положенно.
Смущает то, что чип старой ревизии, не последней. Но в ерарте нет ничего такого.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Интерфейс SPI позволяет считывать / записывать регистры...
greeka писал(а):
Буферы там по 64 байта, их нельзя ни уменьшить ни увеличить они в чипе так сделаны.
Буферы ни уменьшить ни увеличить нельзя, но можно задать верний порог «RX_FIFO_FULL». Когда входящие данные RX достигают вернего порога, будет сгенерировано прерывание через вывод nIRQ. А ещё есть "очистка" RX FIFO (командой «FIFO_RESET»).
А в нормальных модулях есть стандартный Length (длина пакета)...
Лучше всё протестировать в железе, работу буфера при разных пакетах... Есть подозрение, что там буфер чуть чложнее... В других чипах есть варианты для разных пакетов, которые будут сохранены в FIFO...
Все там есть, только в другой форме. Настроек конечно куча, но настраиваю через утилиту. Она генерит конфиг. Странность еще в том, что если поменять местами передатчик с приемником - т.е. как бы один мастер, другой слейв, а потом наоборот, то проблема исчезает... Устройства идентичные. Прошивки тоже. Мистика.
Утилиты всякие..)) можно, только если свои, а не чужие))
А ещё были случаи из-за плохого питания или помех по шлейфу SPI модули тупо висли... сбивались настройки... Хотя мало вероятно что собъётся настройка приёмного буфера...
А откуда вообще в приёмном буфере может буть шум, если там включена проверка CRC ? ))
Шум после CRC. Я же выше привел дампы. Тоже грешил на глюки SPI но не похоже. Анализатор показывает что все корректно ходит.
Добавлено after 36 minutes 25 seconds: Вообщем фигня в том, что при настройке фиксированной длинны пакета он ее не берет из ранее сохраненного конфига. Т.е. нужно эту длину передавать каждый раз при запуске режима RX. Хотя в доке написано что должен брать. Ну и как быть с переменной длинной вообще не понятно. Разве что самому это хэндлить.
Почитайте здесь про конфигурирование Si446х для работы с пакетами переменной длины.
Да, я ваш мануал прочитал вдоль и поперек, спасибо, но ответа там нет. А он оказался прост: подефолту чип шарит настройки TX и RX и при отправке пакета указанной длинны, эта самая длинна меняется для всего конфига и в дальнейшем при приеме пакета берется длинна отправленного пакета...
)) И вообще... я обычно на меняю длину пакетов. Один раз прикинул какие надо пакеты для передачи данных и всё)) А если надо передать меньше пакет, то автоматом дописываем нули ... 000000000000000.... "выравнивание". А если надо передать больше пакет, то автоматом включается "фрагментация". Обычные сетевые технологии... А зато не надо себе забивать голову настройками длины пакета))
А если надо сохранить батарейку то начинаешь извращаться по полной...
Добавлено after 9 hours 58 minutes 5 seconds: Но все же хрень с приемом пакетов переменной длинны не заборолась. Ser60, если есть возможность - можете пояснить в чем может быть причина? Данные: Пакет от передатчика:
Цитата:
RX 0 6: 05 00 aa bb cc dd
Приемник настроен на прием одного пакета с фиксированной длинной и CRC. Все получаем. Пакет как у вас в примере, первый байт 05 - заголовочный для поля длины. Далее включаю прием пакетов переменной длины:
Добавлено after 3 hours 1 minute 38 seconds: Разобрался сам... Ну и накрутили блин в чипе. В доке написано про длина переменного пакета берется из поля PKT_FIELD_1_LENGTH при условии что: These properties are applicable in RX mode only under the following conditions: a) RX Packet Handling is enabled by clearing PKT_CONFIG1:PH_RX_DISABLE, and b) The START_RX command is sent with the parameter RX_LEN=0, and c) PKT_CONFIG1:PH_FIELD_SPLIT is cleared. Ну я так и настраивал. А еще так же настраивает конфигурилка Силабовская. Но у меня упорно не хотело так работать пока я не продублировал настройки в регистры PKT_RX_FIELD_X_LENGTH и не включил разделение TX/RX. Вообщем заработало у меня это все добро... Но, сцуко, времени убил дофига. Всем неравнодушным спасибо.
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 27
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения