This is an old revision of the document!
Nodul senzorial Sparrow este echipat cu trei tipuri de senzori: temperatură, umiditate și luminozitate ambientală. Senzorul de luminozitate este analogic și furnizează o tensiune direct proporțională cu nivelul iluminării ambientale. Această tensiune poate fi citită de către microcontrollerul ATMega128RFA1 de pe portul F, pinul 2 (PF2). Senzorul de umiditate și temperatură este de tipul SHT21 și este conectat la interfața I2C a microcontroller-ului.
Transceiver-ul de pe microcontroller-ul ATMega128RFA1 permite acestuia să transmită în diferite benzi din 2.4GHz. Permite viteze de transmisie de 250kbps, 1Mbps și 2 Mbps. Are două moduri de funcționare, Basic și Extended. Modul Extended include multe funcționalități prevăzute de obicei în nivelele de acces la mediu. În acest caz, funcționalitățile sunt cele necesare pentru implementarea IEEE 802.15.4
Interfața cu microcontroller-ul este necesară pentru a comanda transceiver-ul din program și pentru a obține/trimite date către acesta. În cazul RFA1, avantajul major de a avea transceiver-ul și microcontroller-ul pe același chip înseamnă că se pot face transferuri foarte rapide între acestea. RFA1 pune la dispoziție următoarea interfață:
TRX_STATE
, TRX_STATUS
, PHY_RSSI
. Folosirea acestor regiștri este posibilă doar atunci când ceasul transceiver-ului nu este opritTRXFBST
și sfârșitul este TRXFBEND
. Scrierea/Citirea în/din framebuffer va dura întotdeauna un ciclu de ceas, adică avem maxim 128Mbps! Atenție! Scrierea și citirea în/din buffer se face în mod diferit, conform tabelului de mai jos:Operații pe frame buffer | ||
---|---|---|
Operație | Date | Lungime |
Scriere | TRXFBST+1 .. TRXFBEND | TRXFBST |
Citire | TRXFBST .. TRXFBEND-1 | TST_RX_LENGTH |
TRXPR
: Moștenire din timpurile în care microcontroller-ul și transceiver-ul erau în chip-uri separate, TRXPR
este registrul care deține două flag-uri (în trecut doi pini) care afectează transceiver-ul chiar dacă acesta este în sleep.Transceiver-ul de pe RFA1 folosește o mașină de stări pentru a reșine care este modul de operare curent (dacă transmite, recepționează, dacă este în standby, dacă se pregătește să transmită, etc.) Stările care apar sunt:
Tranzițiile între stări sunt fie declanșate de evenimente exterioare, și atunci sunt subliniate cu verde, fie prin comandă de la microcontroller (și atunci sunt fie colorate cu albastru, fie cu roșu).
Regiștrii care se ocupă de controlul și observarea mașinii de stări sunt TRX_STATE
și TRX_STATUS
. TRX_STATE
conține biții ce comandă tranzițiile dintre stări (omitem stările ce nu le vom folosi în cadrul laboratorului, pentru o listă completă consultați datasheet-ul):
TRX_STATE : | TRAC_STATUS2..0 | TRX_CMD4..0 |
---|
Biți | Valoare | Înțeles | Macro GCC | Detalii |
---|---|---|---|---|
TRX_CMD | 0x00 | NOP | ||
0x02 | TX_START | CMD_TX_START | Comandă ce pornește transmiterea pachetelor, similar cu SLPTR | |
0x03 | FORCE_TRX_OFF | CMD_FORCE_TRX_OFF | Transceiver-ul trece imediat în TRX_OFF (delay depinde de starea curentă) | |
0x04 | FORCE_PLL_ON | CMD_FORCE_PLL_ON | Similar, forțează trecerea în starea PLL_ON |
|
0x06 | RX_ON | CMD_RX_ON | Trecerea în RX_ON |
|
0x08 | TRX_OFF | CMD_TRX_OFF | Trecerea în TRX_OFF , ce presupune și terminarea activităților curente |
|
0x09 | PLL_ON | CMD_PLL_ON | Trecerea în starea din care se poate transmite |
TRX_STATUS : | CCA_DONE | CCA_STATUS | TST_STATUS | TRX_STATUS4..0 |
---|
Biți | Valoare | Înțeles | Detalii |
---|---|---|---|
TRX_STATUS | 0x01 | BUSY_RX | Transceiver-ul este ocupat cu primirea unui pachet |
0x02 | BUSY_TX | Transceiver-ul trimite un pachet | |
0x06 | RX_ON | Starea curentă este RX_ON |
|
0x08 | TRX_OFF | Starea curentă este TRX_OFF |
|
0x09 | PLL_ON | Starea curentă este PLL_ON |
|
0x0F | SLEEP | Transceiver-ul este în starea de SLEEP |
|
0x1F | STATE_TRANSITION_IN_PROGRESS | Mașina de stări execută o tranziție |
Accesul la acești biți se poate face la fel ca la orice registru I/O.
TRX_STATE &= 0xe0; // masca corespunzătoare biților TRAC_STATUS2..0 TRX_STATE |= CMD_FORCE_TRX_OFF;
Dat fiind că biții TRAC_STATUS2..0 sunt read-only, putem prescurta la:
TRX_STATE = CMD_FORCE_TRX_OFF;
Folosind structuri:
TRX_STATE_struct.TRX_CMD = CMD_FORCE_TRX_OFF;
TRX_STATE
TRX_STATUS
nu mai contine TRANSITION_IN_PROGRESS in campul de biti TRX_STATUS4..0PLL_ON
. Acest lucru garantează că nu se va începe recepția unui pachet peste frame buffer între momentul în care scriem în buffer și momentul în care pornim transmisiaSLPTR
sau prin comanda TX_START
)RX_ON
RX_START
sau RX_END
TST_RX_LENGTH
Pentru a cunoaște identificatorului nodului din program, trebuie declarată variabila node_address
în felul următor (datorită unui defect-?- de compilator prima variabilă declarată nu ajunge în .data chiar dacă se cere explicit):
uint8_t nod1_address __attribute__((section(".data"))) = 0; uint8_t node_address __attribute__((section(".data"))) = 0;
Nodurile își vor avea trecut identificatorul în node_address
dacă se rulează avrora cu opțiunea update-node-id=true
. Această funcționalitate este asemănătoare cu citirea din EEPROM la un nod real.
Folosiți scheletul de laborator - schelet_labwsn2.zip.
RX_CRC_VALID
din registrul PHY_RSSI
TRX_CTRL_1
, flag-ul TX_AUTO_CRC_ON
<ifauth @admin> Soluția - solutie_labwsn2.zip </ifauth>