Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить

Re: Кто-нить работал с радиомодулями SI4432?

Ср ноя 21, 2018 18:08:55

Си хорош для ардуино и сложных штук, подцепил библиотеку и радуешся, но у МК память ограничена, не всякий код залезет в небольшую тини13, с 1кб флехи. Делал на базе Si4432 туристический маяк, ну как раньше была игра: "охота на лис", только для 433МГц, работает в аналоговом режиме, типа узкополосный ФМ, а вот идея не моя а с авиафорума (отсюда), они додумались до этого года четыре раньше, но их проект хотел доработать, а их код был на Си не влезал, но ассемблер исправил ситуацию.





Изображение Изображение Изображение

Re: Кто-нить работал с радиомодулями SI4432?

Ср ноя 21, 2018 18:54:22

Прикольно ))
Ну кроме тини13 есть и другие МК.
Ну не люблю я асм. Долго и нудно писать...))
Я силабовские модули ещё не ковырял... Надо будет поковырять))

Re: Кто-нить работал с радиомодулями SI4432?

Ср ноя 21, 2018 19:36:13

Они прикольные, и мануал там грамотный, а вот LoRa себя не оправдал, сколько не тестил, лучше не получилось. Кстати в маяке реализован режим ожидания, акумчик там мелкий, и в непрерывной передаче садится за несколько часов, и ребята с форума подцепили фичу, "ждущий маяк". Раз в восемь секунд просыпается, слушает эфир на наличие команды вызова, эта штука позволяет отказаться от кнопки "вкл" впринципе, и сделать корпус герметичным, а еще растянуть акумчик на месяц-полтора.
На радейке с направленной ягой ловил маяк до 10км, правда в чисто-поле, а вот в лесу дальность не превышает полтора-два км.

Re: Кто-нить работал с радиомодулями SI4432?

Пн янв 28, 2019 14:14:49

Здравствуйте! Решил поднять тему. Достались мне модули 4432. И я решил сделать радиоуправление на несколько команд с их помощью. А заодно интересно разобраться со всей этой кухней. Подключил их к Atmega8. Один модуль ПРМ, второй ПРД. При инициализации указал режим PH+FIFO. Примеры брал со статьи на Хабре, т. к. в Си особо не силен. Передаю 8 байт данных. И приемник видит передатчик, получает данные, CRC ошибок нет. Видит длину пакета, но в Com порт передается только содержимое последнего байта из буфера FIFO приемника. Т.е. последний байт у меня 0x17. и в массив пишется 17,17,17,17,17,17,17,17. Два дня бьюсь, и не понимаю, в чем дело. Прикрепляю код обработки принятых данных. Сильно не пинайте, я только учусь.
Спойлер
Код:
/*
 * SI4432.c
 *
 * Created: 09.12.2018 20:38:02
 * Author :
 */

#include "main.h"

void rx_on(void)
{
   unsigned int i;
   unsigned int length;
   unsigned char payload[8];
   
   if (BitIsClear(PIND,2)) // Поступило прерывание
   {
      ItStatus1 = SpiReadRegister(0x03); //Чтение статусных регистров
      ItStatus2 = SpiReadRegister(0x04);
      
      if( BitIsSet(ItStatus1, 0) )// Если произошла ошибка CRC.
      {
         SpiWriteRegister(0x07, 0x01); // READY Mode (Xtal is ON)
         SpiWriteRegister(0x08, 0x02); //сброс RX FIFO
         SpiWriteRegister(0x08, 0x00);
         usart_transmit('E'); // Передаем ошибку
         SpiWriteRegister(0x07, 0x05); //включение приёмника
      }
      else if( BitIsSet(ItStatus1, 1) ) // Принят валидный пакет.
      {
         SpiWriteRegister(0x07, 0x01); //READY Mode (Xtal is ON)
         length = SpiReadRegister(0x4B); //Чтение длины принятых данных
         //usart_transmit(SpiReadRegister(0x4B)); // Передаем длину пакета данных
         
         //Обработка принятых данных из RX FIFO
         for(i=0; i<length; i++)
         {
            payload[i] = SpiReadRegister(0x7F); //чтение FIFO Access регистра
         }
         usart_transmit(payload[0]);
         usart_transmit(payload[1]);
         usart_transmit(payload[2]);
         usart_transmit(payload[3]);
         usart_transmit(payload[4]);
         usart_transmit(payload[5]);
         usart_transmit(payload[6]);
         usart_transmit(payload[7]);
      }
   }
   
   //сброс RX FIFO
   SpiWriteRegister(0x08, 0x02);
   SpiWriteRegister(0x08, 0x00);
   //----------//
   SpiWriteRegister(0x07, 0x05); //включение приёмника
}


int main(void)
{   
   extern unsigned char ItStatus1;
   extern unsigned char ItStatus2;   
//----------   
    port_init();  // Инициализация портов МК
   spi_ini();  // Инициализация SPI
   //SI4432_ini_TX(); // Инициализация передатчика
   SI4432_ini_RX(); // Инициализация приёмника
   usart_ini(8); // Инициализация USART, скорость 115200   
//----------   
    while (1)
    {         
      //tx_on();
      rx_on();
    }
}
 

Re: Кто-нить работал с радиомодулями SI4432?

Вт апр 02, 2019 22:12:09

Всем привет!
Целый год хотел заняться этими модулями, но были заботы поважней.
Задачка та-же, передать несколько дискретных команд на модулях 4432, на уровне вкл/выкл.
У кого есть наработки?

Re: Кто-нить работал с радиомодулями SI4432?

Чт янв 18, 2024 16:27:50

Доброго всем. Решил и я поднять тему. У меня проблема с Si4432.
Задача: Нужно получить пакет с некоего фабричного изделия, которое передает пакеты в эфир вообще через другой чип (другого производителя), однако формат эфирного пакета совместим с Si4432.
Формат пакета:
1. Преамбула 32 бита.
2. Синхрослово 32 бита.
3. Данные 10 байт.

Соорудил с помощью RTL-SDR, GNU RADIO и какой-то матери приемник этих пакетов.
GNURADIO принимает пакеты корректно. А вот Si4432 почти корректно, но с одним НО:
При чтении данных из FIFO, вылазит сначала последний байт пакета, потом второй, третий ... и последний.
Покажу наглядно.

Пакет, принятый GNURADIO:
Код:
pdu length =         10 bytes
pdu vector contents =
0000: f1 eb 24 a7 05 97 60 06 00 a9
************************************

А вот как его принял Si4432:
Код:
A9 EB 24 A7 05 97 60 06 00 A9


При этом, если я отправляю через Si4432 свой пакет в эфир (числа от 0 до 9), то GnuRadio его принимает корректно:
Код:
pdu length =         10 bytes
pdu vector contents =
0000: 00 01 02 03 04 05 06 07 08 09
************************************


Второй день уже воюю :kill:

PS: Разобрался. Просто неправильно читал из FIFO. Я каждый байт выдергивал функцией чтения регистра. А нужно было сделать Burst Read.
Ответить