Si4463 не взлетает
Si4463 не взлетает
Добрый день всем!
Который день бьюсь с этим, казалось бы простым, трансивером.
Суть проблемы - нет передачи. в эфире тишина(анализатор спектра есть). Приёмную сторону пока даже не начинал. В эфир бы просто что-нибудь стрельнуть. Младшенький 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 так и не вышло. Конечно же я их включал. Или где-то не хватает волшебных пауз. В слепую натыкал их - тож ничего.
Буду рад любым подсказкам...
Который день бьюсь с этим, казалось бы простым, трансивером.
Суть проблемы - нет передачи. в эфире тишина(анализатор спектра есть). Приёмную сторону пока даже не начинал. В эфир бы просто что-нибудь стрельнуть. Младшенький 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 так и не вышло. Конечно же я их включал. Или где-то не хватает волшебных пауз. В слепую натыкал их - тож ничего.
Буду рад любым подсказкам...
Re: Si4463 не взлетает
Пока обнаружил, что в FIFO загружается payload_length=7 байтов а в функции tx_start() запрашивается передача 0x0D=13 байтов (?) Кроме того перед посылкой каждой команды в радио следует проверять сигнал CTS. У Вас это делается неправильно. Именно, в функции spi_write() сначала в радио посылаются байты а потом уже проверяется CTS:
Если хотите проверять CTS после подачи команд, то в имплементации выше первый вызов функции check_cts() применяется с опущенной линией nSEL, что тоже некорректно. Я-бы поставил while-loop перед for-loop.
Код: Выделить всё
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.
Re: Si4463 не взлетает
Да, дело было именно в некорректной проверки CTS. Косяк косяков.
Касательно длинны пакета, что 0x0D это я случайно отправил кусок кода, когда "экспериментировал". И проверка CTS хоть коряво, но работает. Просто один цикл он работает "в холостую". Согласен, правильнее было бы написать:
do{
i = check_cts();
} while(i!=0xFF);
Касательно длинны пакета, что 0x0D это я случайно отправил кусок кода, когда "экспериментировал". И проверка CTS хоть коряво, но работает. Просто один цикл он работает "в холостую". Согласен, правильнее было бы написать:
do{
i = check_cts();
} while(i!=0xFF);
Re: Si4463 не взлетает
Я бы еще рекомендовал восстановить дефолтное формирование сигнала CTS на ноге GPIO1 и проверять его наличие именно там. У приемника несколько снижается чувствительность если чип много долбать по SPI.
Re: Si4463 не взлетает
О как. Дельный совет. Спасибо!
-
andreivanov
- Родился
- Сообщения: 8
- Зарегистрирован: Вт июл 04, 2017 03:14:29
Re: Si4463 не взлетает
Добрый день!
Пытаюсь запустить данный чип(модуль RF4463F30) в режиме DIRECT TX, то есть что пришло на ножку GPIO, то и ушло в эфир. Не могу понять что нужно сделать после загрузки конфига, сгенерированного WDS. Отправить команду start tx? Или что то другое? При отправке start tx в эфире тишина.
Пытаюсь запустить данный чип(модуль RF4463F30) в режиме DIRECT TX, то есть что пришло на ножку GPIO, то и ушло в эфир. Не могу понять что нужно сделать после загрузки конфига, сгенерированного WDS. Отправить команду start tx? Или что то другое? При отправке start tx в эфире тишина.
Re: Si4463 не взлетает
Почитайте силлабовский AN633. Там есть секция 10.3 про direct mode. Как определяете, что в эфире тишина?
-
andreivanov
- Родился
- Сообщения: 8
- Зарегистрирован: Вт июл 04, 2017 03:14:29
Re: Si4463 не взлетает
Почитайте силлабовский 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 раз.
Причина: Нарушение Правил форума п. 2.7
Причина: Нарушение Правил форума п. 2.7
Re: Si4463 не взлетает
Насчёт ревизии чипа см. здесь. На осциллограмме GPIO1 неверно сконфигурирован на вывод тактов командой 0х13. Там должно быть 16 (0х10). Приёмнику верить можно? И его настройки частоты, модуляции, девиации и пр. соответствуют передатчику? Попробуйте сконфигурировать чип на генерацию несущей, если приёмник её определит. С Вашим кодом мне разбираться времени нет, извините.
-
andreivanov
- Родился
- Сообщения: 8
- Зарегистрирован: Вт июл 04, 2017 03:14:29
Re: Si4463 не взлетает
Насчёт ревизии чипа см. здесь. На осциллограмме 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 раз.
Причина: Нарушение Правил форума п. 2.7
Причина: Нарушение Правил форума п. 2.7
Re: Si4463 не взлетает
ОК, я думал Вы хотите выводить на GPIO1 тактирование для синхронной безпакетной передачи. Я попробовал вывести тактирование частоты кристалла на вывод IRQ такими0же командами, как Вы делаете (GPIO1 у меня занят под сигнал CTS - без него мой код работать не будет). Как видно из осциллограммы, частота выводится.
-
andreivanov
- Родился
- Сообщения: 8
- Зарегистрирован: Вт июл 04, 2017 03:14:29
Re: Si4463 не взлетает
ОК, я думал Вы хотите выводить на GPIO1 тактирование для синхронной безпакетной передачи. Я попробовал вывести тактирование частоты кристалла на вывод IRQ такими0же командами, как Вы делаете (GPIO1 у меня занят под сигнал CTS - без него мой код работать не будет). Как видно из осциллограммы, частота выводится.
У Вас какая ревизия микросхемы? Хотя не думаю что тут в ревизии дело, попробую проверить на другом экземпляре модуля. До этой команды Вы что на модуль подаёте? Только Power Up?
Последний раз редактировалось aen Пн сен 18, 2017 23:30:42, всего редактировалось 1 раз.
Причина: Нарушение Правил форума п. 2.7
Причина: Нарушение Правил форума п. 2.7
Re: Si4463 не взлетает
У меня 4461 ревизия 1B. Да, до этих команд подаю только команду PoerUp (0х02).
Re: Si4463 не взлетает
Здравствуйте! Как-то читал даташит и вроде как находил описание, что при передачи данных модуль сначала слушает эфир, на наличии активности, если ее нету, то начинается передача. Сейчас пришли модули, подключил к ардуино, работают. Использовал библиотеки RadioHead и пример от NiceRF. Сейчас что-то не могу найти описание такой функции.. Есть что-то подобное или нет в данных модулях, чтобы несколько модулей не начали передавать данные одновременно, а то на приемнике будет каша. Сейчас буду писать код под AVR хочется это учесть.
И по поводу адресации на уровне модуля, есть примеры, опыт использования?
И по поводу адресации на уровне модуля, есть примеры, опыт использования?
Re: Si4463 не взлетает
Сам по себе модуль до начала передачи эфир не слушает. Может это и запрограммировано в какой-то библиотеке, но в железе изначально и дефолтно такого нет. Более того, несколько разрозненных и независимых модулей, подключенным к разным МК невозможно 100%-но синхронизировать на отсутствие одновременной передачи. Это скорее задача протокола связи, в частности реализовать LBT (Listen Before Talk) поведение модуля, используя значение RSSI.
Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.
Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.
Re: Si4463 не взлетает
Насчёт адресации не понял. Имеете в виду как работать с голым модулем без всяких библиотек? Если да, почитайте сначала мою статью здесь. Я лично только так с этими модулями и работаю.
Под адресацией я имел ввиду адреса модулей, чтобы можно было передавать данные конкретному модулю, а не широковещательно. В si4432 там были регистры Transmit Header(0x3A-0x3D), Check Header(0x3F-0x42), Received Heade(0x47-0x4a) и можно было общаться с конкретным модулем, другие модули не реагировали на сообщения. В si4463 находил в апноуте AN626 4.4. Match (Header Check) Functionality, вроде похоже на то что надо, но не смог разобраться что к чему((
Еще есть модули HC-12 на базе si4463. У меня было два модуля на передачу и один на прием. И как часто я бы не посылал сообщения с двух передатчиков на один приемник, пакеты не пересекались т.е. сначала один пакет полностью получили, потом второй. Может конечно я сильно заморачиваюсь и переживаю по этому поводу, так как нет знаний по радиопередатчикам, просто беспокоит тот момент, если во время передачи данных, начнет передачу другой модуль, то будет на приемнике каша.
Re: Si4463 не взлетает
Для передачи данных конкретному модулю есть несколько способов. Можно просто поместить адрес приемника в payload пакета и по приёму пакета проверять его программно. Преимущество этого способа в простоте реализации, если у Вас уже работает приём и передача пакетов. Недостаток его в нагрузке на управляющий МК и в принятии полного пакета приёмником, если даже он ему не предназначен (что выяснится позже МК). Иначе, можно передавать пакеты разным приёмникам на разных каналах (частотах) диапазона. В пределах одного канала можно ограничить вещание пакетов для определённого приёмника передавая синхрослово, на которое этот приёмник настроен. При приёме неправильного синхрослова дальнейший приём пакета приёмником прекращается. Это основной (primary) способ. О нём подробнее написано в секции 4.2 AN626. Наконец, то, что Вы упомянули (секция 4.4). В этом случае достигается значительно более гибкая отбраковка пакета по четырём (максимум) фиксированным байтам в хедере и с логическими операциями над ними.
Если оба передатчика начнут передавать одновременно, приёмник это не поймёт, конечно. Такая проблема существует во всех каналах с множественным доступом. Решается она программно на уровне протокола. Посмотрите, например, на алгоритмы CSMA/CD и CSMA/CA (подробности в Википедии).

Если оба передатчика начнут передавать одновременно, приёмник это не поймёт, конечно. Такая проблема существует во всех каналах с множественным доступом. Решается она программно на уровне протокола. Посмотрите, например, на алгоритмы CSMA/CD и CSMA/CA (подробности в Википедии).
Спойлер
Re: Si4463 не взлетает
Спасибо, наверное остановлюсь на синхрослове.. А подскажите пожалуйста, как зависит частота девиации на скорость передачи? Как правильно ее настроить? И как она влияет на качество сигнала?
Re: Si4463 не взлетает
Хороший вопрос! При передаче сигналов определяющую роль играют 2 параметра: полоса пропускания (bandwidth) и коэффициент модуляции (modulation index), которые определяются по формулам dara_rate + 2*deviation и 2*deviation/data_rate, соответственно. При широкой полосе пропускания уменьшается чувствительность приемника, в то время как при малой девиации уменьшается расстояние между сигналами (при FSK модуляции), и, как следствие чувствительность. Кроме всего прочего, в игру вступает точность кварцевых резонаторов для различения частот при малой девиации. Компромиссом выхода из ситуации считается оптимальным передавать при коэффициенте модуляции =1. Одако, это не всегда приемлимо, т.к. из-за дискретности цифровых синтезаторов частоты в радио величина девиация обычно ограчичена снизу. Поэтому при малых скоростях передачи следует установить минимальную поддерживаемую радио девиацию, так чтобы коэффициент модуляции был как можно ближе к 1.
Re: Si4463 не взлетает
Доброго времени суток. Есть такая проблемка. Взял библиотеку от 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 КБ) 658 скачиваний