Moduł do komunikacji radiowej rs12b Kornel Jakubczyk
Transkrypt
Moduł do komunikacji radiowej rs12b Kornel Jakubczyk
rf12b
Moduł do komunikacji radiowej rs12b
Kornel Jakubczyk
Agenda
Ogólnie
Piny i podłączenie
Wysyłanie i odbiór
Przykład kodu wraz z omówieniem konfiguracji
Kod z http://loee.jottit.com/
Właściwości
Zintegrowany nadajnik/obiornik
Komunikacja SPI
Dodatkowo wymaga tylko anteny, ew
zewnętrznego kryształu, mikrontrolera
Może służyć do budzenia mikrontrolera
przerwaniem
Automatyczne poprawki częstoliwości
Konfigurowalne wyjście informujące o sile
sygnału (RSSI)
Właściwości cd
Wykrywanie niskiego poziomu baterii
Wbudowany timer budzący po wykryciu
nadawanego sygnału
16 bitowy bufor na odbierane dane
rf12b
Zasilanie zalecane 3.3V
(Ponoć 5V powinno działać)
Zasięg w otwartej przestrzeni conajmniej
kilkadziesiąt metrów, ponoć nawet kilkaset
Po starcie mikrokontrolera należy odczekać
100-200ms na start modułu?
Wymaga zasilania dobrej jakości?
Po wysłaniu ramki również należy nieco
odczekać?
Więcej w linku do forum elektroda.pl
Zauważmy podłączenie
Przykład podłączenia
Piny
1 SDI wejście danych SPI (do MOSI)
2 SCK wejście zegar SPI
3 nSEL (do SlaveSelect) SPI (aktywne przy
niskim poziomie)
4 SDO wyjście SPI
5 nIRQ wyprowadzenie przerwania (aktywne
przy niskim poziomie)
Piny cd
6 nFFS wejście uruchamia podawanie
zawartości fifo na pinie SDO (w stanie niskim)
7 FFIT przerwanie pełnego FIFO (aktywne w
stanie wysokim)
8 CLK wyjście zegara dla mikrokontrolera
9 zewnętrzne napięcie referncyjne
10 nRES reset
16 VDI wyjście sygnalizujące odbiór
poprawnych danych
Potencjalne źródła przerwania
Gotowość do odbioru następnego bajtu rejestru
nadawania
FIFO otrzymało odpowiednią ilość bitów
Power-on reset (POR)
Przepełnienie FIFO / underrun rejestru
nadawania
Wake-up timer timeout (WKUP)
Impuls na nINT (EXT)
Napięcie zasilania poniżej zaprogramowanej
wartości (LBD)
Komunikacja
Polecenia do nadajnika wysyłane są przez SPI.
Bity na wejściu SDI są czytane przy rosnącym
zboczu zegara SCK, gdy pin nSEL (SS) jest w
stanie niskim.
Rozróżniane jest 17 poleceń, większość 16
bitowych
Kiedy stan nSEL jest wysoki, aktywny jest
interfejs szeregowy.
MSB wysyłane są pierwsze
Power On Reset (POR) resetuje wszystkie
ustawienia
Tryby pracy
”szeregowy” generowany jest sysgnał zegara
dla danych, a innym pinie generowane (lub
chyba odbierane) są same dane (odpowiednio
na pinach 7 i 6) (nie będziemy omawiać)
Z użyciem rejestru danych, wymaga włączenia
bitu el i podłączenia pinu DATA do wysokiego
poziomu napięcia
Odbiór z użyciem FIFO
16 bitów wypełnianych, kiedy wykryte są
prawidłowe dane, co może sygnalizować pin
VDI
Znów dwa tryby:
Za pomocą przerwania – można skonfigurować je
po odebraniu wskazanej liczby bitów, po otrzymaniu
przerwania należy sprawdzić status i odczytać
zawartość FIFO poleceniami SPI
Za pomocą odpytywania – należy ustawić
przerwanie po odebraniu 1 bitu, również można
użyć poleceniami SPI do odczytu
Polling read mode
Rekomendwany rozmiar pakietów
Preambuła
Synchron word
(id sieci)
CRC
minimum
4 - 8 bitów (1010b
lub 0101b)
D4h (ustawialne)
4bity do 1 bajt
zalecane
8 -12 bit (np. AAh
lub 55h)
2DD4h (cześć D4
jest ustawialna)
2 bajty
Nadawanie z użyciem rejestru
2 rejestry 8 bitowe, wykorzystywane
naprzemian
Inicjowane na AAh co odpowiada preambule
Należy włączyć bit el, jego wyzerowanie czyści
rejestry
Pin SDO sygnalizuje gotowość do odebrania
bajtu
Przykład w przykładzie
Wykres
Odczyt statusu
Jedyna komenda zaczynająca się od zera (więc
wystarczy samo zero)
Po jego odebraniu kolejne bity są taktowane na
pin SDO
Komenda odczytu czyści bity
Obrazek
Ciekawsze bity
Powód przerwania, w tym pierwszy bit to FFIT,
być może wystarczy więc odczytać tylko go,
ignorując resztę co może upraszcza program
Wykrycie odpowiednio silnego sygnału
OFFS – znak i wartość o które należy zmienić
aktualną częstotliwość w celu dostowania do
nadajnika
Przykład
Przykładowy kod z noty jest wadliwy, trzeba
zmienić przynajmniej konfigurację odbiornika
Rozważymy więc inny może lepszy na
początek
Autor twierdzi, że działa
Szczegóły poleceń SPI w nocie katalogowej
Link do przykładu na końcu
Programowe SPI
int writeCmd(unsigned int cmd) {
recv = 0;
LO(SCK);
LO(CS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( PINB&(1<<SDO) ) { recv|=0x0001; }
LO(SCK);
cmd<<=1;
}
HI(CS);
return recv;
}
Konfiguracja nadajnika
Configuration Setting Command
writeCmd(0x80E7); //EL,EF,868band,12.0pF
Bit 7 el wewnętrzny rejestr
Bit 8 ef włącza FIFO
5-4 wybór częstotliwości
3-0 Crystal Load Capacitance
Power Management
●
writeCmd(0x8239); //!er,!ebb,ET,ES,EX,!eb,
!ew,DC
Bity do ustawienia
Er odbiornik
Ebb układ od czestotliwości nośnej odbiornika
Et ogólnie elementy nadajnika
Es synthesizer włączany też przez et
Ex oscylator
Ew Wakeup Timer, eb low battery
DC – wyłącza zegar dla mikrokontrolera
Kontrola częstotliwości
writeCmd(0xA640); //frequency select
Parametr F – bity 11-0
Powinien być między 96 i 3903
f0 = 10 * C1 * (C2 + F/4000) [Mhz]
Gdzie dla 868 Mhz C1=2 i C2=43
Czyli z grubsza 860.48 do 879.51
Data Rate Command
writeCmd(0xC647); //4.8kbps
Konfiurowalne od 600 bps do 115.2 kbps
Bit 7 cs 6-0 parametr R
BitRate = 10000 / 29 / (R+1) / (1+cs*7) [kbps]
Dotyczy chyba tylko odbiornika?
Receiver Control Command
writeCmd(0x94A0);
//VDI,FAST,134kHz,0dBm,-103dBm
Bit 10 – funkcja pinu 16 1-VDI 0-wejście
przerwania
9-8 tryb i czas odpowiedzi układu
rozpoznawania danych patrz nota
7-5 Receiver baseband bandwidth
4-3 wzmocnienie sygnału (LNA)
2-0 poziom wykrywania dobrego sygnału RSSI
Filtrowanie danych i clock
recovery
Tryb cyfrowy – próbkuje z częstotliwością 29
razy bit rate. W tym trybie dostępny jest układ
CR który podaje zegar wg danych, używany do
wypełniania FIFO
Tryb slow a Tryb fast – pierwszy daje wyższą
odporność na szumy, ale wymaga dokładniej
taktowanych danych tryb, dłuższej preambuły
Tryb automatyczny, który przełącza między
tymi dwoma
Data Filter Command
writeCmd(0xC2AC); //AL,!ml,DIG,DQD4
7 AL tryb automatyczny clock recovery – tu
zaczyna w trybie fast i przechodzi do slow
6 ml wybór między slow a fast 0 - slow
4 typ filtru dancyh tu cyfrowy (tylko ten działa z
FIFO) patrz nota
2-0 DQD poziom wykrywania dobrych dancyh
FIFO and Reset Mode Command
writeCmd(0xCA81); //FIFO8,SYNC,!ff,DR
7-4 ilość bitów w FIFO generująca przerwanie
3 sp ilość bajtów synchronizacji (1 lub 2) tu 2
2 ff pozwala resetować FIFO
1 ff wypełniaj FIFO po odebraniu bajtów
synchronizacji
0 DR wyłącza wysoką czułość układu na
zakłucenia zasilania resetu
Synchron pattern Command
writeCmd(0xCED4); //SYNC=2DD4
7-0 programowalny bajt synchronizacji (cześć
D4)
10.Auto. Freq. Control
writeCmd(0xC483); //@PWR,NO RSTRIC,!st,!
fi,OE,EN
7-6 konfiguracja AFC kiedy dokonuje pomiaru
patrz nota
5-4 limit na wartość offsetu częstotliwości tu
brak
2 Fi – tryb wysokiej dokładności
1 OE włącza rejestr na offset
0 EN włącza całość
TX Configuration Control
Command
writeCmd(0x9850); //!mp,90kHz,MAX OUT
fout = f0 + (-1)SIGN * (M + 1) * (15 kHz)
Gdzie f0 było wcześniej
M bity 7-4
Bit 8 mp zmienia SIGN na przeciwny
2-0 moc wyjściowa nadajnika
PLL Setting Command
writeCmd(0xCC17); //!OB1, !OB0, LPX, Iddy,
CDDIT, CBW0
6-5konfiguracja sygn. zegara dla mikrontorlera
I inne patrz nota
Wake-Up Timer Command
writeCmd(0xE000); //NOT USED
Pozwala ustawić czas tego zegara
Low Duty-Cycle Command
writeCmd(0xC800); //NOT USED
Pozwala oszczędzać energię zamiast
generować przerwanie zega, co określony tam
czas sprawdza czy nie jest nadawany sygnał
Wymaga kilkukrotnego nadania pakietu przez
nadawcę tak aby odbiornik mógł odebrać
całość
I koniec inicjalizacji
Low Battery Detector and Microcontroller Clock
Divider Command
writeCmd(0xC040); //1.66MHz,2.2V
7-5 dzielnik częstotliwości dla mikrokntrolera
3-0 V próg niskiego napięcia = 2.2 + V * 0.1 [V]
Wysyłanie
void rfSend(unsigned char data){
while(WAIT_NIRQ_LOW());
writeCmd(0xB800 + data);
}
Transmitter Register Write Command
Bity 7-0 bajt do zapisania w rejestrze
Jak wysłać kilka bajtów
I main
Odrobina spania przy starcie
while(1){
LED_ON();
writeCmd(0x0000); // status read ponoć nie działa bez tego
3x
rfSend(0xAA); // PREAMBLE
rfSend(0x2D);
rfSend(0xD4); // SYNC
for(i=0; i<16; i++) {
3x
rfSend(0x30+i);
}
rfSend(0xAA); // DUMMY BYTES
LED_OFF();
for(i=0; i<10000; i++)
// some not very
for(j=0; j<123; j++); // sophisticated delay
}
Odbiornik
Inicjalizacja już była różnica tylko
writeCmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!
ew,DC
Czyli włączamy odbiornik
Odbiór będzie we wspomnianym już trybie poll
Odbieranie
unsigned char rfRecv() {
unsigned int data;
while(1) {
data = writeCmd(0x0000); // odczytaj status
if ( (data&0x8000) ) { // czekamy na dane
data = writeCmd(0xB000); //odczyt
return (data&0x00FF);
}
}
Reciver FIFO Read
Komenda 0xB000 można odczytać (do??) 8
bitów
FIFO reset
FIFO and Reset Mode Command
void FIFOReset() {
writeCmd(0xCA81);
writeCmd(0xCA83);
}
I składając razem
int main(void) {
unsigned char data, i;
LED_ON();
portInit();
rfInit();
FIFOReset();
while(1) {
for (i=0; i<16; i++) {
data = rfRecv() // tu mamy odbiór
}
FIFOReset();
}
Koniec
Teraz czy zadziała?
Źródła
Nota http://www.hoperf.com/rf_fsk/rf12b.htm
http://www.elektroda.pl/rtvforum/topic890223-30.htm
Przykład
http://loee.jottit.com/rfm12b_and_avr_-_quick_start