rfm23b - помогите байт переслать

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Откуда: Крым, Ялта

Сообщение tabr »

Собственно эти радиомодули. Использую какие-то жесткие немецкие либы... немного переделанные.
РМ: rfm23b-433
МК: ATMega128 (кварц 16 МГц) (у меня они как отладочные платы)
Задача стоит тривиальная: переслать данные с одного РМ на другой.
Платы собраны идентично.
Пишу в codevisionAVR=)

Проблема: Не могу ничего передать/получить (не могу сказать, на какОм этапе...) - модули на расстоянии 5 см друг от друга.

Ниже есть полные исходники, тут сокращенные:

приемник:

Код: Выделить всё

rf22_init();
//оригинал был на 868 МГц, тут переделал - правильно?
rf22_setfreq(RF22FREQ(434+1.545));
rf22_rxmode();
while(1)
{
cnt = rf22_getpacket(rx_tmp);
//и вот этот cnt НИКОГДА не становится отличным от нуля!
    sprintf (lcd_buf, "cnt[%u]nIRQ[%u]",cnt,nIRQ); 
    LcdString(1,2);
    sprintf (lcd_buf, "ver[%u]len[%u]",rf22_read(REGISTER_DEVICE_VERSION),rf22_read(REGISTER_RECEIVER_PACKET_LENGTH)); 
    LcdString(1,3);
    sprintf (lcd_buf, "stat[%u]",rf22_read(REGISTER_DEVICE_STATUS)); 
    LcdString(1,4);
    sprintf (lcd_buf, "P[%u]rssi[%u]",rf22_read(REGISTER_TX_POWER),rf22_read(REGISTER_RSSI)); 
    LcdString(1,5);
    sprintf (lcd_buf, "try[%u]",++i); 
    LcdString(1,6);
delay_ms(500);
}
передатчик:

Код: Выделить всё

rf22_init();
//оригинал был на 868 МГц, тут переделал - правильно?
rf22_setfreq(RF22FREQ(434+1.545));
rf22_rxmode();//так было в "Жестком немецком исходнике"
while(1)
{
rf22_sendpacket((unsigned char*)"HALLO",5);
delay_ms(500);
}

Код: Выделить всё

void rf22_init(void)
{
    delay_ms(50);//por (16ms)
    
    rf22_write(REGISTER_OPERATING_FUNCTION_CONTROL_1,                   0x80);		// software reset
	//for(unsigned long a = 0;a<100000;a++){asm("nop");}; // wait until software reset done
    delay_ms(10);//soft reset: 100 us

    rf22_write(REGISTER_INTERRUPT_ENABLE_1,                             0x02);		// valid packed received interrupt on

    rf22_write(REGISTER_INTERRUPT_ENABLE_2,                             0x00);		// all interrupts off
    rf22_write(REGISTER_OPERATING_FUNCTION_CONTROL_1,                   0x01);		// operating mode: ready mode
    rf22_write(REGISTER_CRYSTAL_OSCILLATOR_LOAD_CAPACITANCE,            0x7f);		// xtal load capacitance
    rf22_write(REGISTER_MICROCONTROLLER_OUTPUT_CLOCK,                   0x02);		// uC CLK: 10MHz
    
    rf22_write(REGISTER_GPIO_0_CONFIGURATION,                           0xf2);		// GPIO0: TX_ANT - f2 
    rf22_write(REGISTER_GPIO_1_CONFIGURATION,                           0xf5);		// GPIO1: RX ANT - f5
    rf22_write(REGISTER_GPIO_2_CONFIGURATION,                           0x00);		// GPIO2: uC Clock out
    rf22_write(REGISTER_IO_PORT_CONFIGURATION,                          0x00);		
    rf22_write(REGISTER_ADC_CONFIGURATION,                              0x70);		// ADC Input: GND
    rf22_write(REGISTER_ADC_SENSOR_AMPLIFIER_OFFSET,                    0x00);		// ADC offset: 0
    rf22_write(REGISTER_TEMPERATURE_SENSOR_CONTROL,                     0x00);		// temp sensor calibration off
    rf22_write(REGISTER_TEMPERATURE_VALUE_OFFSET,                       0x00);		// temp sensor offset: 0
    rf22_write(REGISTER_AFC_LOOP_GEARSHIFT_OVERRIDE,                    0x40);		// enable AFC
    rf22_write(REGISTER_AFC_TIMING_CONTROL,                             0x0A);		// afc timing
	rf22_write(REGISTER_CLOCK_RECOVERY_GEARSHIFT_OVERRIDE,              0x03);		// afc timing

	rf22_write(REGISTER_IF_FILTER_BANDWIDTH,                            0x05);		// IF bandwidth
	rf22_write(REGISTER_CLOCK_RECOVERY_OVERSAMPLING_RATIO,              0x83);		// Clock Recovery Oversampling Rate
	rf22_write(REGISTER_CLOCK_RECOVERY_OFFSET_2,                        0xC0);		// Clock Recovery Offset 2
	rf22_write(REGISTER_CLOCK_RECOVERY_OFFSET_1,                        0x13);		// Clock Recovery Offset 1
	rf22_write(REGISTER_CLOCK_RECOVERY_OFFSET_0,                        0xA9);		// Clock Recovery Offset 0
	rf22_write(REGISTER_CLOCK_RECOVERY_TIMING_LOOP_GAIN_1,              0x00);		// Clock Recovery Timing Loop Gain 1
	rf22_write(REGISTER_CLOCK_RECOVERY_TIMING_LOOP_GAIN_0,              0x04);		// Clock Recovery Timing Loop Gain 0
	rf22_write(REGISTER_AFC_LIMITER,                                    0x24);

	rf22_write(REGISTER_RSSI_THRESHOLD_FOR_CLEAR_CHANNEL_INDICATOR,     0x10);		// RSSI Threashold: -120dB

    rf22_write(REGISTER_DATA_ACCESS_CONTROL,                            0x8c);		// data access: RX/TX packet handling, enable crc: CCIT
    rf22_write(REGISTER_HEADER_CONTROL_1,                               0xff);		// header check enable
    rf22_write(REGISTER_HEADER_CONTROL_2,                               0x42);		// 2 word synchronisation
    rf22_write(REGISTER_PREAMBLE_LENGTH,                                0x10);		// preamble length: 16 nibbles, = 64bits
    rf22_write(REGISTER_PREAMBLE_DETECTION_CONTROL,                     0x30);		// preamble detection control: 6 nibbles = 24bits
    rf22_write(REGISTER_SYNC_WORD_3,                                    0x2d);		// sync word 3
    rf22_write(REGISTER_SYNC_WORD_2,                                    0xd4);		// sync word 2
    rf22_write(REGISTER_SYNC_WORD_1,                                    0xAA);		// sync word 1
    rf22_write(REGISTER_SYNC_WORD_0,                                    0xAA);		// sync word 0
    rf22_write(REGISTER_TRANSMIT_HEADER_3,                              'h');		// transmit header 3
    rf22_write(REGISTER_TRANSMIT_HEADER_2,                              'o');		// transmit header 2
    rf22_write(REGISTER_TRANSMIT_HEADER_1,                              'p');		// transmit header 1
    rf22_write(REGISTER_TRANSMIT_HEADER_0,                              'e');		// transmit header 0
    rf22_write(REGISTER_TRANSMIT_PACKET_LENGTH,                         17);		// packet length
    rf22_write(REGISTER_CHECK_HEADER_3,                                 'h');		// check header 3
    rf22_write(REGISTER_CHECK_HEADER_2,                                 'o');		// check header 2
    rf22_write(REGISTER_CHECK_HEADER_1,                                 'p');		// check header 1
    rf22_write(REGISTER_CHECK_HEADER_0,                                 'e');		// check header 0
    rf22_write(REGISTER_HEADER_ENABLE_3,                                0xff);		// header enable mask 3
    rf22_write(REGISTER_HEADER_ENABLE_2,                                0xff);		// header enable mask 2
    rf22_write(REGISTER_HEADER_ENABLE_1,                                0xff);		// header enable mask 1
    rf22_write(REGISTER_HEADER_ENABLE_0,                                0xff);		// header enable mask 0

//	rf22_write(0x69,                                                    0x60);		// AGC on
	rf22_write(REGISTER_AGC_OVERRIDE,                                   0x60);		// AGC on
    rf22_write(0x6a,                                                    0x0b);		// agc override 2 [!????????!!!!!!!]
	rf22_write(REGISTER_TX_POWER,                                       0x0F);		// tx power: +17dBm
	
	rf22_write(REGISTER_TX_DATA_RATE_1,                                 0x13);		// set baud high
	rf22_write(REGISTER_TX_DATA_RATE_0,                                 0xa9);		// set baud low

    rf22_write(REGISTER_MODULATION_MODE_CONTROL_1,                      0x2C);		// modulation control
    rf22_write(REGISTER_MODULATION_MODE_CONTROL_2,                      0x22);		// modulation control 2: FIFO mode, OOK  //0x21 / 0x00
	
    rf22_write(REGISTER_FREQUENCY_DEVIATION,                            0x50);		// frequency deviation: 45kHz
	rf22_write(REGISTER_FREQUENCY_OFFSET_1,                             0x00);		// offset: 0
	rf22_write(REGISTER_FREQUENCY_OFFSET_2,                             0x00);		// offset: 0
	
	rf22_write(REGISTER_FREQUENCY_HOPPING_CHANNEL_SELECT,               0x0);		// frequency hopping off
    rf22_write(REGISTER_FREQUENCY_HOPPING_STEP_SIZE,                    0x0);		// frequency hopping off
	
#ifdef BAND_868
	rf22_write(REGISTER_FREQUENCY_BAND_SELECT,                          0x73);		// 860-880MHz range
#else
	rf22_write(REGISTER_FREQUENCY_BAND_SELECT,                          0x53);		// 430-440MHz range
#endif
}

Немного о платах:
МК:ATMega128
Дисплей: Софт SPI - Nokia 3310 Lcd
РМ: подключаются через 10ти контактный разъем
РМ: Hard SPI
-: В цепи питания нет фильтр. конд. (неуж-то так принципиально)

Помогите пожалуйста справиться с этим ГАДОМ.(или хоть дайте рабочий пример приемника-передатчика)
ЗЫ: Обещаюсь в случае успеха разработать и выложить нормальные либы под сей девайс, т.к. планирую с ним далее работать=)
ЗЗЫ: Есть на сайте производителя (с)эксель с настройками - вот только КАК с ним работать - не очень понятно.

Схема:
Изображение
Инфо (некоторая информация что я посчитал нужной вывести на экран):
Изображение
RSSI - изменяющиеся значения в районе "40"
Сам РМ:
Изображение
Изображение
Изображение
Изображение

Заранее спасибо=)
Вложения
rf22.c
(11.49 КБ) 503 скачивания
rf22.h
(1001 байт) 584 скачивания
n3310lcd.c
(34.36 КБ) 275 скачиваний
a.c
(2.68 КБ) 558 скачиваний
Реклама
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Откуда: Крым, Ялта

Сообщение tabr »

хмм....вроде, нашел.....
Реклама
Опытный кот
Аватара пользователя
Сообщения: 754
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Сообщение BigallS »

Драйвер есть http://www.microchip.su/showthread.php?t=11028 и тут почитай http://www.ulrichradig.de/home/index.ph ... d-atmega88, похожий модуль http://www.3e-club.ru/view_full.php?id=19&name=rfm22

P.S. что нашёл то?
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Откуда: Крым, Ялта

Сообщение tabr »

Успешно запустил с этими либами (найдено на каком-то буржуйском магазине =))
Буду работать с этими РМ, попутно оформлять либу. Закончу - поделюсь=)
Правда, эти РМ(rfm22b/rfm23b) - фиг найдешь в/на Украине (хочу использовать 868МГц).

Может, подскажет кто где их взять, у нас, в/на Украине? штук 40 нужно...
Вложения
rfm22b.c
(16.35 КБ) 318 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 754
Зарегистрирован: Пт апр 15, 2011 21:11:22
Откуда: Россия

Сообщение BigallS »

tabr писал(а):...
Буду работать с этими РМ, попутно оформлять либу. Закончу - поделюсь=)
...
Может, подскажет кто где их взять, у нас, в/на Украине? штук 40 нужно...
Ваш код от RFM22b в предыдущем сообщении работает с RFM23B модулями? Прекрасно, будем ждать либу!

Такие модули я ранее покупал http://www.chip-nn.ru в России но там их уже нет, надо смотреть на китайских сайтах магазинов http://www.alibaba.com/trade/search?fsb ... ext=RFM23B.
Реклама
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Откуда: Крым, Ялта

Сообщение tabr »

Я сам работаю с rfm23b(43b) - отлично работает =)
У китайцев уже также пытаюсь заказать - только мутные они =(
Реклама
Открыл глаза
Сообщения: 73
Зарегистрирован: Пт ноя 12, 2010 10:13:51
Откуда: Крым, Ялта

Сообщение tabr »

Ответить

Вернуться в «Периферия»