Arduino uno + rfm_01 + rfm02
- Войдите на сайт для отправки комментариев
Пнд, 09/05/2016 - 22:28
Здравствуйте,
Помогите разобратся с приемником и передатчиком - никак не могу установить устойчивую связь.
Код передатчика
#define RF02FREQ(freq) ((freq-430.0)/0.0025)
#define RF_PORT PORTB
#define RF_DDR DDRB
#define RF_PIN PINB
#define LED_PORT PORTD
#define LED_DDR DDRD
#define LED_PIN PIND
#define SDI 0 // SDI, -> RF02 Atmega PB0 Arduino 8
#define SCK 1 // SCK, -> RF02 Atmega PB1 Arduino 9
#define CS 2 // nSEL, -> RF02 Atmega PB2 Arduino 10
#define IRQ 4 // nIRQ, <- RF02 Atmega PB4 Arduino 12
//------------------// FSK: Pullupto VCC
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
unsigned char test[32]=" 55555 \n";
void rf02_changeText( unsigned char* ptr, uint8_t number){
if (number> 32)number = 32;
memcpy( test, ptr, number);
}
void rf02_sendData(){
rf02_txdata( test, sizeof test);
}
void rf02_trans(unsigned short value)
{ uint8_t i;
cbi(RF_PORT, CS);
for (i=0; i<16; i++)
{ if (value&0x8000) //0x8000
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
sbi(RF_PORT, SCK);
value<<=1;
_delay_us(0.1);
cbi(RF_PORT, SCK);
}
sbi(RF_PORT, CS);
}
void rf02_init(void)
{
RF_PORT=(1<<CS);
RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
for (unsigned char i=0; i<15; i++)
_delay_ms(10); // wait until POR done
rf02_trans(0xCC00); // power settings
rf02_trans(0x8861);// fsk in rfm02 = afc in rf12
// rf02_trans(0x80C7);
rf02_trans(0xC220); // enable tx sync bit, disable low bat detector
//LED_DDR= 0xFF;
}
void rf02_setmodfreq(uint8_t bandwidth)
{
rf02_trans(0x8F80|(bandwidth&7));
//rf02_trans(0x8F70);
}
void rf02_setfreq(unsigned short freq)
{ if (freq<96) // 430,2400MHz
freq=96;
else if (freq>3903) // 439,7575MHz
freq=3903;
rf02_trans(0xA000|freq);
//rf02_trans(0xA640); //= 434 MHz
}
void rf02_setpower(uint8_t power)
{
rf02_trans(0xB000|((power&7)<<8));
}
void rf02_setbaud(unsigned short baud)
{
if (baud<1345)
baud=1345;
if (baud<19000)
rf02_trans(0xD240); // 25% PLL current
else if (baud<37000)
rf02_trans(0xD2C0); // 33% PLL current
else
rf02_trans(0xD200); // 50% PLL current
rf02_trans(0xC800|((344828UL/baud)-1)); // Baudrate= 344827,59/(R+1)
rf02_trans(0xC806);
}
void rf02_txdata( unsigned char * data, uint8_t number)
{
uint8_t i,value;
//rf02_trans(0xc039);
value=0xC6; //1100 0110
cbi(RF_PORT, CS); //nSel
for (i=0; i<8; i++)
{ if (value&0x80) //1000 0000 = 80
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
sbi(RF_PORT, SCK);
value<<=1;
//_delay_us(0.1);
cbi(RF_PORT, SCK);
}
rf02_shiftout(0xAA);
rf02_shiftout(0xAA);
rf02_shiftout(0xAA);//10101010
rf02_shiftout(0x2D);//00101101
rf02_shiftout(0xD4);//11010100
// no checkbit, in experimenting some letters were transmitted wrong!
for (i=0; i<number; i++)
rf02_shiftout(*data++);
sbi(RF_PORT, CS);
sbi(RF_PORT, SCK);
while(RF_PIN&(1<<IRQ)); // wait until transfer done
rf02_trans(0xC001); // TX off after 10us
}
void rf02_shiftout(unsigned char value)
{ uint8_t j;
for (j=0; j<8; j++)
{ while(RF_PIN&(1<<IRQ));
while(!(RF_PIN&(1<<IRQ)));
if (value&128)
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
value<<=1;
}
}
void setup()
{
// CLKPR = 1<<CLKPCE;
//CLKPR = 3;
// Serial.begin(9600);
rf02_init();
rf02_setfreq(RF02FREQ(438)); // 433,92MHz
rf02_setpower(1); // -12dBm
rf02_setmodfreq(3); // 120kHz
rf02_setbaud(19200); // 19200 Baud
}
void loop(){
unsigned char buf[] = { "123456789012345678901234567890 " };
uint8_t crc = 0;
uint8_t i;
rf02_changeText( buf, sizeof buf);
rf02_sendData();
delay(10);
}
Код приемника:
#define RF_PORT PORTB
#define RF_DDR DDRB
#define RF_PIN PINB
#define SDI 3 // RF01 SDI
#define SCK 5 // RF01 SCK
#define CS 2 // RF01 nSEL
#define SDO 4 // RF01 SDO
//----------------- // RF01 niRQ, arduino 02 cannot be changed
//------------------// RF01 nFFS: 1-10k Pullup too Vcc
#define RF01FREQ(freq) ((freq-430.0)/0.0025)
#define rf01_data (rf01_buf + 2)
// nFFS: 1-10k Pullup an Vcc !!!
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
// maximum receive buffer
#define RF_MAX 32
unsigned char rf01_buf[RF_MAX]; // recv buf
#include <util/delay.h>
void rf01_receive(){
rf01_rxdata(rf01_data, 32);
}
void rf01_prepAll(){
rf01_init(); // ein paar Register setzen (z.B. CLK auf 10MHz)
rf01_setfreq(RF01FREQ(438)); // Sende/Empfangsfrequenz auf 433,92MHz einstellen
rf01_setbandwidth(2); // 4 200kHz Bandbreite
rf01_setreceiver(2,4); //2,4 -6dB Verstдrkung, DRSSI threshold: -79dBm
rf01_setbaud(38400); // 19200 Baud
}
static unsigned char sdrssi, sgain;
static char right[] = "123456789012345678901234567890";
void rf01_trans(unsigned short wert)
{ unsigned char i;
cbi(RF_PORT, CS);
for (i=0; i<16; i++)
{ if (wert&32768)
sbi(RF_PORT, SDI);
else
cbi(RF_PORT, SDI);
sbi(RF_PORT, SCK);
wert<<=1;
//_delay_us(1);
cbi(RF_PORT, SCK);
}
sbi(RF_PORT, CS);
}
void rf01_init(void)
{ unsigned char i;
RF_PORT=(1<<CS);
RF_DDR=(1<<SDI)|(1<<SCK)|(1<<CS);
for (i=0; i<11; i++)
_delay_ms(10); // wait until POR done
#define CLC_FRQ 2
rf01_trans(0x0000);
rf01_trans(0xC200|(CLC_FRQ<<6)|0);
//rf01_trans(0xC240);
rf01_trans(0xC42A); // Data Filter: internal
rf01_trans(0xCE88); // FIFO mode
rf01_trans(0xC62C); // AFC settings: autotuning: -10kHz...+7,5kHz
rf01_trans(0xE000); // disable wakeuptimer
rf01_trans(0xCC00); // disable low duty cycle
}
void rf01_setbandwidth(unsigned char bandwidth)
{
rf01_trans(0x8970|((bandwidth&7)<<1));
}
void rf01_setreceiver(unsigned char gain, unsigned char drssi)
{
sdrssi=drssi;
sgain=gain;
}
void rf01_setfreq(unsigned short freq)
{ if (freq<96) // 430,2400MHz
freq=96;
else if (freq>3903) // 439,7575MHz
freq=3903;
rf01_trans(0xA000|freq);
}
void rf01_setbaud(unsigned short baud)
{
if (baud<336)
return;
if (baud<5400) // Baudrate= 344827,58621/(R+1)/(1+CS*7)
rf01_trans(0xC880|((43104/baud)-1));
else
rf01_trans(0xC800|((344828UL/baud)-1));
rf01_trans(0xC806);
}
void rf01_rxdata(unsigned char *data, unsigned char number)
{ unsigned char i,j,c;
rf01_trans(0xC0C1|((sgain&3)<<4)|((sdrssi&7)<<1)); // RX on
rf01_trans(0xCE89); // set FIFO mode
rf01_trans(0xCE8B); // enable FIFO
cbi(RF_PORT, SDI);
for (i=0; i<number; i++)
{ cbi(RF_PORT, CS);
while (!(RF_PIN&(1<<SDO))); // wait until data in FIFO
for (j=0; j<16; j++) // read and discard status register
{
sbi(RF_PORT, SCK);
//asm("nop");
cbi(RF_PORT, SCK);
}
c=0;
for (j=0; j<8; j++)
{ c<<=1;
if (RF_PIN&(1<<SDO))
c|=1;
sbi(RF_PORT, SCK);
_delay_us(0.2);
cbi(RF_PORT, SCK);
}
*data++=c;
sbi(RF_PORT, CS);
}
rf01_trans(0xC0C0|((sgain&3)<<4)|((sdrssi&7)<<1)); // RX off
}
uint16_t error,correct = 0;
void setup() {
Serial.begin(115200);
Serial.println("\nRF02 receive");
delay(250);
rf01_prepAll();
delay(250);
Serial.println("startup");
}
void loop() {
rf01_receive();
char* buf = (char*) rf01_data;
//Serial.println(buf);
(memcmp(right,buf,30) == 0) ? correct++ : error++;
if((error+correct)/100 == 1)
{
Serial.println(float(correct)/(error+correct));
error = correct = 0;
}
}
С изменением задержек, частоты, скорости - удавалось добится примерно 35-40% корректных передач, остальные бьются. Вроде бы это проблема синхронизации приемника и передатчика, но как их синхронизировать - не понятно. Еще пишут, что 5V не очень им нравится, подключил приемник к 3,3, передатчик не вышло (передача не идет, может питания не хватает). Хотя до этого зашивал код в Attiny45 и питал ее от 3,3 работал - но с прежним результатом. Резисторы на nFFS и FSK 10K
Вот вывод Serial:
1234567™љ›њ™љ›њ 121љ›њ™љЌЌОLLЊН MЌП& 12345678908™љ›њ™Н MЌОL 123456789012345678<™љ›њ 123456789012345678901234567890# 123456789012345678901234567890# 1234567њ™љ›њњLЊН MЌОL 12љ›њ™љMЌОLLЊН MЌЗ& 1234567890™љ›њЂ21љ›њ 123456789012345678™љ›њ 123456789012345678901234567890 123456789012345678901234567890# 1234563њ™љ›њЊLЊН MЌОL 12љ›њ™љMЌОLLЊН MЌз& 1234567890™љ›њ™Н MЌОL 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890# 123456;њ™љ›њМLЊН MЌОL 13љ›њ™љMЌОLLЊН MЌз& 1234567890™љ›њ™Н MЌОL 1234567890123456789012345678900 123456789012345678901234567890 123456789012345678901234567890# 12345678900™љ›њ™љ›њ 123456њ™љ›њLLЊН MЌОL 11љЂ678901234›њ™љ›ОO 1234567898123456789012љ›њ 123456789012345678901234567890 123456789012345678901234567890 12;456789012345678901234567890 12345678900™љ›њ™љ›њ 123456њ™љ›њLLЊН MЌОL 19љ›њ™љ MЌОLLЊН MЋз&
Привет, получилось победить модуль?