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

Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

Сообщение Flash.#13 »

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





Изображение Изображение Изображение
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Реклама
Друг Кота
Сообщения: 9205
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Прикольно ))
Ну кроме тини13 есть и другие МК.
Ну не люблю я асм. Долго и нудно писать...))
Я силабовские модули ещё не ковырял... Надо будет поковырять))
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

Сообщение Flash.#13 »

Они прикольные, и мануал там грамотный, а вот LoRa себя не оправдал, сколько не тестил, лучше не получилось. Кстати в маяке реализован режим ожидания, акумчик там мелкий, и в непрерывной передаче садится за несколько часов, и ребята с форума подцепили фичу, "ждущий маяк". Раз в восемь секунд просыпается, слушает эфир на наличие команды вызова, эта штука позволяет отказаться от кнопки "вкл" впринципе, и сделать корпус герметичным, а еще растянуть акумчик на месяц-полтора.
На радейке с направленной ягой ловил маяк до 10км, правда в чисто-поле, а вот в лесу дальность не превышает полтора-два км.
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Открыл глаза
Сообщения: 57
Зарегистрирован: Ср янв 27, 2010 21:53:52

Сообщение a_b_r_a »

Здравствуйте! Решил поднять тему. Достались мне модули 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();
    }
}
  
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 28
Зарегистрирован: Пт дек 24, 2010 03:33:57
Откуда: Караганда КАЗАХСТАН

Сообщение un7prf »

Всем привет!
Целый год хотел заняться этими модулями, но были заботы поважней.
Задачка та-же, передать несколько дискретных команд на модулях 4432, на уровне вкл/выкл.
У кого есть наработки?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Доброго всем. Решил и я поднять тему. У меня проблема с 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.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Ответить

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