RFM22B
RFM22B
Народ кто пробовал работать c rfm22b можете пожалуйста поделиться исходниками на AVR. Мануалы читал, демо на пике смотрел не помогло, глухо, не догоняю видать чего.
- Zheleznjakov
- Нашел транзистор. Понюхал.
- Сообщения: 190
- Зарегистрирован: Сб июн 12, 2010 16:19:17
- Откуда: Россия, Томск
- Контактная информация:
Re: RFM22B
Там все просто, достаточно сходить на сайт и почитать доку
http://www.silabs.com/products/wireless ... 03132.aspx
есть там документ в формате MS Excel позволяет выбрать неоходимую конфигурацию и получить последовательность команд для настройки.
А что за модуль? на каую чстоту?
Я возился с RFM22-433-S2
У вас правда второая ревизия, у неё немного другие команды управления.
http://www.silabs.com/products/wireless ... 03132.aspx
есть там документ в формате MS Excel позволяет выбрать неоходимую конфигурацию и получить последовательность команд для настройки.
А что за модуль? на каую чстоту?
Я возился с RFM22-433-S2
У вас правда второая ревизия, у неё немного другие команды управления.
С уважением, Денис Железняков aka ZiB
Мой блог: http://ziblog.ru
Мой блог: http://ziblog.ru
Re: RFM22B
Конкретно RFM22B-433-S.
Re: RFM22B
Взял за основу http://www.3e-club.ru/view_full.php?id=19&name=rfm22 увы повторить полностью не смог взял 8 меги т.к. 2313 тини небыл она тот момент.
Сваял две платки. Приблуда из перемычек p3 и p4 для того, чтобы можно было включить или отключить усилитель.
Антены представляют из себя два медных покрытых лаком провода 1мм сечением и длиной примерно 17см.
Вроде, все правильно да нихрена не работает. Передачу проверял обыной любительской рацией при поднесении к ней на сантиметра 3-5 в эфире на 434частоте слышен шум от передатчика. Сразу может дело в том, что слишком слабо, т.к. у передатчика мощность куда больше. Помогите народ, два месяца пытаюсь заставить работать да нифига.

Код в передатчике
Код в приемнике
Сваял две платки. Приблуда из перемычек p3 и p4 для того, чтобы можно было включить или отключить усилитель.
Антены представляют из себя два медных покрытых лаком провода 1мм сечением и длиной примерно 17см.
Вроде, все правильно да нихрена не работает. Передачу проверял обыной любительской рацией при поднесении к ней на сантиметра 3-5 в эфире на 434частоте слышен шум от передатчика. Сразу может дело в том, что слишком слабо, т.к. у передатчика мощность куда больше. Помогите народ, два месяца пытаюсь заставить работать да нифига.

Код в передатчике
Код: Выделить всё
#include <avr/io.h>
#include <avr/delay.h>
void LED_OUT(unsigned char val)
{
DDRD=0xff;
PORTD = val;
}
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
DDRC |= _BV(1);
DDRC |= _BV(2);
DDRC |= _BV(3);
//nSEL=0;
PORTC &=~ _BV(3);
_delay_us(10);
for (i=0; i<8; i++)
{
//nSDI=(Addr>>(7-i))&0x01;
PORTC = ((Addr>>(7-i))&0x01<<PINC1);
_delay_us(10);
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
//nSCK=0;
PORTC &=~ _BV(2);
_delay_us(20);
}
for (i=0; i<8; i++)
{
//nSDI=(data>>(7-i))&0x01;
PORTC = ((data>>(7-i))&0x01<<PINC1);
_delay_us(10);
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
//nSCK=0;
PORTC &=~ _BV(2);
_delay_us(20);
}
//nSEL=1; // выборка чипа
PORTC |= _BV(3);
_delay_us(20);
}
unsigned char SPI_READ(unsigned char Addr)
{
unsigned char i=0;
unsigned char data=0;
Addr=Addr&0x7F; // Старший бит в адресе дб равен нулю!!!
DDRC |= _BV(1);
DDRC |= _BV(2);
DDRC |= _BV(3);
//nSEL=0;
PORTC &=~ _BV(3);
_delay_us(10);
for (i=0; i<8; i++)
{
//nSDI=(Addr>>(7-i))&0x01;
PORTC = ((Addr>>(7-i))&0x01<<PINC1);
_delay_us(10);
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
//nSCK=0;
PORTC &=~ _BV(2);
//delay_us(200);
_delay_us(20);
//if (i==8) LED_OUT(255);
}
for (i=0; i<8; i++)
{
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
data=data<<1;
//data|=(nSDO);
DDRC &=~ _BV(0);
PORTC &=~ _BV(0);
data|=(PINC & (1 << PINC0));
//nSCK=0;
PORTC &=~ _BV(2);
_delay_us(20);
}
//nSEL=1; // выборка чипа
PORTC |= _BV(3);
_delay_us(20);
return data;
}
void SPI_RFM_INIT (void)
{
SPI_WRITE(0x06, 0x00); // interrupt all disable
SPI_WRITE(0x07, 01); // to ready mode
SPI_WRITE(0x09, 0x7f); // cap = 12.5pf
SPI_WRITE(0x0a, 0x05); //clk output is 2MHz
SPI_WRITE(0x0d, 0x00); // GPIO2 for MCLK output
SPI_WRITE(0x0e, 0x00); //GPIO port use default value
SPI_WRITE(0x0f, 0x70); // NO ADC used
SPI_WRITE(0x10, 0x00); //no adc used
SPI_WRITE(0x12, 0x00); // no temperature sensor used
SPI_WRITE(0x13, 0x00); // no temperature sensor used
SPI_WRITE(0x70, 0x20); // no mancheset code, no data whiting, data rate < 30Kbps
SPI_WRITE(0x1c, 0x04); // IF filter bandwidth
SPI_WRITE(0x1d, 0x40); // AFC LOOP
SPI_WRITE(0x1e, 0x08); //AFC timing
SPI_WRITE(0x20, 0x41); //clock recovery
SPI_WRITE(0x21, 0x60); //clock recovery
SPI_WRITE(0x22, 0x27); //clock recovery
SPI_WRITE(0x23, 0x52); //clock recovery
SPI_WRITE(0x24, 0x00); //clock recovery timing
SPI_WRITE(0x25, 0x06); //clock recovery timing
SPI_WRITE(0x6e, 0x27); // Tx data rate 1
SPI_WRITE(0x6f, 0x52); // Tx data rate 0
SPI_WRITE(0x30, 0x8c); // data access control
SPI_WRITE(0x32, 0xff); // header control
SPI_WRITE(0x33, 0x42); // // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2,
SPI_WRITE(0x34, 64); // 64 nibble = 32byte preamble
SPI_WRITE(0x35, 0x20); //0x35 need to detect 20bit preamble
SPI_WRITE(0x36, 0x2d); // synchronize word
SPI_WRITE(0x37, 0xd4);
SPI_WRITE(0x38, 0x00);
SPI_WRITE(0x39, 0x00);
SPI_WRITE(0x3a, 's'); // set tx header
SPI_WRITE(0x3b, 'o');
SPI_WRITE(0x3c, 'n');
SPI_WRITE(0x3d, 'g');
SPI_WRITE(0x3e, 1); // total tx 17 byte
SPI_WRITE(0x3f, 's'); // set rx header
SPI_WRITE(0x40, 'o');
SPI_WRITE(0x41, 'n');
SPI_WRITE(0x42, 'g');
SPI_WRITE(0x43, 0xff); // all the bit to be checked
SPI_WRITE(0x44, 0xff); // all the bit to be checked
SPI_WRITE(0x45, 0xff); // all the bit to be checked
SPI_WRITE(0x46, 0xff); // all the bit to be checked
SPI_WRITE(0x6d, 0x03); // tx power to Max
SPI_WRITE(0x79, 0x0); // no frequency hopping
SPI_WRITE(0x7a, 0x0); // no frequency hopping
SPI_WRITE(0x71, 0x22); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio
SPI_WRITE(0x72, 0x48); // frequency deviation setting to 45k = 72*625
SPI_WRITE(0x73, 0x0); // no frequency offset
SPI_WRITE(0x74, 0x0); // no frequency offset
SPI_WRITE(0x75, 0x53); // frequency set to 434MHz
SPI_WRITE(0x76, 0x64); // frequency set to 434MHz
SPI_WRITE(0x77, 0x00);// frequency set to 434MHz
SPI_WRITE(0x0C,0b00010111); // GPIO Configuration 0.
SPI_WRITE(0x0B,0b00011000); // GPIO Configuration 1.
SPI_WRITE(0x08, 0x03); // fifo reset
SPI_WRITE(0x08, 0x00);
}
void SPI_RFM_INTREAD (void)
{
char temp;
temp = SPI_READ(0x03); //read the Interrupt Status1 register
temp = SPI_READ(0x04);
SPI_WRITE(0x05, 0x04); // interrupt is anable
}
void main(void){
unsigned char i,j=0;
unsigned char a=0;
_delay_ms(500);
SPI_RFM_INIT();
SPI_RFM_INTREAD();
while(1) {
LED_OUT(a);
SPI_WRITE(0x7F, a++);
SPI_WRITE(0x07, 9);
_delay_ms(100);
}
}Код в приемнике
Код: Выделить всё
#include <avr/io.h>
#include <avr/delay.h>
void LED_OUT(unsigned char val)
{
DDRD=0xff;
PORTD = val;
}
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
DDRC |= _BV(1);
DDRC |= _BV(2);
DDRC |= _BV(3);
//nSEL=0;
PORTC &=~ _BV(3);
_delay_us(10);
for (i=0; i<8; i++)
{
//nSDI=(Addr>>(7-i))&0x01;
PORTC = ((Addr>>(7-i))&0x01<<PINC1);
_delay_us(10);
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
//nSCK=0;
PORTC &=~ _BV(2);
_delay_us(20);
}
for (i=0; i<8; i++)
{
//nSDI=(data>>(7-i))&0x01;
PORTC = ((data>>(7-i))&0x01<<PINC1);
_delay_us(10);
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
//nSCK=0;
PORTC &=~ _BV(2);
_delay_us(20);
}
//nSEL=1; // выборка чипа
PORTC |= _BV(3);
_delay_us(20);
}
unsigned char SPI_READ(unsigned char Addr)
{
unsigned char i=0;
unsigned char data=0;
Addr=Addr&0x7F; // Старший бит в адресе дб равен нулю!!!
DDRC |= _BV(1);
DDRC |= _BV(2);
DDRC |= _BV(3);
DDRC &=~ _BV(0);
PORTC &=~ _BV(0);
//nSEL=0;
PORTC &=~ _BV(3);
_delay_us(10);
for (i=0; i<8; i++)
{
//nSDI=(Addr>>(7-i))&0x01;
PORTC = ((Addr>>(7-i))&0x01<<PINC1);
_delay_us(10);
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
//nSCK=0;
PORTC &=~ _BV(2);
//delay_us(200);
_delay_us(20);
//if (i==8) LED_OUT(255);
}
for (i=0; i<8; i++)
{
//nSCK=1;
PORTC |= _BV(2);
_delay_us(30);
data=data<<1;
//data|=(nSDO);
data|=(PINC & (1 << PINC0));
//nSCK=0;
PORTC &=~ _BV(2);
_delay_us(20);
}
//nSEL=1; // выборка чипа
PORTC |= _BV(3);
_delay_us(20);
return data;
}
void SPI_RFM_INIT (void)
{
SPI_WRITE(0x06, 0x00); // interrupt all disable
SPI_WRITE(0x07, 01); // to ready mode
SPI_WRITE(0x09, 0x7f); // cap = 12.5pf
SPI_WRITE(0x0a, 0x05); //clk output is 2MHz
SPI_WRITE(0x0C,0b00010111); // GPIO Configuration 0.
SPI_WRITE(0x0B,0b00011000); // GPIO Configuration 1.
SPI_WRITE(0x0d, 0x00); // GPIO2 for MCLK output
SPI_WRITE(0x0e, 0x00); //GPIO port use default value
SPI_WRITE(0x0f, 0x70); // NO ADC used
SPI_WRITE(0x10, 0x00); //no adc used
SPI_WRITE(0x12, 0x00); // no temperature sensor used
SPI_WRITE(0x13, 0x00); // no temperature sensor used
SPI_WRITE(0x70, 0x20); // no mancheset code, no data whiting, data rate < 30Kbps
SPI_WRITE(0x1c, 0x04); // IF filter bandwidth
SPI_WRITE(0x1d, 0x40); // AFC LOOP
SPI_WRITE(0x1e, 0x08); //AFC timing
SPI_WRITE(0x20, 0x41); //clock recovery
SPI_WRITE(0x21, 0x60); //clock recovery
SPI_WRITE(0x22, 0x27); //clock recovery
SPI_WRITE(0x23, 0x52); //clock recovery
SPI_WRITE(0x24, 0x00); //clock recovery timing
SPI_WRITE(0x25, 0x06); //clock recovery timing
SPI_WRITE(0x6e, 0x27); // Tx data rate 1
SPI_WRITE(0x6f, 0x52); // Tx data rate 0
SPI_WRITE(0x30, 0x8c); // data access control
SPI_WRITE(0x32, 0xff); // header control
SPI_WRITE(0x33, 0x42);// // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2,
SPI_WRITE(0x34, 64); // 64 nibble = 32byte preamble
SPI_WRITE(0x35, 0x20); //0x35 need to detect 20bit preamble
SPI_WRITE(0x36, 0x2d); // synchronize word
SPI_WRITE(0x37, 0xd4);
SPI_WRITE(0x38, 0x00);
SPI_WRITE(0x39, 0x00);
SPI_WRITE(0x3a, 's');
SPI_WRITE(0x3b, 'o');
SPI_WRITE(0x3c, 'n');
SPI_WRITE(0x3d, 'g');
SPI_WRITE(0x3e, 1); // total tx 1 byte
SPI_WRITE(0x3f, 's');
SPI_WRITE(0x40, 'o');
SPI_WRITE(0x41, 'n');
SPI_WRITE(0x42, 'g');
SPI_WRITE(0x43, 0xff); // all the bit to be checked
SPI_WRITE(0x44, 0xff); // all the bit to be checked
SPI_WRITE(0x45, 0xff); // all the bit to be checked
SPI_WRITE(0x46, 0xff); // all the bit to be checked
SPI_WRITE(0x6d, 0x03); // tx power to max
SPI_WRITE(0x79, 0x0); // no frequency hopping
SPI_WRITE(0x7a, 0x0); // no frequency hopping
SPI_WRITE(0x71, 0x22); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio
SPI_WRITE(0x72, 0x48); // frequency deviation setting to 45k = 72*625
SPI_WRITE(0x73, 0x0); // no frequency offset
SPI_WRITE(0x74, 0x0); // no frequency offset
SPI_WRITE(0x75, 0x53); // frequency set to 434MHz
SPI_WRITE(0x76, 0x64); // frequency set to 434MHz
SPI_WRITE(0x77, 0x00);// frequency set to 434MHz
SPI_WRITE(0x08, 0x03); // fifo reset
SPI_WRITE(0x08, 0x00);
SPI_WRITE(0x05, 0x02); // interrupt on recieve packet
}
void SPI_RFM_INTREAD (void)
{
char temp;
SPI_WRITE(0x07, 01); //
temp=SPI_READ(0x03); //read the Interrupt Status1 register
temp=SPI_READ(0x04);
SPI_WRITE(0x07, 05);
}
void main(void){
unsigned char i,j=0;
unsigned char a=0;
_delay_ms(500);
SPI_RFM_INIT();
SPI_RFM_INTREAD();
while(1) {
LED_OUT(SPI_READ(0x7F));
SPI_RFM_INTREAD();
_delay_ms(100);
}
}Re: RFM22B
Вот какая штука с этими модулями - у них антенна должна передергиваться или на вход приемника или на выход передатчика Подачей сигнала на соответствующие выводы RX_ANT и TX_ANT.
Самостоятельно модуль этого делать не умеет!!!
Есть два варианта решения данной проблемы:
1. Дергать эти выводы микроконтроллером
2. Подключить эти выводы к радио модулю как у вас на схеме. Предварительно настроить GPO_0 GPO_1 как управляющие выходы антенн у вас в коде это сделано следующими строчками:
А затем переключать прием и передачу в регистре 0x08 (OPERATING MODE2)
Более подробно читать в документе - http://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/Si4430-31-32.pdf&src=DocumentationWebPart
Страница 60
К сожалению во всех примерах которые я встречал в интернете про это ни чего не говорится.
Еще у вас бок в коде с выходной мощностью
Этой строчкой вы устанавливаете мощьность +8 dBm. Дело в том что вы взяли исходный код от RFM22, а у вас RFM22B !
Значение регистров не совпадает подробно все в том же документе страница 39.
Самостоятельно модуль этого делать не умеет!!!
Есть два варианта решения данной проблемы:
1. Дергать эти выводы микроконтроллером
2. Подключить эти выводы к радио модулю как у вас на схеме. Предварительно настроить GPO_0 GPO_1 как управляющие выходы антенн у вас в коде это сделано следующими строчками:
Код: Выделить всё
SPI_WRITE(0x0C,0b00010111); // GPIO Configuration 0.
SPI_WRITE(0x0B,0b00011000); // GPIO Configuration 1.А затем переключать прием и передачу в регистре 0x08 (OPERATING MODE2)
Код: Выделить всё
SPI_WRITE(0x08,0b00000000); // GPIO Ant1 -"0" GPIO Ant2 -"1"
SPI_WRITE(0x08,0b00100000); // GPIO Ant1 -"1" GPIO Ant2 -"0"Более подробно читать в документе - http://www.silabs.com/pages/DownloadDoc.aspx?FILEURL=Support%20Documents/TechnicalDocs/Si4430-31-32.pdf&src=DocumentationWebPart
Страница 60
К сожалению во всех примерах которые я встречал в интернете про это ни чего не говорится.
Еще у вас бок в коде с выходной мощностью
Код: Выделить всё
SPI_WRITE(0x6d, 0x03); // tx power to MaxЭтой строчкой вы устанавливаете мощьность +8 dBm. Дело в том что вы взяли исходный код от RFM22, а у вас RFM22B !
Значение регистров не совпадает подробно все в том же документе страница 39.
RFM22B-433-S2
Добрый день, господа. Не знаю куда больше обратиться.
Приобрёл два модуля RFM22B-433-S2. пытаюсь заставить с одного модуля передавать инфу на другой. контроллер мега8.
пытаюсь запрограммировать на codevision стандартными средствами spi.
может у кого-то есть наработки по этой теме?
жду помощи. спасибо.
Тема дубль.
Сюда перенес.
aen
Приобрёл два модуля RFM22B-433-S2. пытаюсь заставить с одного модуля передавать инфу на другой. контроллер мега8.
пытаюсь запрограммировать на codevision стандартными средствами spi.
может у кого-то есть наработки по этой теме?
жду помощи. спасибо.
Тема дубль.
Сюда перенес.
aen
-
alex1991
- Открыл глаза
- Сообщения: 40
- Зарегистрирован: Ср апр 14, 2010 20:42:24
- Откуда: Молдова г,Кишинев
Re: RFM22B
Я от суда брал исходник http://www.ulrichradig.de/home/index.ph ... d-atmega88 правда он на WINAVR может что пригодится в нем
Re: RFM22B
Берите четко тот пример, что в оффдокументации и от туда уже пляшите.
Re: RFM22B
товарищи
нашёл в интернет такой код запись по SPI
Код:
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1; // выборка чипа
delay_us(20);
}
вроде бы всё понятно, но вот следующий вопрос вот например у меня адрес и данные равно 0х06. по nsdi я так понимаю будут передаваться данные?или я что-то путаю? для чего nSCK=1; а потом через задержку nSCK=0; как должны передаваться данные в протоколе? какая последовательность? спасибо
нашёл в интернет такой код запись по SPI
Код:
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1; // выборка чипа
delay_us(20);
}
вроде бы всё понятно, но вот следующий вопрос вот например у меня адрес и данные равно 0х06. по nsdi я так понимаю будут передаваться данные?или я что-то путаю? для чего nSCK=1; а потом через задержку nSCK=0; как должны передаваться данные в протоколе? какая последовательность? спасибо
Re: RFM22B
murashh писал(а):Берите четко тот пример, что в оффдокументации и от туда уже пляшите.
пример на PIC....
вроде нашёл рабочий пример вот разбираюсь....правда он на тини 2313
Re: RFM22B
неужели никто не знает?
Re: RFM22B
с этим куском разобрался )
Re: RFM22B
Товарищи на приёмник ничего не поступает ((( что за дела кто может помочь?
код передатчика
код приёмника
хочу попробовать передавать число а=0..255 но тишина (((
код передатчика
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#define nIRQ PINC.3 //PINB.3
#define nSEL PORTC.2 //PORTB.2
#define nSCK PORTC.1 //PORTB.1
#define nSDI PORTC.0 //PORTB.0
#define nSDO PINB.2 //PIND.6
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1; // выборка чипа
delay_us(20);
}
unsigned char SPI_READ(unsigned char Addr)
{
unsigned char i=0;
unsigned char data=0;
Addr=Addr&0x7F; // Старший бит в адресе дб равен нулю!!!
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
//delay_us(200);
delay_us(20);
//if (i==8) LED_OUT(255);
}
for (i=0; i<8; i++)
{
nSCK=1;
delay_us(30);
data=data<<1;
data|=(nSDO);
nSCK=0;
delay_us(20);
}
nSEL=1; // выборка чипа
delay_us(20);
return data;
}
void SPI_RFM_INIT (void)
{
SPI_WRITE(0x06, 0x00); // interrupt all disable
SPI_WRITE(0x07, 01); // to ready mode
SPI_WRITE(0x09, 0x7f); // cap = 12.5pf
SPI_WRITE(0x0a, 0x05); //clk output is 2MHz
SPI_WRITE(0x0d, 0x00); // GPIO2 for MCLK output
SPI_WRITE(0x0e, 0x00); //GPIO port use default value
SPI_WRITE(0x0f, 0x70); // NO ADC used
SPI_WRITE(0x10, 0x00); //no adc used
SPI_WRITE(0x12, 0x00); // no temperature sensor used
SPI_WRITE(0x13, 0x00); // no temperature sensor used
SPI_WRITE(0x70, 0x20); // no mancheset code, no data whiting, data rate < 30Kbps
SPI_WRITE(0x1c, 0x04); // IF filter bandwidth
SPI_WRITE(0x1d, 0x40); // AFC LOOP
SPI_WRITE(0x1e, 0x08); //AFC timing
SPI_WRITE(0x20, 0x41); //clock recovery
SPI_WRITE(0x21, 0x60); //clock recovery
SPI_WRITE(0x22, 0x27); //clock recovery
SPI_WRITE(0x23, 0x52); //clock recovery
SPI_WRITE(0x24, 0x00); //clock recovery timing
SPI_WRITE(0x25, 0x06); //clock recovery timing
SPI_WRITE(0x6e, 0x27); // Tx data rate 1
SPI_WRITE(0x6f, 0x52); // Tx data rate 0
SPI_WRITE(0x30, 0x8c); // data access control
SPI_WRITE(0x32, 0xff); // header control
SPI_WRITE(0x33, 0x42); // // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2,
SPI_WRITE(0x34, 64); // 64 nibble = 32byte preamble
SPI_WRITE(0x35, 0x20); //0x35 need to detect 20bit preamble
SPI_WRITE(0x36, 0x2d); // synchronize word
SPI_WRITE(0x37, 0xd4);
SPI_WRITE(0x38, 0x00);
SPI_WRITE(0x39, 0x00);
SPI_WRITE(0x3a, 's'); // set tx header
SPI_WRITE(0x3b, 'o');
SPI_WRITE(0x3c, 'n');
SPI_WRITE(0x3d, 'g');
SPI_WRITE(0x3e, 1); // total tx 17 byte
SPI_WRITE(0x3f, 's'); // set rx header
SPI_WRITE(0x40, 'o');
SPI_WRITE(0x41, 'n');
SPI_WRITE(0x42, 'g');
SPI_WRITE(0x43, 0xff); // all the bit to be checked
SPI_WRITE(0x44, 0xff); // all the bit to be checked
SPI_WRITE(0x45, 0xff); // all the bit to be checked
SPI_WRITE(0x46, 0xff); // all the bit to be checked
SPI_WRITE(0x6d, 0x03); // tx power to Max
SPI_WRITE(0x79, 0x0); // no frequency hopping
SPI_WRITE(0x7a, 0x0); // no frequency hopping
SPI_WRITE(0x71, 0x23); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio
SPI_WRITE(0x72, 0x48); // frequency deviation setting to 45k = 72*625
SPI_WRITE(0x73, 0x0); // no frequency offset
SPI_WRITE(0x74, 0x0); // no frequency offset
SPI_WRITE(0x75, 0x53); // frequency set to 434MHz
SPI_WRITE(0x76, 0x64); // frequency set to 434MHz
SPI_WRITE(0x77, 0x00);// frequency set to 434MHz
SPI_WRITE(0x0C,0b00010111); // GPIO Configuration 0.
SPI_WRITE(0x0B,0b00011000); // GPIO Configuration 1.
SPI_WRITE(0x08, 0x03); // fifo reset
SPI_WRITE(0x08, 0x00);
}
void SPI_RFM_INTREAD (void)
{
char temp;
temp = SPI_READ(0x03); //read the Interrupt Status1 register
temp = SPI_READ(0x04);
SPI_WRITE(0x05, 0x04); // interrupt is anable
}
void main(void)
{
// Declare your local variables here
unsigned char a=0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
//USICR=0x00;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;
PORTC=0b00001000;
DDRC =0b11110111; // 3-ий бит - только чтение (вход)
PORTB=0b00000100;
DDRB =0b11111011; // 2-ой бит - только чтение (вход)
delay_ms(500);
SPI_RFM_INIT();
SPI_RFM_INTREAD();
while (1)
{
SPI_WRITE(0x7F, a++);
SPI_WRITE(0x07, 9); // go to TX-mode
while (PINC.3)
{
PORTB.1=0;
delay_ms(100);
printf("work... a=%d \n",a);
}
while (!PINC.3)
{
PORTB.1=1;
SPI_RFM_INTREAD();
delay_ms(100);
printf("work2...a=%d \n",a);
}
};
}
код приёмника
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#define nIRQ PINC.3 //PINB.3
#define nSEL PORTC.2 //PORTB.2
#define nSCK PORTC.1 //PORTB.1
#define nSDI PORTC.0 //PORTB.0
#define nSDO PINB.2 //PIND.6
void SPI_WRITE(unsigned char Addr, unsigned char data)
{
unsigned char i=0;
Addr=Addr|0x80; // Старший бит в адресе дб равен 1!!!
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
for (i=0; i<8; i++)
{
nSDI=(data>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
delay_us(20);
}
nSEL=1; // выборка чипа
delay_us(20);
}
unsigned char SPI_READ(unsigned char Addr)
{
unsigned char i=0;
unsigned char data=0;
nSEL=0;
delay_us(10);
for (i=0; i<8; i++)
{
nSDI=(Addr>>(7-i))&0x01;
delay_us(10);
nSCK=1;
delay_us(30);
nSCK=0;
//delay_us(200);
delay_us(20);
//if (i==8) LED_OUT(255);
}
for (i=0; i<8; i++)
{
nSCK=1;
delay_us(30);
data=data<<1;
data|=(nSDO);
nSCK=0;
delay_us(20);
}
nSEL=1; // выборка чипа
delay_us(20);
return data;
}
void SPI_RFM_INIT (void)
{
SPI_WRITE(0x06, 0x00); // interrupt all disable
SPI_WRITE(0x07, 01); // to ready mode
SPI_WRITE(0x09, 0x7f); // cap = 12.5pf
SPI_WRITE(0x0a, 0x05); //clk output is 2MHz
SPI_WRITE(0x0C,0b00010111); //GPIO Configuration 0
SPI_WRITE(0x0B,0b00011000); //GPIO Configuration 1
SPI_WRITE(0x0d, 0x00); // GPIO2 for MCLK output
SPI_WRITE(0x0e, 0x00); //GPIO port use default value
SPI_WRITE(0x0f, 0x70); // NO ADC used
SPI_WRITE(0x10, 0x00); //no adc used
SPI_WRITE(0x12, 0x00); // no temperature sensor used
SPI_WRITE(0x13, 0x00); // no temperature sensor used
SPI_WRITE(0x70, 0x20); // no mancheset code, no data whiting, data rate < 30Kbps
SPI_WRITE(0x1c, 0x04); // IF filter bandwidth
SPI_WRITE(0x1d, 0x40); // AFC LOOP
SPI_WRITE(0x1e, 0x08); //AFC timing
SPI_WRITE(0x20, 0x41); //clock recovery
SPI_WRITE(0x21, 0x60); //clock recovery
SPI_WRITE(0x22, 0x27); //clock recovery
SPI_WRITE(0x23, 0x52); //clock recovery
SPI_WRITE(0x24, 0x00); //clock recovery timing
SPI_WRITE(0x25, 0x06); //clock recovery timing
SPI_WRITE(0x6e, 0x27); // Tx data rate 1
SPI_WRITE(0x6f, 0x52); // Tx data rate 0
SPI_WRITE(0x30, 0x8c); // data access control
SPI_WRITE(0x32, 0xff); // header control
SPI_WRITE(0x33, 0x42); // // header 3, 2, 1,0 used for head length, fixed packet length, synchronize word length 3, 2,
SPI_WRITE(0x34, 64); // 64 nibble = 32byte preamble
SPI_WRITE(0x35, 0x20); //0x35 need to detect 20bit preamble
SPI_WRITE(0x36, 0x2d); // synchronize word
SPI_WRITE(0x37, 0xd4);
SPI_WRITE(0x38, 0x00);
SPI_WRITE(0x39, 0x00);
SPI_WRITE(0x3a, 's'); // set tx header
SPI_WRITE(0x3b, 'o');
SPI_WRITE(0x3c, 'n');
SPI_WRITE(0x3d, 'g');
SPI_WRITE(0x3e, 1); // total tx 17 byte
SPI_WRITE(0x3f, 's'); // set rx header
SPI_WRITE(0x40, 'o');
SPI_WRITE(0x41, 'n');
SPI_WRITE(0x42, 'g');
SPI_WRITE(0x43, 0xff); // all the bit to be checked
SPI_WRITE(0x44, 0xff); // all the bit to be checked
SPI_WRITE(0x45, 0xff); // all the bit to be checked
SPI_WRITE(0x46, 0xff); // all the bit to be checked
SPI_WRITE(0x6d, 0x03); // tx power to Max
SPI_WRITE(0x79, 0x0); // no frequency hopping
SPI_WRITE(0x7a, 0x0); // no frequency hopping
SPI_WRITE(0x71, 0x23); // Gfsk, fd[8] =0, no invert for Tx/Rx data, fifo mode, txclk -->gpio
SPI_WRITE(0x72, 0x48); // frequency deviation setting to 45k = 72*625
SPI_WRITE(0x73, 0x0); // no frequency offset
SPI_WRITE(0x74, 0x0); // no frequency offset
SPI_WRITE(0x75, 0x53); // frequency set to 434MHz
SPI_WRITE(0x76, 0x64); // frequency set to 434MHz
SPI_WRITE(0x77, 0x00);// frequency set to 434MHz
SPI_WRITE(0x08, 0x03); // fifo reset
SPI_WRITE(0x08, 0x00);
}
void SPI_RFM_INTREAD (void)
{
char temp;
SPI_WRITE(0x07,01);
temp = SPI_READ(0x03); //read the Interrupt Status1 register
temp = SPI_READ(0x04);
SPI_WRITE(0x07, 0x05); // interrupt is anable
}
void main(void)
{
// Declare your local variables here
unsigned char a=0;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
PORTC.3=1;
DDRC.3=0;
PORTB.2=1;
DDRB.2=0;
delay_ms(500);
printf("begin1\n");
SPI_RFM_INIT();
printf("begin2\n");
SPI_RFM_INTREAD();
printf("begin3\n");
while (1)
{
if(!PINC.3)
{
a=SPI_READ(0x7F);
printf("work... a=%d \n",a);
SPI_RFM_INTREAD();
while (!PINC.3);
}
}
}
хочу попробовать передавать число а=0..255 но тишина (((
Re: RFM22B
Товарищи, ну вы хоть вложениями такие огромные простыни делайте. А то читать тему невозможно...
Re: RFM22B
неужели никто не хочет помочь начинающему (((( печально
Re: RFM22B
yuta_86 писал(а):неужели никто не хочет помочь начинающему (((( печально
Здесь видел http://www.3e-club.ru/view_full.php?id=19&name=rfm22 но там не для STM
И поищи ещё информацию по RFM12 например тут http://electronix.ru/forum/index.php?sh ... 6&hl=RFM22
Последний раз редактировалось BigallS Вт фев 21, 2012 11:54:15, всего редактировалось 1 раз.
Re: RFM22B
код частично брал и оттуда.....
Re: RFM22B
yuta_86 писал(а):код частично брал и оттуда.....
И здесь ещё видел http://forum.easyelectronics.ru/viewtop ... FM#p117021 но под AVR
Re: RFM22B
видел и это (((
Re: RFM22B
yuta_86 писал(а):видел и это (((
Может что от другого модуля пригодится http://we.easyelectronics.ru/part/radio ... rfm70.html
ещё здесь немного есть http://electronix.ru/forum/index.php?showtopic=93842