Робота з радіомодулями SI4432

У статті розглянуто функціональні особливості роботи радіо модуля на мікросхемі ISM (industrial, scientific and medical radio bands) трансивера SI4432. Також наведено прості приклади програмної ініціалізації модуля і описані деякі можливі варіації налаштування.



Опис мікросхеми SI4432
Чутливість приймача -121 dBm. Потужність передавача до +20 dBm (можлива програмна налаштування з кроком 3 dBm). Є вбудована функція рознесеного прийому (Antenna Diversity). Мікросхема здатна працювати на частотах від 240 до 960 МГц з кроком 156 (240-480 МГц) або 312 Гц (480-960 МГц). Також мікросхема має такі особливості як: таймер автоматичного пробудження, детектор низького заряду батареї, 64-х байтний буфер прийому/передачі, автоматичний обробник пакетів, датчик температури, 8-ми розрядний АЦП, джерело опорної напруги, три висновки GPIO, різні види модуляції сигналу (OOK, FSK, GFSK) та ін

Мікросхема працює від 1.8 до 3.6 В живлячої напруги.

Особливості радтомодуля
На модулі відсутні будь-які стабілізатори напруги, таким чином потрібно відповідне забезпечення харчування і відповідний рівень на входах логічних. На модулі видна ще одна дрібна шестивыводная мікросхема з маркуванням G4C. Це мікросхема uPG2179TB, яка виконує функцію перемикання антени між висновками TX і RX, забезпечуючи тим самим можливість роботи модуля в режимі прийому, так і в режимі передачі. Управління мікросхемою перемикача здійснюється самої SI4432 по портам GPIO0 і GPIO1, які, при ініціалізації потрібно відповідно запрограмувати, для зміни/установки режиму прийому/передачі. При цьому дана схемотехнічна конфігурація не дозволяє використовувати функцію очах розніженого прийому, а функціонування висновків GPIO0 і GPIO1 повинно бути відведено лише на управління перемикачем uPG2179TB.

Номінали конденсаторів і індуктивностей встановлених в обв'язці антенних входів SI4432 повинні вибиратися виходячи з робочого частотного діапазону, характеристик антени і діапазон живлячих напруг. Які саме номінали мають зазначені елементи невідомо.

Схему модуля, саме того, який наведено на рисунку я не знайшов, але за інформацією з даташита можна встановити терморегулятори модуля:

image

NSEL, SCLK, SDI, SDO — інтерфейс SPI (робота з SI4432 зводиться до запису та читання регістрів SI4432 по інтерфейсу SPI);

NIRQ — висновок переривань (якщо відбулася подія прийом/передача тощо, то рівень на цьому виводі падає до 0, які саме події будуть приводити до переривань залежить від значення бітів у відповідних регістрах);

SDN — висновок управління режимом роботи SI4432, якщо встановити високий рівень на SDN, то SI4432 переходить в режим Shutdown, в якому мікросхема переходить режим енергозбереження з струмом споживання нА 15, при цьому вміст регістрів повертається до вихідного стану і неможлива передача даних по SPI;

VDD — харчування модуля від 1.8 до 3.6;

GND — «земля»;

GPIO0, GPIO1, GPIO2 — програмовані порти введення/виводу (якщо не перепоювати модуль, то під свої цілі можна запрограмувати тільки GPIO2, так як GPIO0 GPIO1 вже зайняті " для перемикання режиму прийому/передачі).

Налаштування модуля
Всі налаштування регістрів наведені нижче взяті з документу AN415 Programming guide. В даному файлі висвітлені питання використання SI4432 в якості передавача, приймача, передавача, а також розглядається питання передачі пакетів з довжиною понад 64 кбайт.

Мікросхеми SI4432 бувають різних ревізій: A, V, B. Визначається першою літерою в шифрі, в моєму випадку BPS10P, значить ревізія B. Для різних ревізій є деякі особливості в ініціалізації.

Підключення до контролера

Підключення модуля проводиться у відповідності з розпіновкою наведеної вище. Для простого прийому або передачі даних висновки GPIO можна не заводити на входи мікроконтролера і залишити їх висять у повітрі. Висновки SPI підключаються до відповідних висновків мікроконтролера, NIRQ можна повісити на будь-який вільний висновок мікроконтролера (напевно краще на такий висновок, де можна отримати зовнішнє переривання по фронту). SDN можна завести на «землю» або на вивід МК, але при цьому не забути встановити його в 0.

Читання і запис по SPI

Виробник SI4432 пропонує використовувати наступні функції для читання та запису регістрів по SPI.

Запис:

void SpiWriteRegister (U8 reg, U8 value)
{
//Передавання даних з подвійною буферизацією
//Вибір модуля шляхом встановлення NSEL 0
NSS = 0;
//Запис адреси регістра в буфер SPI МК
//Установка старшого біта в адресі регістра необхідна для проведення операції запису (всього 127 регістрів)
SPI1DAT = (reg|0x80); 
//Очікування відправки байта
while( SPIF1 == 0);
SPIF1 = 0;
//Запис бажаного значення регістра SI4432 в буфер SPI МК
SPI1DAT = value; 
//Очікування відправки байта
while( SPIF1 == 0); 
SPIF1 = 0;
//Відпустку модуля
NSS = 1;
}

Читання:

U8 SpiReadRegister (U8 reg)
{
//Вибір модуля шляхом встановлення NSEL 0
NSS = 0;
//Запис адреси регістра в буфер SPI МК (старший біт адреси - 0)
SPI1DAT = reg;
//Очікування відправки байта
while( SPIF1 == 0);
SPIF1 = 0;
//Запис довільних даних в буфер SPI МК
//Під час передавання цих даних МК прочитає значення регістра SI4432 
SPI1DAT = 0xFF; 
//Очікування відправки байта
while( SPIF1 == 0);
SPIF1 = 0;
//Відпустку модуля
NSS = 1;
//Читання і повернення функції прочитаних отриманих донних з регістра SI4432
return SPI1DAT;
}

Ініціалізація. Початок роботи

Рекомендується виконати наступні маніпуляції.

1) Встановити висновок SDN в 0.
2) Почекати 15 мс, до відправки команд по SPI.
3) Прочитати статуси регістрів переривань.
4) Виконати програмний скидання.

SDN = 0; // SDN 0
delay_ms(15);
//читання статусів
ItStatus1 = SpiReadRegister(0x03);
ItStatus2 = SpiReadRegister(0x04); 
//виконання програмного скидання
SpiWriteRegister(0x07, 0x80); //запис 0x80 в регістр Operating & Function Control1
//очікування виникнення переривання 
while ( NIRQ == 1);
//читання статусів
ItStatus1 = SpiReadRegister(0x03); //Interrupt read the register Status1
ItStatus2 = SpiReadRegister(0x04); //Interrupt read the Status2 register

Читання статусів очищає прапори переривань і скидає висновок NIRQ в 1 (коли відбувається переривання NIRQ скидається в 0 і залишається в цьому стані до тих пір доки не буде прочитаний відповідний статусний регістр).

Установка частотних параметрів

Так як мікросхема підтримує роботу в досить широкому діапазоні частот, то конфігурування регістрів відповідальних за частоту досить складно. Виробник пропонує використовувати калькулятор (EZRadioPRO Register Calculator) для розрахунку частотних значень регістрів. Калькулятор являє собою файл Microsoft Excell:



У цьому файлі вже виставлені відповідні значення за замовчуванням. Змінювати значення можна тільки в сірих клітинках. Доцільно міняти в цьому файлі значення комірок відповідальних за швидкість передачі (J9) і несучу частоту(B17). Зазвичай, чим менше швидкість передачі тим менше ймовірність виникнення помилки в процесі передачі даних. Можна вибрати тип модуляції сигналу: FSK, GFSK, OOK.

OOK модуляція кодує дані включенням або виключенням підсилювача сигналу. Коли немає даних для передачі підсилювач відключений, при передачі логічного 0 підсилювач відключений на час тривалості одного біта, при передачі логічної 1 підсилювач включений на час тривалості одного біта.

FSK заснована на зміні частоти сигналу для передачі цифрових даних. Для передачі логічного 0 частота несучого сигналу зменшується на величину відхилення частоти, а для логічної 1 збільшується. Відмінність GFSK від FSK в тому, що GFSK застосовує фільтр Гаусса до бітів даних.

Виробник рекомендує використовувати тип GFSK, так як при цьому типі забезпечується найкраща ефективність роботи і більш чистий спектр сигналу в порівнянні з іншими типами доступних модуляцій, що видно з малюнка (порівняння FSK і GFSK):



Конфігурування регістрів відповідальних за частоту:

//установка центральної частоти 915 МГц
SpiWriteRegister(0x75, 0x75); 
SpiWriteRegister(0x76, 0xBB);
SpiWriteRegister(0x77, 0x80); 
//установка швидкості передачі (9.6 kbps)
SpiWriteRegister(0x6E, 0x4E); 
SpiWriteRegister(0x6F, 0xA5); 
SpiWriteRegister(0x70, 0x2C); 
//встановлення відхилення частоти (+-45 кГц) (необхідний параметр при GFSK модуляції)
SpiWriteRegister(0x72, 0x48); 

Передача пакета даних за допомогою обробника пакетів

Обробник пакетів використовується в режимі прийому і в режимі передачі. Можна передавати дані і без обробника пакетів, в цьому випадку потрібно описувати структуру пакету в регістрах самостійно. Зазвичай структура пакету виглядає наступним чином:



Преамбула (Preamble) — послідовність 0101… використовується для синхронізації приймача і передавача. SI4432 має вбудований детектор преамбули. При налаштуванні SI4432 в регістрах задається значення довжини преамбули і величини порогу детектування преамбули. Якщо довжина преамбули або поріг детектування преамбули буде менше певного значення, то зросте ймовірність втрати пакетів даних. Детектор преамбули шукає преамбулу згідно з порогом детектування. Якщо знайдена відповідна преамбула, то запускається механізм визначення слова синхронізації (Sync Word).

Переданий пакет завжди починається з преамбули (010101… бітовий патерн), яка дозволяє приймачу приготується для прийому переданих даних. Діна преамбули, як і поріг, залежать від налаштувань радіо: типу модуляції, автоматичного частотного підстроювання (AFC). У SI4432 є вбудований детектор преамбули, який автоматично порівнює отримані з ефіру біти з бітовим паттерном преамбули, якщо детектор преамбули виявляє визначену довжину послідовності бітів преамбули в прийнятому сигналі, то SI4432 повідомляє про прийом валидной преамбули в статусних регістрі або за висновку GPIO, якщо проведена відповідна настройка GPIO.

Поріг детектування преамбули — програмована величина. В залежності від типу модуляції (FSK, GFSK, OOK), задіяння автоматичного частотного підстроювання (AFC) і рознесеного прийому (antenna diversity) виробник рекомендує вибирати довжину преамбули і поріг детектування преамбули згідно з таблицею:



AFCПри використанні AFC відбувається запис в регістри Frequency offset 1 і 2 значень зсуву між налаштованими частотами приймача і передавача. Ці значення можна використовувати для більш точної настройки частоти при цьому відключити автоматичне підстроювання частоти і зменшити довжину преамбули і відповідно поріг детектування.
Після успішного детектування преамбули, радіо очікує слова синхронізації. За його приходу порівнює отримані біти. Після успішного порівняння SI4432 починає заповнювати FIFO переданими даними. Слово синхронізації, відома для приймача і передавача послідовності бітів, дозволяє ідентифікувати передані дані.

Якщо передані дані мають довільну довжину (можна зробити фіксовану), то в пакет додається байт з інформацією про довжину переданих даних.

Також в пакет додається контрольна сума CRC.

Використовуючи обробник пакетів, мікроконтролер конфігурує формат переданого пакета один раз при первинній настройці SI4432, потім, щоб передати дані мікроконтролер повинен просто записати їх у відповідний FIFO регістр SI4432.

Відключення заголовка, установка змінного кількості байт переданих даних (кількість переданих байт записується автоматично переданий пакет даних) і 2 байти для слова синхронізації:

SpiWriteRegister(0x33, 0x02);

Про заголовкахЯкщо використовувати заголовок, то обробник пакетів приймача виробляє фильтровку заголовка, тим самим ідентифікуючи з якого передавача прийшло повідомлення.
Безпосередня установка слова синхронізації 0x2DD4:

SpiWriteRegister(0x36, 0x2D);
SpiWriteRegister(0x37, 0xD4); 

Включення обробника пакетів передавача і CRC:

SpiWriteRegister(0x30, 0x0D);

Вибір джерела модуляції FIFO і установка GFSK модуляції:

SpiWriteRegister(0x71, 0x63);

Джерело модуляції — які дані необхідно промодулировать, щоб передати в ефір. В даному випадку FIFO встановлений джерелом. Але є і прямий режим коли біти даних, з певним таймінгом, подаються на який-небудь висновок SI4432 (GPIOn, SDI, NIRQ).

Як було описано раніше, модуль має один висновок під антену і перемикач режиму прийом передача на мікросхемі uPG2179TB, висновки якої заведені на GPIO0 і GPIO1. Таким чином, можна запрограмувати GPIO на автоматичне перемикання:

SpiWriteRegister(0x0B, 0x12);// налаштування GPIO0 для включення режиму передачі TX 
SpiWriteRegister(0x0C, 0x15);//налаштування GPIO1 для включення режиму прийому RX

Точність установки центральної частоти визначається точністю кварцового резонатора, його навантажувальною ємністю, а також різними паразитними ємностями в ланцюзі резонатора. Зменшити вплив зазначених факторів на точність установки центральної частоти можна наступними способами:

1) Використовувати більш високе значення відхилення частоти для передавача і більш широкий діапазон для приймача.

2) Використовувати AFC (Auto-frequency calibration), для цього необхідно збільшити тривалість преамбули.

3) Налаштувати регістр відповідальний за навантажувальну ємність кварцевого резонатора:

SpiWriteRegister(0x09, 0xD7); //запис 0xD7 в регістр відповідальний за навантажувальну ємність 

Відправка пакету

Будемо відправляти пакет разів в секунду.

//головний цикл
while(1)
{
delay_ms(1000);
/*Налаштування змісту пакета*/
//установка довжини переданих даних - 8 байт
SpiWriteRegister(0x3E, 8); //запис 8 в регістр довжини переданих даних
//заповнення FIFO переданими даними
SpiWriteRegister(0x7F, 0x42); 
SpiWriteRegister(0x7F, 0x55); 
SpiWriteRegister(0x7F, 0x54); 
SpiWriteRegister(0x7F, 0x54); 
SpiWriteRegister(0x7F, 0x4F); 
SpiWriteRegister(0x7F, 0x4E);
SpiWriteRegister(0x7F, 0x31); 
SpiWriteRegister(0x7F, 0x0D); 
//Відключення всіх переривань крім переривання по відправленні пакета
//Це зроблено для сповіщення МК про успішну відправку
SpiWriteRegister(0x05, 0x04); 
SpiWriteRegister(0x06, 0x00); 
//Читання регістрів статусів переривань, для очищення поточних переривань і скидання NIRQ в лог. 1
ItStatus1 = SpiReadRegister(0x03); 
ItStatus2 = SpiReadRegister(0x04); 
/*активація передавача*/
//При цьому радіомодуль формує пакет та надсилає його автоматично
SpiWriteRegister(0x07, 0x09); 
//Очікування переривання по відправленню
while(NIRQ == 1);
//читання статусних регістрів для очищення прапорів переривань
ItStatus1 = SpiReadRegister(0x03); 
ItStatus2 = SpiReadRegister(0x04); 
}

Прийом пакета даних за допомогою обробника пакетів

Ініціалізація радіо

Ініціалізації приймача аналогічна ініціалізації передавача. Необхідно зробити скидання і прочитати регістри статусу.

Установка частоти

//установка центральної частоти 915 МГц
SpiWriteRegister(0x75, 0x75); 
SpiWriteRegister(0x76, 0xBB);
SpiWriteRegister(0x77, 0x80); 

Параметри радіо: 9,6 kbps, модуляція GFSK, відхилення частоти від 45 кГц, приймальний діапазон 112,1 кГц. Згідно з калькулятором частоти заповнюються наступні регістри:

SpiWriteRegister(0x1C, 0x05); //запис 0x05 в IF Filter Bandwidth регістр
SpiWriteRegister(0x20, 0xA1); //запис 0xA1 у Clock Recovery Oversampling Ratio регістр
SpiWriteRegister(0x21, 0x20); //запис 0x20 у Clock Recovery Offset 2 регістр
SpiWriteRegister(0x22, 0x4E); //запис 0x4E у Clock Recovery Offset 1 регістр
SpiWriteRegister(0x23, 0xA5); //запис 0xA5 у Clock Recovery Offset 0 регістр
SpiWriteRegister(0x24, 0x00); //запис 0x00 у Clock Recovery Timing Loop Gain 1 регістр
SpiWriteRegister(0x25, 0x13);//запис 0x13 у Clock Recovery Timing Loop Gain 0 регістр
SpiWriteRegister(0x1D, 0x40); //запис 0x40 в AFC Loop Gearshift Override регістр
SpiWriteRegister(0x72, 0x1F); //запис 0x1F в Frequency Deviation регістр
SpiWriteRegister(0x2A, 0x20); //запис 0x20 в AFC Limiter регістр

Установка структури пакета

Аналогічно передавача: відключення заголовка, установка змінного кількості байт переданих даних (кількість переданих байт записується автоматично переданий пакет даних) і 2 байти для слова синхронізації:

SpiWriteRegister(0x33, 0x02);

Відключення фільтрації заголовків:

SpiWriteRegister(0x32, 0x00 );

Безпосередня установка слова синхронізації 0x2DD4:

SpiWriteRegister(0x36, 0x2D);
SpiWriteRegister(0x37, 0xD4); 

Включення обробника пакетів приймача і CRC:

SpiWriteRegister(0x30, 0x85);

Включення режиму FIFO і GFSK модуляції:

SpiWriteRegister(0x71, 0x63);

Установка порогу детектування преамбули 20 біт:

SpiWriteRegister(0x35, 0x28);

Установка GPIO на автоматичне перемикання антени:

SpiWriteRegister(0x0B, 0x12);// налаштування GPIO0 для включення режиму передачі TX 
SpiWriteRegister(0x0C, 0x15);//налаштування GPIO1 для включення режиму прийому RX 

Про фіксованій довжині пакетаПри фіксованій довжині пакету, дані про довжину не включаються в пакет, а зберігаються в регістрі Transmit Packet Length як приймача, так і передавача, при цьому повинен бути виставлений біт fixpklen в регістрі Header Control 2 (див. карту регістрів
Якщо не використовується рознесений прийом, біт SGI в регістрі AGC повинен бути встановлений для коректної роботи контролю аналогового посилення:

SpiWriteRegister(0x69, 0x60);

Настроика регістра відповідального за навантажувальну ємність кварцевого резонатора:

SpiWriteRegister(0x09, 0xD7); //запис 0xD7 в регістр відповідальний за навантажувальну ємність 

Прийом пакету

Активація приймача:

SpiWriteRegister(0x07, 0x05);//запис 0x05 в Operating Function Control 1 регістр

Включаємо два переривання:

1) переривання по прийому валідного пакета;
2) Переривання по помилці CRC.

SpiWriteRegister(0x05, 0x03); //запис 0x03 в Interrupt Enable 1 регістр
SpiWriteRegister(0x06, 0x00); //запис 0x00 в Interrupt Enable 2 регістр

Читання статусних регістрів для скидання переривань:

ItStatus1 = SpiReadRegister(0x03); 
ItStatus2 = SpiReadRegister(0x04);

Головний цикл:

while(1)
{
//очікування переривання
if(NIRQ == 0)
{
//Читання статусних регістрів
ItStatus1 = SpiReadRegister(0x03); 
ItStatus2 = SpiReadRegister(0x04);
if( (ItStatus1 & 0x01) == 0x01 )//помилка CRC
{
//відключення передавача
SpiWriteRegister(0x07, 0x01);//запис 0x01 в Operating Function Control 1 регістр
//скидання RX FIFO
SpiWriteRegister(0x08, 0x02);//запис 0x02 в Operating Function Control 2 регістр
SpiWriteRegister(0x08, 0x00);//запис 0x00 в Operating Function Control 2 регістр 
//включення приймача
SpiWriteRegister(0x07, 0x05);
}
if( (ItStatus1 & 0x02) == 0x02 )//прийнятий пакет валідний
{
//відключення передавача
SpiWriteRegister(0x07, 0x01);//запис 0x01 в Operating Function Control 1 регістр
//Читання довжини прийнятих даних
length = SpiReadRegister(0x4B);//читання регістра Received Packet Length 
//Обробки прийнятих даних з RX FIFO
for(temp8=0;temp8 < length;temp8++)
{
payload[temp8] = SpiReadRegister(0x7F);//читання FIFO Access регістра
}
//робота з масивом прийнятих даних
{
//...
}
//скидання RX FIFO
SpiWriteRegister(0x08, 0x02);//запис 0x02 в Operating Function Control 2 регістр
SpiWriteRegister(0x08, 0x00);//запис 0x00 в Operating Function Control 2 регістр 
//включення приймача
SpiWriteRegister(0x07, 0x05);
} 
}
}

Висновок
Вся информацияпо програмування модулів взята з Application Note 415 Programming guide.

даташіте на SI4432 є список всіх Application Note, що представляють собою щось на зразок миркоотчетов пов'язаних з роботою SI4432. Крім даташита зазначеного Programming guide, є серед Application Note ще один корисний документ — карту регістрів. У Programming guide також описана налаштування трансмітера для двостороннього зв'язку. В карті регістрів дано докладний опис всіх регістрів, режимів роботи і параметрів.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.