Перейти к содержанию
    

RFM22B Задержка между передачей и приемом

Взял на пробу пару трансиверов RFM22B.

Запустил, нормально работают.

Но появился следующий вопрос:

Я предполагал, что при передаче одного байта от одного модуля к другому, возникающая задержка будет все время одинакова. Но измерив эту задержку, я увидел, что она колеблется в пределах 30мкс. Измерял таймером на частоте кварца 8МГц.

Два модуля соединены между собой проводом и приемник раз в секунду создает перепад на входе передатчика. По этому перепаду на передатчике возникает прерывание и отправляется один байт по радиоканалу. В это время на приемнике измеряется задержка и, по приему байта модулем, таймер останавливается и измеренное значение передается по USB.

Приемник и инициатор посылки:

#pragma vector = TIMER1_OVF_vect
__interrupt void TIMER1_OVF(void)
{
  counter++;
  if (counter == 122)    // Отсчитываем 1 секунду
  {
    counter = 0;
    TCCR1B = 0x00;
    TCNT1 = 0x0000;
    PORTC_Bit5 ^= 1;    // Создаем перепад на проводе, чтобы передатчик послал байт
    TCCR1B = 0x01;
    while (nIRQ);    // Ждем, пока приемник не примет байт
    TCCR1B = 0x00;
    RFM22B_delay = TCNT1;
    TCCR1B = 0x01;
    flag_USB_TX = 1;
    // Переход в режим приема
    SPI_WRITE(0x05, 0x02); // interrupt on recieve packet
    SPI_WRITE(0x07, 01);  // 
    SPI_READ(0x03);     //read the Interrupt Status1 register
    SPI_READ(0x04); 
    SPI_WRITE(0x07, 05);
    while (!nIRQ);
  }
}

Передатчик:

#pragma vector = PCIN1_vect
__interrupt void EXT_PCINT(void)
{
    // Переход в режим передачи
    SPI_READ(0x03); //read the Interrupt Status1 register
    SPI_READ(0x04);
    SPI_WRITE(0x05, 0x04); // interrupt is enable
    SPI_WRITE(0x7F, 0xAA);//Data_TX_RFM22B);
    SPI_WRITE(0x07, 9);     // go to TX-mode   
    while (!nIRQ);
}

В передатчике больше никакие прерывания не действуют и прерывания не запрещаются.

Настройки модуля:

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, 0x18);     // GPIO Configuration 0.
SPI_WRITE(0x0B, 0x17);     // 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, 0x00); // 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, 0x64); //clock recovery
SPI_WRITE(0x21, 0x01); //clock recovery
SPI_WRITE(0x22, 0x47); //clock recovery
SPI_WRITE(0x23, 0xAE); //clock recovery
SPI_WRITE(0x24, 0x00); //clock recovery timing
SPI_WRITE(0x25, 0x06); //clock recovery timing
SPI_WRITE(0x6e, 0x0A); // Tx data rate 1
SPI_WRITE(0x6f, 0x3D); // 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, 0x10); // 16 nibble = 8byte preamble
SPI_WRITE(0x35, 0x30); //0x35 need to detect 24bit 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, 0x07); // 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);

Чем может быть вызвана эта задержка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

BaN, может быть это происходит из-за каких-нибудь помех?

 

У меня к тебе вопрос такой, с какой МК работает радиомодуль? Я вообще сколько пытаюсь вообще что-либо передать - неполучается, наверное весь даташит выучил :biggrin: .

BaN, ты не мог бы поделиться исходниками, пожалуйста? Или может я тебе свои например скину (на CVAVR), ты не смог бы взглянуть что не так? Незнаю к кому обратится, помоги пожалуйста. Если что пиши сюда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...