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

Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
- Реклама
Прикольно ))
Ну кроме тини13 есть и другие МК.
Ну не люблю я асм. Долго и нудно писать...))
Я силабовские модули ещё не ковырял... Надо будет поковырять))
Ну кроме тини13 есть и другие МК.
Ну не люблю я асм. Долго и нудно писать...))
Я силабовские модули ещё не ковырял... Надо будет поковырять))
Они прикольные, и мануал там грамотный, а вот LoRa себя не оправдал, сколько не тестил, лучше не получилось. Кстати в маяке реализован режим ожидания, акумчик там мелкий, и в непрерывной передаче садится за несколько часов, и ребята с форума подцепили фичу, "ждущий маяк". Раз в восемь секунд просыпается, слушает эфир на наличие команды вызова, эта штука позволяет отказаться от кнопки "вкл" впринципе, и сделать корпус герметичным, а еще растянуть акумчик на месяц-полтора.
На радейке с направленной ягой ловил маяк до 10км, правда в чисто-поле, а вот в лесу дальность не превышает полтора-два км.
На радейке с направленной ягой ловил маяк до 10км, правда в чисто-поле, а вот в лесу дальность не превышает полтора-два км.
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
- Сообщения: 57
- Зарегистрирован: Ср янв 27, 2010 21:53:52
Здравствуйте! Решил поднять тему. Достались мне модули 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();
}
}
Всем привет!
Целый год хотел заняться этими модулями, но были заботы поважней.
Задачка та-же, передать несколько дискретных команд на модулях 4432, на уровне вкл/выкл.
У кого есть наработки?
Целый год хотел заняться этими модулями, но были заботы поважней.
Задачка та-же, передать несколько дискретных команд на модулях 4432, на уровне вкл/выкл.
У кого есть наработки?
- Реклама
Доброго всем. Решил и я поднять тему. У меня проблема с Si4432.
Задача: Нужно получить пакет с некоего фабричного изделия, которое передает пакеты в эфир вообще через другой чип (другого производителя), однако формат эфирного пакета совместим с Si4432.
Формат пакета:
1. Преамбула 32 бита.
2. Синхрослово 32 бита.
3. Данные 10 байт.
Соорудил с помощью RTL-SDR, GNU RADIO и какой-то матери приемник этих пакетов.
GNURADIO принимает пакеты корректно. А вот Si4432 почти корректно, но с одним НО:
При чтении данных из FIFO, вылазит сначала последний байт пакета, потом второй, третий ... и последний.
Покажу наглядно.
Пакет, принятый GNURADIO:
А вот как его принял Si4432:
При этом, если я отправляю через Si4432 свой пакет в эфир (числа от 0 до 9), то GnuRadio его принимает корректно:
Второй день уже воюю 
PS: Разобрался. Просто неправильно читал из FIFO. Я каждый байт выдергивал функцией чтения регистра. А нужно было сделать Burst Read.
Задача: Нужно получить пакет с некоего фабричного изделия, которое передает пакеты в эфир вообще через другой чип (другого производителя), однако формат эфирного пакета совместим с 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
************************************
Код: Выделить всё
A9 EB 24 A7 05 97 60 06 00 A9
Код: Выделить всё
pdu length = 10 bytes
pdu vector contents =
0000: 00 01 02 03 04 05 06 07 08 09
************************************
PS: Разобрался. Просто неправильно читал из FIFO. Я каждый байт выдергивал функцией чтения регистра. А нужно было сделать Burst Read.
I am DX168B and this is my favourite forum on internet!


