Jste zde

IQRF Prakticky V – SPI

Dnešním dílem budeme pokračovat na téma obousměrné komunikace. Ukázali jsme si jak využít UARTu, což je nepochybně nejvhodnější rozhraní pro použití v kombinaci s PC. Bohužel UART není ze strany systému IQRF podporován v takovém rozsahu jako SPI, kterému se budeme věnovat dnes.

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.

sbernice.png

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.

prodlevy.png

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:

SPI_paket.png

Nejprve je odeslám SPI_CMD, ten má hodnotu 0xF0, dále je odeslán bajt PTYPE:

SPI_PTYPE.png

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:

SPI_MASTER.png

CRC pro Slave:

SPI_SLAVE.png

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í:

SPI_FOTO.png

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

Hodnocení článku: 

Komentáře

Dobry den,
je mozne nekde dohledat pripojeni IQRF k displeji?

Diiky moc

Honza