Motivační úkol
Sestavme si dvojici uživatelských programů pro dvojici nezávislých modulů IQRF. Jedním bude vysílač vydávající pokyn prostřednictvím RF paketu. Zpráva bude obsahovat počet bliknutí, které má provést modul druhý. Vzhledem k tomu, že vysílači nějakým způsobem musíme sdělit jaká data má odeslat, využijeme SPI a to v kombinaci s procesorem AVR – ATMEGA16. Na straně modulů IQRF bude práce velice jednoduchá:
Zdrojový kód vysílače:
#include "includes/template-basic.h" #pragma optimize 1 void APPLICATION() { // nastaveni WTD WDTCON = 0b0000.1111; OPTION |= 0b0000.1111; // nastaveni dob pro bliknuti LED setOnPulsingOUT2(5); setOffPulsingOUT2(10); // povoleni SPI enableSPI(); // vymazani WDT clrwdt(); while (1) { clrwdt(); // přečte status sb. SPI getStatusSPI(); // pokud přišel paket if (_SPIRX) { // a CRC není v pořádku if (!_SPICRCok) // zpráva se zahodí goto restartSPI; // jinak jsou přesunuta data do SPI bufferu... bufferRF[0] = bufferCOM[0]; // blikne LEDkou pulseLED(); // nastaví délku RF paketu na 1 DLEN = 1; // odešle RF paket RFTXpacket(); restartSPI: // restart st. Automatu startSPI(0); } // konec podminky } // konec while }// konec app
Zdrojový kód přijímače:
#include "includes/template-basic.h" #pragma optimize 1 void APPLICATION() { uns8 pocet_bliku = 0; WDTCON = 0b0000.1111; OPTION |= 0b0000.1111; setOnPulsingOUT2(5); setOffPulsingOUT2(10); while (1) { clrwdt(); // pokud je přijat RF paket if (RFRXpacket()) { // přečte se počet bliknutí // ... ale může jít prakticky o cokoliv... pocet_bliku = bufferRF[0] - '0'; // a bliká tak dlouho dokud má... while (pocet_bliku) { pocet_bliku -= 1; pulseOUT2(); waitMS(500); clrwdt(); } clearBufferINFO(); copyBufferINFO2RF(); } } }
S využitím vývojového SW IQRF IDE je možné uvedené zdrojové kódy vyzkoušet. Pro propojení s mikrokontrolérem je již nutné pochopit jakým způsobem moduly IQRF po sběrnici SPI komunikují.
SPI a IQRF
Moduly IQRF komunikují prostřednictvím SPI jako Slave. Mastera tedy v našem případě bude přestavovat ATMEGA16. V systému IQRF je implementován stavový automat související s použitým protokolem. To umožňuje minimální prodlevy mezi přijetím a zpracováním dat. Veškeré zpracování dat na sběrnici probíhá v pozadí za plné rychlosti, v případě, že modul zpracovává RF pakety je rychlost omezena na polovinu vložením prodlev mezi daty.
Komunikace je zahájena stažením linky SS (slave select) na log. úroveň „0“. Poté musí Master vyčkat alespoň 10us. Každý z následujících osmi hodinových cyklů jsou vzorkována dat.
Mezi jednotlivými bajty musí být uvolněna linka (do log „1“) SS nejméně na dobu 20uS. Další bajt může v HI speed módu přijít nejdříve za 100us, v LOW speed za 500us.
IQRF zná dva druhy paketů:
- Test stavu SPI
- Datový paket
Test stavu SPI je prováděn odesláním jednoho nebo více bajtů s hodnotou 0x00.
Možné odpovědi (SPI STAT):
- 0x00 – SPI nepravuje (zastaveno prostřednictvím disableSPI();
- 0x07 – SPI zastaveno prostřednictvím stopSPI();
- 0x3F – SPI není připraveno, plný buffer, poslední CRC OK
- 0x3E – SPI není připraveno, plný buffer, poslední CRC špatně
- 0x40 – 0x63 – připravena data v bufferu, počet dat je určuje hodnota
- 0x80 – SPI připraveno – komunikační mód
- 0x81 – SPI připraveno – programovací mód
- 0x82 – SPI připraveno – ladící mód
- 0x83 – SPI pravuje ve SLOW mode, nutné zvětšit T2 – již popsáno
Přenos dat má následující formát paketu:
Nejprve je odeslám SPI_CMD, ten má hodnotu 0xF0, dále je odeslán bajt PTYPE:
Kde CTYPE nabývá zpravidla hodnoty 0b10 (FULL DUPLEX) méně často 0b00 (HALF DUPLEX, kde není přepisován bufferCOM u Slave). SPIDLEN udává délku dat (parametr DLEN v aplikačním SW).Dále již následují samotná data ukončená CRC, kde CRC pro master je počítáno jako:
CRC pro Slave:
Zpráva s příkazem pro 5 bliknutí by tedy vypadala takto:
F0.81.35.1B.
I přesto, že protokol vypadá velice jednoduše, můžeme si práce ještě zjednodušit. Využijeme hotové knihovny Bc. Miroslava Šedivého (ke stáhnutí na konci článku, stejně jako kompletní projekt pro procesor ATMEGA16).
Komunikujeme s AVR
K vyzkoušení komunikace budeme potřebovat především vhodně zapojený mikroprocesor ATMEGA16. V mém případě to bude vývojová deska z produkce PK-DESIGN (MB-ATmega16/32(L) v2.0). Port B, na kterém je rozhraní SPI, je stejně jako ostatní porty vyveden na konektor a propojení s modulem IQRF, bude tedy velmi rychlou záležitostí. Jako „základnu“ pro modul IQRF byla využita vývojová deska DK-PGM-01, ale je možné využít téměř jakékoliv zapojení, kde jsou vyvedeny všechny čtyři komunikační linky modulu.
Propojení komunikačních linek:
- SDO - MISO
- SDI - MOSI
- SCK - SCK
- SS - SS
- GND - GND
Pro směr ATMEGA -> IQRF by bylo vhodné vložit do cesty proudu rezistor například o hodnotě 100R kvůli rozdílům v napájecím napětí procesoru a modulu. Mé zapojení rezistory postrádalo, přesto bylo funkční po celou dobu testování.
Ukázka možného zapojení:
Protože se nám jedná pouze o ukázku využití SPI, nebudeme si program pro AVR nijak komplikovat. Po jeho restartu se pouze odešle zpráva obsahující jeden datový bajt (znak ‘3’), IQRF jej odešle na RF a přijímač si třikrát blikne...
/* verze pro ATMEGA16 */ #include#include #include "spi.h" #include "iqrf.h" int main(void) { // inicializace SPI v master modu SPI_MasterInit(); IQRF_Check(); IQRF_SendByte('3'); for(;;) { } return 0; }
Z výše uvedeného zdrojového kódu je patrné usnadnění, které nám knihovna přináší. Pokud by některý z čtenářů vytvářel knihovnu i pro jiné typy procesorů a byl ochoten uveřejnit jejich kód, byl by v rámci článků o IQRF pro tuto činnost prostor.
DOWNLOAD & Odkazy
- BLINK_TEST.zip (1.18 KB)
- FW pro ATMEGA16 (46.27 KB)
- Popis základové desky MB-ATmega16/32(L) v3.0
- IQRF Prafkticky I
- IQRF Prafkticky II
- IQRF Prafkticky III
- IQRF Prafkticky IV
- Inteligentní bezdrátová pojítka? Ano – IQRF
- TEST modulů IQRF - miniaturní vestavná radiová komunikace
- IQRF moduly v HW Shopu
- Domovská stránka projektu IQRF - http://www.iqrf.com/
- Domovská stránka MICRORISC s.r.o. - http://www.microrisc.com/
Komentáře
Displej
Dobry den,
je mozne nekde dohledat pripojeni IQRF k displeji?
Diiky moc
Honza