Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Re: HOPERF RFM70, особенности работы

Пт май 30, 2014 22:56:05

похоже, нашел. в передатчике и в приемнике должна быть одинаковая строчка. в первом банке.
попробуйте.
{ (0x20|0x06), 0x0F }, //air data rate-2M,out power 5dbm,setup LNA gain high (0dBM)

Re: HOPERF RFM70, особенности работы

Сб май 31, 2014 00:56:40

Это я пробовал, смотри мои сообщения выше. Сейчас модули работают при параметре 0x07 если ставлю 0x0F нет связи. Что самое смешное заменил RFM73 на RFM70 и соответственно сделал
{ (0x20|0x06), 0x3F }, //air data rate-2M,out power 5dbm,setup LNA gain high (0dBM)
а они не работают, а работали.
У меня проект ранее был на Atmel Studio 6.1, попробую откатиться. :o
P.S. Пока на этом остановлюсь, что-то меня эти модули стали "напрягать", попробую NRF24L01
прикрутить, есть что по ним у тебя? Можно в личку.

Re: HOPERF RFM70, особенности работы

Сб май 31, 2014 11:58:57

странно. с параметрами как у вас, у меня действительно модули связывались плохо. не 5 метров, но хуже, чем у меня было. а с предложенными изменениями стало лучше.
а насчет NRF24L01 только читал, что rfm70/73 - это китайская копия с NRF24L01. но у нас он чуть-ли не в два раза дороже.

Re: HOPERF RFM70, особенности работы

Чт июн 26, 2014 15:20:58

Доброго времени суток уважаемой общественности.
Давненько игрался с данными радиомодулями. Причем, вполне успешно: были и приём, и передача, и с конфигами всё, тьфу-тьфу, на месте. После защиты диплома естественным образом захотелось продолжить изготовление проектов, которые затевал. Открыл старый код, и, мягко говоря, охренел. Короче, пришлось всё переписывать по-новой. Но, не в этом суть.
Сейчас у меня нет передачи. Вот нет и всё, хоть ты тресни. Я даже переписал программу на старый лад. Хрена с два! Не помогает и тут. Конфигурируется сабж должным образом. Отследить ситуацию с работой SPI я могу с переходником UART-SPI-UART, реализованным на ATTiny2313A. Сабж позволяет полноценно общаться с радиомодулем с консоли, посредством FT232RL. При этом, я получаю адекватные ответы - то, что должно быть по плану. Соответственно, проблем на стороне SPI нет.
Сразу хотелось бы сказать, что тему я не перечитывал. Обратил внимание, что тут, в основном, юзают C, а я его не приемлю. Если найдутся ассемблерщики - буду очень и очень рад.
Приёмник реализован на стороне переходника UART-SPI-UART. Передатчик - на ATTiny85 (маячок, по прерываниям от WDT раз в секунду шлётся 0xAA). Сейчас я нуждаюсь в помощи человека, успешно реализовавшего передачу. Прилагаю файло с кодом. Буду рад, если кто-то поможет разобраться, в чем проблема. Если кому-то код покажется сильно лохматым, но желание разобраться не пропадёт - поясню неясные моменты.
На комментарии в некоторых местах, откровенно говоря, опираться не стоит. Код редактировался не смотря на них. В некоторых местах может быть несуразица вроде копирования статусного регистра в r15, а по факту - в r0. И так далее...
Вложения
rfm_test_t85.rar
Передатчик
(1.59 KiB) Скачиваний: 264
Chrono_debugger.rar
Переходник (приёмник)
(4.96 KiB) Скачиваний: 245

Re: HOPERF RFM70, особенности работы

Пт июн 27, 2014 20:15:34

Кто пробовал с этого сайта библиотеки?
http://www.voti.nl/rfm73/index.html

Тыркаюсь с адруиной.
Передача идёт, а приёма нет.

В основе - пример от этой библиотеки.
Два модуля присоединены к одному МК.
Спойлер
Код:
#include "Arduino.h"
#include <rfm73.h>

pins::uc_pin ce( 8 ), csn(  10 ), mosi( 11 ), miso( 12 ), sck( 13 ), ce1( 7 ), csn1(  9 );
pins::uc_pin led_tx( 5 ), led_rx( 6 );
rfm73 radio( sck, mosi, miso, csn, ce );
rfm73 radio1( sck, mosi, miso, csn1, ce1 );
unsigned char receive_led = 0, reg_st = 0;

const unsigned char tx_buf[17]={
    0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x78};
   
void setup()
{
  pinMode(3, INPUT);
  digitalWrite(3, HIGH);
  Serial.begin(9600);
  attachInterrupt(1, blink2, CHANGE);
}

void blink2()
{
  receive_led = 60;
  reg_st = radio1.register_read(RFM73_REG_CONFIG);
  radio1.register_write(RFM73_REG_CONFIG, reg_st);
  Serial.print("Interrupt 1 \r\n");
}

void loop() {
   led_tx.direction_set_output();
   led_rx.direction_set_output();
   radio.init();           radio1.init();
   radio.channel( 10 );    radio1.channel( 10 );
   
   if(!radio.is_present() || !radio1.is_present())
   {
     for(;;)
     {
        delay( 300 );
        led_rx.set( 0 );     
        led_tx.set( 1 );     
        delay( 300 );
        led_rx.set( 1 );     
        led_tx.set( 0 );     
     }
   }
 
   unsigned char len, i, chksum, n = 0;
   unsigned char rx_buf[ RFM73_MAX_PACKET_LEN ];
   unsigned char transmit_led = 0;   
   
   for(;;)
   {
      delay( 4 );

      led_tx.set( transmit_led > 0 );
      if( transmit_led > 0 )
      {
        transmit_led--;
      }
 
      led_rx.set(receive_led > 0);
      if( receive_led > 0 )
      {
        receive_led--;
      }
   
      if( ++n > 250 )
      {
         radio.mode_transmit();
         radio1.mode_receive();
         transmit_led = 20;   
         radio.buffer_write( RFM73_CMD_W_TX_PAYLOAD_NOACK, tx_buf, 17 );
         delay( 1 );
         n = 0;    
      }

      if( ! radio1.receive_fifo_empty() )
      {
         Serial.print("FIFO is not empty\r\n");
         
         len = radio1.register_read( RFM73_CMD_R_RX_PL_WID );
         if( len <= RFM73_MAX_PACKET_LEN )
         {
            Serial.print("Normal length\r\n");

            radio1.buffer_read( RFM73_CMD_R_RX_PAYLOAD, rx_buf, len);

          chksum = 0;
            for(i = 0; i < 16; i++)
            {
               chksum += rx_buf[i];
            }

            if (chksum == rx_buf[16] && rx_buf[0] == 0x30)
            {
               receive_led = 20;
               Serial.print("Checksumm\r\n");
            }   
         }
         radio1.register_write( RFM73_CMD_FLUSH_RX,0 );
      }
   }
}



//----------.----------
Не видят друг друга.

Выводит:
Спойлер
Код:
RFM73 testing
Init module 1
Init module 2
Module 1 is present
Module 2 is present
Packages lost: 0
Packages retransmit: 0
Sending
Packages lost: 1
Packages retransmit: 15
Sending
Packages lost: 2
Packages retransmit: 15
Sending
Packages lost: 3
Packages retransmit: 15
Sending
Packages lost: 4
Packages retransmit: 15
Sending
Packages lost: 5
Packages retransmit: 15
Sending
Packages lost: 6
Packages retransmit: 15
Sending
Packages lost: 7
Packages retransmit: 15
Sending
Packages lost: 8
Packages retransmit: 15
Sending
Packages lost: 9
Packages retransmit: 15
Sending
Packages lost: 10
Packages retransmit: 15
Sending
Packages lost: 11
Packages retransmit: 15
Sending
Packages lost: 12
Packages retransmit: 15
Sending
Packages lost: 13
Packages retransmit: 15
Sending
Packages lost: 14
Packages retransmit: 15
Sending
Packages lost: 15
Packages retransmit: 15
И т.д.

Код:
Спойлер
Код:

#include "Arduino.h"
#include <rfm73.h>

pins::uc_pin ce( 8 ), csn(  10 ), mosi( 11 ), miso( 12 ), sck( 13 ), ce1( 7 ), csn1(  9 );
pins::uc_pin led_tx( 5 ), led_rx( 6 );
rfm73 radio( sck, mosi, miso, csn, ce );
rfm73 radio1( sck, mosi, miso, csn1, ce1 );
unsigned char receive_led = 0, reg_st = 0;
const unsigned char Address[]={ 0x11, 0x19, 0x19, 0x12, 0x17 };

const unsigned char tx_buf[17]={
    0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x78};
   
void setup()
{
  Serial.begin(9600);
  Serial.print("RFM73 testing\r\n");
}

void loop() {
   led_tx.direction_set_output();
   led_rx.direction_set_output();
   Serial.print("Init module 1\r\n");
   radio.init();
   radio.channel( 19 );
   radio.pipe_enable(0, true);
   radio.pipe_enable(1, false);
   radio.receive_address_p0(Address);
   radio.transmit_address(Address);
   radio.pipe_autoack(0, true);
   radio.mode_receive();   
   
   delay( 2 );
   
   Serial.print("Init module 2\r\n");

   delay( 4 );
   radio1.init();
   radio1.channel( 19 );   
   radio1.pipe_enable(0, true);
   radio1.pipe_enable(1, false);
   radio1.receive_address_p0(Address);
   radio1.transmit_address(Address);
   radio.pipe_autoack(1, true);
   radio1.mode_transmit();
   
   delay( 4 );   
   if(!radio.is_present())
   {
     for(;;)
     {
        delay( 300 );
        led_rx.set( 0 );     
        led_tx.set( 1 );     
        delay( 300 );
        led_rx.set( 1 );     
        led_tx.set( 0 );     
     }
   }
   delay( 2 );   
   Serial.print("Module 1 is present\r\n");
   delay( 2 );   
   
   if(!radio1.is_present())
   {
     for(;;)
     {
        delay( 300 );
        led_rx.set( 0 );     
        led_tx.set( 1 );     
        delay( 300 );
        led_rx.set( 1 );     
        led_tx.set( 0 );     
     }
   }
   
   delay( 2 );
   Serial.print("Module 2 is present\r\n");
   delay( 2 );
 
   unsigned char len, i, chksum, n = 0;
   unsigned char rx_buf[ RFM73_MAX_PACKET_LEN ];
   unsigned char transmit_led = 0;
   
   delay( 10 );
   
   for(;;)
   {
      delay( 4 );

      led_tx.set( transmit_led > 0 );
      if( transmit_led > 0 )
      {
        transmit_led--;
      }
 
      led_rx.set(receive_led > 0);
      if( receive_led > 0 )
      {
        receive_led--;
      }
   
      if( ++n > 250 )
      {
         Serial.print("Packages lost: ");
         Serial.print(radio1.lost_packets_count());
         Serial.print("\r\n");
         
         Serial.print("Packages retransmit: ");   
         Serial.print(radio1.retransmit_count());
         Serial.print("\r\n");
         
         radio1.mode_transmit();
         delay(1);
         transmit_led = 20;
         
         ce1.set(0);
         delay(1);
         Serial.print("Sending\r\n");
//         radio1.buffer_write( RFM73_CMD_W_TX_PAYLOAD, tx_buf, 17 );
         radio1.transmit_message(tx_buf, 17);
         delay(1);
         ce1.set(1);
         delay( 1 );
         // clear interrupt status
         reg_st = radio1.register_read( RFM73_REG_STATUS );
         radio1.register_write( RFM73_REG_STATUS ,reg_st );
         ce1.set(0);
//         radio1.mode_receive();

         n = 0;    
      }

     
      if( ! radio.receive_fifo_empty() )
      {
         Serial.print("FIFO is not empty\r\n");
         
         len = radio.register_read( RFM73_CMD_R_RX_PL_WID );
         if( len <= RFM73_MAX_PACKET_LEN )
         {
            Serial.print("Normal length\r\n");

            radio.buffer_read( RFM73_CMD_R_RX_PAYLOAD, rx_buf, len);

          chksum = 0;
            for(i = 0; i < 16; i++)
            {
               chksum += rx_buf[i];
            }

            if (chksum == rx_buf[16] && rx_buf[0] == 0x30)
            {
               receive_led = 20;
               Serial.print("Checksumm\r\n");
            }   
         }
         radio.register_write(RFM73_CMD_FLUSH_RX, 0);
      }
   }
}



Тыкал анализатором - все команды правильные, ответ адекватный.

Re: HOPERF RFM70, особенности работы

Вт авг 26, 2014 22:14:49

Дополнение к предыдущему моему посту, если вдруг кто заинтересуется.
Ошибка заключалась в последовательности записи регистров первого банка. Там, где надо было писать младший байт первым, я писал старший, и наоборот. По исправлению бага была произведена передача.

Re: HOPERF RFM70, особенности работы

Ср окт 01, 2014 14:51:04

Привет всем. пробую данные модули для сети типа звезда. Пока есть 1 базовая станция которая на одном канале по разным адресам рассылает запросы и есть 2 модуля которые отвечают на запросы БС. Все это с автоподтверждением и ретрансляцией. Прием пакетов отслеживаю по прерыванию из RFM70.
Проблема в том, что модули принимают все, что шлет базовая станция, тоесть принимают пакеты не на свой адрес. Кто стыкался?как лечить?

Re: HOPERF RFM70, особенности работы

Ср окт 01, 2014 15:28:57

Попробуй откл. на приемниках не свой канал
Вложения
1.jpg
(204.23 KiB) Скачиваний: 694

Re: HOPERF RFM70, особенности работы

Ср окт 01, 2014 16:16:50

Это уже сделано. Моя либа на основе VOTI.
Левые пакеты принимаются на пайп1, который запрограммирован на прием по конкретному адресу.
Делал по даташиту.
В Пайп0 записал адрес передающего канала для приема пакета подтверждения приема БС, пайп 1 - на прием обычных пакетов.

Код:
rfm70_address_length(5);
rfm70_transmit_address(sdata.local_addr);     //Адрес даного модуля.
rfm70_receive_address_p0(sdata.local_addr); //сюда приходят подтверждения от БС
//REG_EN_AA
  rfm70_pipe_autoack(1, 1);
rfm70_receive_address_p1(sdata.remote_addr);//сюда приходят данные от БС.
//EN_RXADDR
  rfm70_pipe_enable(0, 1);
  rfm70_pipe_enable(1, 1);
  rfm70_pipe_enable(2, 0);
  rfm70_pipe_enable(3, 0);
  rfm70_pipe_enable(4, 0);
  rfm70_pipe_enable(5, 0);

Re: HOPERF RFM70, особенности работы

Сб июн 13, 2015 19:54:44

Все мозг закипел :kill:
И так имеем 2-е NRF 24L01+ , которые устанавливают связь между собой , в режиме DPL, помоему и без вкл. питания.
Есть 2-е RFM73 , которые с тем же кодом + банк1 устанавливают связь между собой , но при этом приемник не понимает сколько байт ему прислали- значение возвращает 0х00, и выводит всякую дребедень на экран. Передатчик ACK не получает.
Ставлю NRF - как приемник, RFM передатчик - с приемником все хорошо , выводит как все положено , АСК - нет
Ставлю NRF - передатчик , RFM приемник - https://www.youtube.com/watch?v=swYwns_JFJI
Можно бы плюнуть на RFM - " Но за державу обидно!"

Инит банков для обоих микрух . В бубен бью.
Код:
DATA_INIT_BANK0:
   .db Com_WrReg+EN_AA,0x01,Com_WrReg+EN_RXADDR,0x01,Com_WrReg+SETUP_AW,0x03,Com_WrReg+SETUP_RETR,0xFF
   .db Com_WrReg+RF_CH,28,Com_WrReg+RF_SETUP,0x07,Com_WrReg+DYNPD,0x01,Com_WrReg+FEATURE,0x07
   .db Com_WrReg+RX_ADDR_P2,0xC3,Com_WrReg+RX_ADDR_P3,0xC4,Com_WrReg+RX_ADDR_P4,0xC5,Com_WrReg+RX_ADDR_P5,0xC6
   .db Com_WrReg+RX_PW_P0,0x20,Com_WrReg+RX_PW_P1,0x21,Com_WrReg+RX_PW_P2,0x21,Com_WrReg+RX_PW_P3,0x21
   .db   Com_WrReg+RX_PW_P4,0x21,Com_WrReg+RX_PW_P5,0x21,Com_WrReg+CONFIG,0x0F

//0    Config    - reflect RX_DR\TX_DS\MAX_RT,Enable CRC ,2byte,POWER UP,PRX
//1    EN_AA       - Enable auto acknowledgement data pipe 0
//2    EN_RXADDR    - Enable RX Addresses pipe 0
//3    SETUP_AW    - RX/TX address field width 5byte
//4    SETUP_RETR - Auto retransmission delay (4000us),auto retransmission count(15)
//5    RF_CH       - channel
//6    RF_SETUP   - Air data rate-1M,out power 0dbm,setup LNA gain \bit4 must set up to 0
//7  DYNPD      - Enable dynamic payload length
//8 FEATURE      - Enables Dynamic Payload Length,Enables Payload with ACK
;|*************************************************
ADDRESS_PRX_PTX:
   .db Com_WrReg+RX_ADDR_P0,0xCE,0xCD,0xC0,0xCB,0xD3,Com_WrReg+RX_ADDR_P1,0xDF
   .db 0xDC,0xCB,0xC8,0xC2,Com_WrReg+TX_ADDR,0xCE,0xCD,0xC0,0xCB,0xD3
;|*************************************************

DATA_INIT_BANK1:
         .db 0x20,0x40,0x4B,0x01,0x2E,0x21,0xC0,0x4B
         .db 0x00,0x00,0x22,0xD0,0xFC,0x8C,0x02,0x23
         .db   0x99,0x00,0x39,0x41,0x24,0xD9,0x96,0x82
         .db   0x1B,0x25,0x24,0x06,0x7F,0xA6,0x26,0x00
         .db   0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x00
         .db 0x29,0x00,0x00,0x00,0x00,0x2A,0x00,0x00
         .db 0x00,0x00,0x2B,0x00,0x00,0x00,0x00,0x2C
         .db   0x00,0x12,0x73,0x00,0x2D,0x36,0xB4,0x80
         .db   0x00,0x2E,0x41,0x20,0x08,0x04,0x81,0x20
         .db   0xCF,0xF7,0xFE,0xFF,0xFF,0
Toggle_REG4:
         .db   0x24,0xDF,0x96,0x82,0x1B,0x24,0xD9,0x96
         .db   0x82,0x1B

Re: HOPERF RFM70, особенности работы

Пн июл 31, 2017 15:43:53

Всем привет.
Есть пару вопросов по модулям нигде не мог найти эту инфу
1. настройка SPI контроллера с какими параметрами необходимо делать (частота, фазы и т.д.)
2. CRC для SPI в модуле нигде не описан. Или он один для радио и проводного. Как вы настраиваете?

Re: HOPERF RFM70, особенности работы

Ср авг 16, 2017 16:44:32

Хе хе, все на морях что ли, чего тихе в этой ветке?
SPI работает, в регистрах вроде все что нужно, но тварюки не видят друг друга
То же мозг вскипел (((
Ответить