Si4463 не взлетает

Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить
Родился
Сообщения: 8
Зарегистрирован: Сб июн 20, 2015 18:16:44

Сообщение draksnov »

Добрый день всем!

Который день бьюсь с этим, казалось бы простым, трансивером.
Суть проблемы - нет передачи. в эфире тишина(анализатор спектра есть). Приёмную сторону пока даже не начинал. В эфир бы просто что-нибудь стрельнуть. Младшенький 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, как в принципе и схему спроектировал - ничего.

SCH https://www.dropbox.com/s/rv1kl88j2q2v3pn/sch.JPG?dl=0
code https://www.dropbox.com/s/53qgkavy50bnedf/code.rar?dl=0
WDS https://www.dropbox.com/s/zxnj4slwr14nuom/sets.rar?dl=0

Есть подозрения, что до конца не заводятся внутренние клоки\шины, т.к. получить с GPIO DIV_CLK, 32CLK или BOOT_CLK так и не вышло. Конечно же я их включал. Или где-то не хватает волшебных пауз. В слепую натыкал их - тож ничего.

Буду рад любым подсказкам...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Пока обнаружил, что в 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.
Реклама
Родился
Сообщения: 8
Зарегистрирован: Сб июн 20, 2015 18:16:44

Сообщение draksnov »

Да, дело было именно в некорректной проверки CTS. Косяк косяков.

Касательно длинны пакета, что 0x0D это я случайно отправил кусок кода, когда "экспериментировал". И проверка CTS хоть коряво, но работает. Просто один цикл он работает "в холостую". Согласен, правильнее было бы написать:

do{
i = check_cts();
} while(i!=0xFF);
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Я бы еще рекомендовал восстановить дефолтное формирование сигнала CTS на ноге GPIO1 и проверять его наличие именно там. У приемника несколько снижается чувствительность если чип много долбать по SPI.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 8
Зарегистрирован: Сб июн 20, 2015 18:16:44

Сообщение draksnov »

О как. Дельный совет. Спасибо!
Реклама
Родился
Сообщения: 8
Зарегистрирован: Вт июл 04, 2017 03:14:29

Сообщение andreivanov »

Добрый день!
Пытаюсь запустить данный чип(модуль RF4463F30) в режиме DIRECT TX, то есть что пришло на ножку GPIO, то и ушло в эфир. Не могу понять что нужно сделать после загрузки конфига, сгенерированного WDS. Отправить команду start tx? Или что то другое? При отправке start tx в эфире тишина.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Почитайте силлабовский AN633. Там есть секция 10.3 про direct mode. Как определяете, что в эфире тишина?
Родился
Сообщения: 8
Зарегистрирован: Вт июл 04, 2017 03:14:29

Сообщение andreivanov »

[uquote="Ser60",url="/forum/viewtopic.php?p=3138059#p3138059"]Почитайте силлабовский AN633. Там есть секция 10.3 про direct mode. Как определяете, что в эфире тишина?[/uquote]
Спасибо за ответ!
Посмотрел секцию 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 раз.
Причина: Нарушение Правил форума п. 2.7
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Насчёт ревизии чипа см. здесь. На осциллограмме GPIO1 неверно сконфигурирован на вывод тактов командой 0х13. Там должно быть 16 (0х10). Приёмнику верить можно? И его настройки частоты, модуляции, девиации и пр. соответствуют передатчику? Попробуйте сконфигурировать чип на генерацию несущей, если приёмник её определит. С Вашим кодом мне разбираться времени нет, извините.
Родился
Сообщения: 8
Зарегистрирован: Вт июл 04, 2017 03:14:29

Сообщение andreivanov »

[uquote="Ser60",url="/forum/viewtopic.php?p=3138541#p3138541"]Насчёт ревизии чипа см. здесь. На осциллограмме GPIO1 неверно сконфигурирован на вывод тактов командой 0х13. Там должно быть 16 (0х10). Приёмнику верить можно? И его настройки частоты, модуляции, девиации и пр. соответствуют передатчику? Попробуйте сконфигурировать чип на генерацию несущей, если приёмник её определит. С Вашим кодом мне разбираться времени нет, извините.[/uquote]
Судя по AN625 вывод тактов сконфигурирован верно. 3.2.6. GPIO_PIN_CFG сналача идет 0x13, потом байты конфигурации каждого из GPIO. На осциллограмме он настроен на вывод Divided MCU clock(0x07). На GPIO1 тишина((
Приемник неоднократно проверен и работает.
Последний раз редактировалось aen Пн сен 18, 2017 23:30:06, всего редактировалось 1 раз.
Причина: Нарушение Правил форума п. 2.7
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

ОК, я думал Вы хотите выводить на GPIO1 тактирование для синхронной безпакетной передачи. Я попробовал вывести тактирование частоты кристалла на вывод IRQ такими0же командами, как Вы делаете (GPIO1 у меня занят под сигнал CTS - без него мой код работать не будет). Как видно из осциллограммы, частота выводится.
freq.png
(72.44 КБ) 793 скачивания
Родился
Сообщения: 8
Зарегистрирован: Вт июл 04, 2017 03:14:29

Сообщение andreivanov »

[uquote="Ser60",url="/forum/viewtopic.php?p=3138651#p3138651"]ОК, я думал Вы хотите выводить на GPIO1 тактирование для синхронной безпакетной передачи. Я попробовал вывести тактирование частоты кристалла на вывод IRQ такими0же командами, как Вы делаете (GPIO1 у меня занят под сигнал CTS - без него мой код работать не будет). Как видно из осциллограммы, частота выводится.
freq.png
[/uquote]
У Вас какая ревизия микросхемы? Хотя не думаю что тут в ревизии дело, попробую проверить на другом экземпляре модуля. До этой команды Вы что на модуль подаёте? Только Power Up?
Последний раз редактировалось aen Пн сен 18, 2017 23:30:42, всего редактировалось 1 раз.
Причина: Нарушение Правил форума п. 2.7
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

У меня 4461 ревизия 1B. Да, до этих команд подаю только команду PoerUp (0х02).
Родился
Сообщения: 13
Зарегистрирован: Сб май 07, 2016 16:19:58

Сообщение Casper17 »

Здравствуйте! Как-то читал даташит и вроде как находил описание, что при передачи данных модуль сначала слушает эфир, на наличии активности, если ее нету, то начинается передача. Сейчас пришли модули, подключил к ардуино, работают. Использовал библиотеки RadioHead и пример от NiceRF. Сейчас что-то не могу найти описание такой функции.. Есть что-то подобное или нет в данных модулях, чтобы несколько модулей не начали передавать данные одновременно, а то на приемнике будет каша. Сейчас буду писать код под AVR хочется это учесть.
И по поводу адресации на уровне модуля, есть примеры, опыт использования?
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Сам по себе модуль до начала передачи эфир не слушает. Может это и запрограммировано в какой-то библиотеке, но в железе изначально и дефолтно такого нет. Более того, несколько разрозненных и независимых модулей, подключенным к разным МК невозможно 100%-но синхронизировать на отсутствие одновременной передачи. Это скорее задача протокола связи, в частности реализовать LBT (Listen Before Talk) поведение модуля, используя значение RSSI.

Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.
Родился
Сообщения: 13
Зарегистрирован: Сб май 07, 2016 16:19:58

Сообщение Casper17 »

[uquote="Ser60",url="/forum/viewtopic.php?p=3140328#p3140328"]Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.[/uquote]

Под адресацией я имел ввиду адреса модулей, чтобы можно было передавать данные конкретному модулю, а не широковещательно. В si4432 там были регистры Transmit Header(0x3A-0x3D), Check Header(0x3F-0x42), Received Heade(0x47-0x4a) и можно было общаться с конкретным модулем, другие модули не реагировали на сообщения. В si4463 находил в апноуте AN626 4.4. Match (Header Check) Functionality, вроде похоже на то что надо, но не смог разобраться что к чему((

Еще есть модули HC-12 на базе si4463. У меня было два модуля на передачу и один на прием. И как часто я бы не посылал сообщения с двух передатчиков на один приемник, пакеты не пересекались т.е. сначала один пакет полностью получили, потом второй. Может конечно я сильно заморачиваюсь и переживаю по этому поводу, так как нет знаний по радиопередатчикам, просто беспокоит тот момент, если во время передачи данных, начнет передачу другой модуль, то будет на приемнике каша.
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Для передачи данных конкретному модулю есть несколько способов. Можно просто поместить адрес приемника в payload пакета и по приёму пакета проверять его программно. Преимущество этого способа в простоте реализации, если у Вас уже работает приём и передача пакетов. Недостаток его в нагрузке на управляющий МК и в принятии полного пакета приёмником, если даже он ему не предназначен (что выяснится позже МК). Иначе, можно передавать пакеты разным приёмникам на разных каналах (частотах) диапазона. В пределах одного канала можно ограничить вещание пакетов для определённого приёмника передавая синхрослово, на которое этот приёмник настроен. При приёме неправильного синхрослова дальнейший приём пакета приёмником прекращается. Это основной (primary) способ. О нём подробнее написано в секции 4.2 AN626. Наконец, то, что Вы упомянули (секция 4.4). В этом случае достигается значительно более гибкая отбраковка пакета по четырём (максимум) фиксированным байтам в хедере и с логическими операциями над ними.

Если оба передатчика начнут передавать одновременно, приёмник это не поймёт, конечно. Такая проблема существует во всех каналах с множественным доступом. Решается она программно на уровне протокола. Посмотрите, например, на алгоритмы CSMA/CD и CSMA/CA (подробности в Википедии).
СпойлерИзображение
Родился
Сообщения: 13
Зарегистрирован: Сб май 07, 2016 16:19:58

Сообщение Casper17 »

Спасибо, наверное остановлюсь на синхрослове.. А подскажите пожалуйста, как зависит частота девиации на скорость передачи? Как правильно ее настроить? И как она влияет на качество сигнала?
Друг Кота
Аватара пользователя
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Хороший вопрос! При передаче сигналов определяющую роль играют 2 параметра: полоса пропускания (bandwidth) и коэффициент модуляции (modulation index), которые определяются по формулам dara_rate + 2*deviation и 2*deviation/data_rate, соответственно. При широкой полосе пропускания уменьшается чувствительность приемника, в то время как при малой девиации уменьшается расстояние между сигналами (при FSK модуляции), и, как следствие чувствительность. Кроме всего прочего, в игру вступает точность кварцевых резонаторов для различения частот при малой девиации. Компромиссом выхода из ситуации считается оптимальным передавать при коэффициенте модуляции =1. Одако, это не всегда приемлимо, т.к. из-за дискретности цифровых синтезаторов частоты в радио величина девиация обычно ограчичена снизу. Поэтому при малых скоростях передачи следует установить минимальную поддерживаемую радио девиацию, так чтобы коэффициент модуляции был как можно ближе к 1.
Родился
Сообщения: 13
Зарегистрирован: Сб май 07, 2016 16:19:58

Сообщение Casper17 »

Доброго времени суток. Есть такая проблемка. Взял библиотеку от 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 интерфейсу.
Вложения
RF4463-Arduino code-23cba543-60d4-463f-85e7-4d0fae0fe9d4.zip
Библиотека для ардуино от NiceRF
(20.01 КБ) 664 скачивания
Ответить

Вернуться в «Радиотехника: приемники, передатчики, антенны»