Который день бьюсь с этим, казалось бы простым, трансивером. Суть проблемы - нет передачи. в эфире тишина(анализатор спектра есть). Приёмную сторону пока даже не начинал. В эфир бы просто что-нибудь стрельнуть. Младшенький Si4431 проблем не доставил. Этого прокачали и API добавили по сути...
В качестве контроллера использую STM32L0. Её запустили. SPI настроили. К Si4463 подключили. POWER_UP выполнили. Кварц завёлся. SDO заработало. Настройку чипа сделали, используя то, что нам выдал WDS. В FIFO записали нужный нам пакетик. Сделали TX_START. В эфире тишина.
Начал копать. Нашёл образец кода от DORJI, всё вроде так же делаю. Настроил прерывания, читаю регистры состояния. Прерывания с nIRQ говорит, что пакет отправлен, чип находится в READY MODE (хорошо), CHANGE_STATE тоже успешно выполнен (хорошо), и даже GET_INT_STATUS говорит "the TX FIFO were transmitted successfully" (отлично). Проверил, пишется ли что-нибудь в FIFO - читаю FIFO_INFO ->количество пустых битов меняется, значит что-то пишем.
Я В тупике. Ниже ссылки на дропбокс на схему, куски кода и иниты... P.S. Ревизию проверил. B1, как на чипе написано. P.P.S. Поиграл с настройкой PA, заменил CLE на SWC, как в принципе и схему спроектировал - ничего.
Есть подозрения, что до конца не заводятся внутренние клоки\шины, т.к. получить с GPIO DIV_CLK, 32CLK или BOOT_CLK так и не вышло. Конечно же я их включал. Или где-то не хватает волшебных пауз. В слепую натыкал их - тож ничего.
Пока обнаружил, что в FIFO загружается payload_length=7 байтов а в функции tx_start() запрашивается передача 0x0D=13 байтов (?) Кроме того перед посылкой каждой команды в радио следует проверять сигнал CTS. У Вас это делается неправильно. Именно, в функции spi_write() сначала в радио посылаются байты а потом уже проверяется CTS:
Код:
nSEL_low; // ×èï ñåëåêò for (i = 0; i < tx_length; i++){ j = *(p+i); spi_byte(j); } while(i!=0xFF){ // Æäåì CLEAR TO SEND i = check_cts();} nSEL_high; // ×èï ñåëåêò
Если хотите проверять CTS после подачи команд, то в имплементации выше первый вызов функции check_cts() применяется с опущенной линией nSEL, что тоже некорректно. Я-бы поставил while-loop перед for-loop.
Да, дело было именно в некорректной проверки CTS. Косяк косяков.
Касательно длинны пакета, что 0x0D это я случайно отправил кусок кода, когда "экспериментировал". И проверка CTS хоть коряво, но работает. Просто один цикл он работает "в холостую". Согласен, правильнее было бы написать:
Я бы еще рекомендовал восстановить дефолтное формирование сигнала CTS на ноге GPIO1 и проверять его наличие именно там. У приемника несколько снижается чувствительность если чип много долбать по SPI.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Добрый день! Пытаюсь запустить данный чип(модуль RF4463F30) в режиме DIRECT TX, то есть что пришло на ножку GPIO, то и ушло в эфир. Не могу понять что нужно сделать после загрузки конфига, сгенерированного WDS. Отправить команду start tx? Или что то другое? При отправке start tx в эфире тишина.
Почитайте силлабовский AN633. Там есть секция 10.3 про direct mode. Как определяете, что в эфире тишина?
Спасибо за ответ! Посмотрел секцию 10.3, написано что нужно настроить чип и вызвать функцию vRadio_Start_Tx( ). Я так понял это Start TX и есть. Определяю sdr доглом китайским, выставляю частоту на которую настроен модуль(907 МГц) и смотрю что в эфире творится через SDR Sharp. Конфиг загружается, после передачи каждой строки CTS падает в 0, после того как выставляется в 1 идёт следующая строка, и так пока не загрузится весь конфиг. Частота spi 8 МГц. По spi чип отвечает, делал команду PART_INFO, чип выдает ревизию и тд. Кстати какую ревизию ставить в WDS? На команду PART_INFO чип выдает 0х22. На корпусе маркировка 44632A. Сейчас попробовал настроить GPIO1 на вывод тактов, конфиг загружаю, на GPIO1 тишина. Подскажите, что не так делаю, прилагаю архив с проектом в keil для stm32f103c8t6 и лог обмена по spi(saleae logic). https://www.sendspace.com/file/u9rgzl
Последний раз редактировалось aen Пн сен 18, 2017 23:29:32, всего редактировалось 1 раз.
Насчёт ревизии чипа см. здесь. На осциллограмме GPIO1 неверно сконфигурирован на вывод тактов командой 0х13. Там должно быть 16 (0х10). Приёмнику верить можно? И его настройки частоты, модуляции, девиации и пр. соответствуют передатчику? Попробуйте сконфигурировать чип на генерацию несущей, если приёмник её определит. С Вашим кодом мне разбираться времени нет, извините.
Насчёт ревизии чипа см. здесь. На осциллограмме GPIO1 неверно сконфигурирован на вывод тактов командой 0х13. Там должно быть 16 (0х10). Приёмнику верить можно? И его настройки частоты, модуляции, девиации и пр. соответствуют передатчику? Попробуйте сконфигурировать чип на генерацию несущей, если приёмник её определит. С Вашим кодом мне разбираться времени нет, извините.
Судя по AN625 вывод тактов сконфигурирован верно. 3.2.6. GPIO_PIN_CFG сналача идет 0x13, потом байты конфигурации каждого из GPIO. На осциллограмме он настроен на вывод Divided MCU clock(0x07). На GPIO1 тишина(( Приемник неоднократно проверен и работает.
Последний раз редактировалось aen Пн сен 18, 2017 23:30:06, всего редактировалось 1 раз.
ОК, я думал Вы хотите выводить на GPIO1 тактирование для синхронной безпакетной передачи. Я попробовал вывести тактирование частоты кристалла на вывод IRQ такими0же командами, как Вы делаете (GPIO1 у меня занят под сигнал CTS - без него мой код работать не будет). Как видно из осциллограммы, частота выводится.
ОК, я думал Вы хотите выводить на GPIO1 тактирование для синхронной безпакетной передачи. Я попробовал вывести тактирование частоты кристалла на вывод IRQ такими0же командами, как Вы делаете (GPIO1 у меня занят под сигнал CTS - без него мой код работать не будет). Как видно из осциллограммы, частота выводится.
Вложение:
freq.png
У Вас какая ревизия микросхемы? Хотя не думаю что тут в ревизии дело, попробую проверить на другом экземпляре модуля. До этой команды Вы что на модуль подаёте? Только Power Up?
Последний раз редактировалось aen Пн сен 18, 2017 23:30:42, всего редактировалось 1 раз.
Зарегистрирован: Сб май 07, 2016 16:19:58 Сообщений: 13
Рейтинг сообщения:0
Здравствуйте! Как-то читал даташит и вроде как находил описание, что при передачи данных модуль сначала слушает эфир, на наличии активности, если ее нету, то начинается передача. Сейчас пришли модули, подключил к ардуино, работают. Использовал библиотеки RadioHead и пример от NiceRF. Сейчас что-то не могу найти описание такой функции.. Есть что-то подобное или нет в данных модулях, чтобы несколько модулей не начали передавать данные одновременно, а то на приемнике будет каша. Сейчас буду писать код под AVR хочется это учесть. И по поводу адресации на уровне модуля, есть примеры, опыт использования?
Сам по себе модуль до начала передачи эфир не слушает. Может это и запрограммировано в какой-то библиотеке, но в железе изначально и дефолтно такого нет. Более того, несколько разрозненных и независимых модулей, подключенным к разным МК невозможно 100%-но синхронизировать на отсутствие одновременной передачи. Это скорее задача протокола связи, в частности реализовать LBT (Listen Before Talk) поведение модуля, используя значение RSSI.
Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.
Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.
Под адресацией я имел ввиду адреса модулей, чтобы можно было передавать данные конкретному модулю, а не широковещательно. В si4432 там были регистры Transmit Header(0x3A-0x3D), Check Header(0x3F-0x42), Received Heade(0x47-0x4a) и можно было общаться с конкретным модулем, другие модули не реагировали на сообщения. В si4463 находил в апноуте AN626 4.4. Match (Header Check) Functionality, вроде похоже на то что надо, но не смог разобраться что к чему((
Еще есть модули HC-12 на базе si4463. У меня было два модуля на передачу и один на прием. И как часто я бы не посылал сообщения с двух передатчиков на один приемник, пакеты не пересекались т.е. сначала один пакет полностью получили, потом второй. Может конечно я сильно заморачиваюсь и переживаю по этому поводу, так как нет знаний по радиопередатчикам, просто беспокоит тот момент, если во время передачи данных, начнет передачу другой модуль, то будет на приемнике каша.
Для передачи данных конкретному модулю есть несколько способов. Можно просто поместить адрес приемника в payload пакета и по приёму пакета проверять его программно. Преимущество этого способа в простоте реализации, если у Вас уже работает приём и передача пакетов. Недостаток его в нагрузке на управляющий МК и в принятии полного пакета приёмником, если даже он ему не предназначен (что выяснится позже МК). Иначе, можно передавать пакеты разным приёмникам на разных каналах (частотах) диапазона. В пределах одного канала можно ограничить вещание пакетов для определённого приёмника передавая синхрослово, на которое этот приёмник настроен. При приёме неправильного синхрослова дальнейший приём пакета приёмником прекращается. Это основной (primary) способ. О нём подробнее написано в секции 4.2 AN626. Наконец, то, что Вы упомянули (секция 4.4). В этом случае достигается значительно более гибкая отбраковка пакета по четырём (максимум) фиксированным байтам в хедере и с логическими операциями над ними.
Если оба передатчика начнут передавать одновременно, приёмник это не поймёт, конечно. Такая проблема существует во всех каналах с множественным доступом. Решается она программно на уровне протокола. Посмотрите, например, на алгоритмы CSMA/CD и CSMA/CA (подробности в Википедии). Спойлер
Зарегистрирован: Сб май 07, 2016 16:19:58 Сообщений: 13
Рейтинг сообщения:0
Спасибо, наверное остановлюсь на синхрослове.. А подскажите пожалуйста, как зависит частота девиации на скорость передачи? Как правильно ее настроить? И как она влияет на качество сигнала?
Хороший вопрос! При передаче сигналов определяющую роль играют 2 параметра: полоса пропускания (bandwidth) и коэффициент модуляции (modulation index), которые определяются по формулам dara_rate + 2*deviation и 2*deviation/data_rate, соответственно. При широкой полосе пропускания уменьшается чувствительность приемника, в то время как при малой девиации уменьшается расстояние между сигналами (при FSK модуляции), и, как следствие чувствительность. Кроме всего прочего, в игру вступает точность кварцевых резонаторов для различения частот при малой девиации. Компромиссом выхода из ситуации считается оптимальным передавать при коэффициенте модуляции =1. Одако, это не всегда приемлимо, т.к. из-за дискретности цифровых синтезаторов частоты в радио величина девиация обычно ограчичена снизу. Поэтому при малых скоростях передачи следует установить минимальную поддерживаемую радио девиацию, так чтобы коэффициент модуляции был как можно ближе к 1.
Зарегистрирован: Сб май 07, 2016 16:19:58 Сообщений: 13
Рейтинг сообщения:0
Доброго времени суток. Есть такая проблемка. Взял библиотеку от NiceRF для ардуино, код перенес на STM32F103. Передатчик передает строку вида T1=10C H=75% T2=10C, а на приемнике бывает иногда часто приходят битые данные: T1=10G!H=75% T1=10C, T1=10C`I=/5%0T9=1ёS.. Где-то один два символа не правильно, когда и больше и по количеству бывает больше. На что можно грешить? Передатчик так передает? Или помехи при считывании с SI4463? Сейчас радиомодуль подключен макетными проводами 10см. Информацию вывожу с помощью ST-Link по SWO интерфейсу.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения