roboforum.ru

Технический форум по робототехнике.

 

RFM12B-433DP и AVR

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

RFM12B-433DP и AVR

Сообщение Raskolin » 16 апр 2011, 23:16

Надо соединить mega8 и mega64 посредством rfm12b-433, после долгих мучений и использования родного мануала ничего не получилось.
Поэтому нашел статью RFM12B and AVR - quick start, где вроде как все расписано+ используется программный spi.
Один в один переписал. не работает. И вот теперь возникло пару вопросов.
1. Какие надо использовать антенны? И возможно ли вообще использование на малых дистанциях без антенны?
2. Так же в мануале указано что SDO это выход с модуля, а SDI вход, но в инструкции быстрого старта на рисунке MISO --> SDI, MOSI --> SDO. Т.е. наоборот. Как же правильно?
3. И по родному мануалу для чтения указано что нужно использовать 0x82D8, а в статье подписано (bug was here) и использовано 0x8299. Так какой использовать надо?

Если кто может скиньте код работающей программы, что бы можно было глянуть. :-)))
Raskolin
 
Сообщения: 20
Зарегистрирован: 22 мар 2011, 01:02

Re: RFM12B-433DP и AVR

Сообщение avr123.nm.ru » 17 апр 2011, 01:27

На 433 Мгц антенна это кусок провода 17 см примерно. На землю платы можно пару противовесов припаять - такие же куски провода.

Raskolin писал(а):в инструкции быстрого старта на рисунке MISO --> SDI, MOSI --> SDO. Т.е. наоборот. Как же правильно?
наоборот ИМХО.

Пошукайте в гугле проекты тех кто уже использовал эти модули.

Вот например - http://jeelabs.org/2009/02/10/rfm12b-li ... r-arduino/
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: RFM12B-433DP и AVR

Сообщение Raskolin » 17 апр 2011, 11:41

Эм. Если у smd корпуса явно указана ножка ANT, то в dip нет. Там два выхода под антенну. К какому кусок провода подключать?
Raskolin
 
Сообщения: 20
Зарегистрирован: 22 мар 2011, 01:02

Re: RFM12B-433DP и AVR

Сообщение avr123.nm.ru » 17 апр 2011, 12:45

На рисунке в даташите http://www.hoperf.com/upfile/RFM12B.pdf указана одна точка для антенны, так как модуль маленький то на 433 МГц желательно противовесы припаять к земле близ точки подключения антенны. Дав противовеса и антенна должны образовывать 3 луча по 17 см под 120 градусов примерно. Для уменьшения габаритов их можно свить в спиральки на карандаше или фломастере.

Добавлено спустя 4 минуты:
В проиворечие фото в даташите, где явно видна одна площадка для антенны рядом с кварцем в даташите написано - Differential antenna input/output - похоже эва выхода для антенны в противофазе. Тогда к ним подпаяйте 2 проаода по 17 см и напрвьте их в разный стороны по одной линии - получится антенна диполь.

Вот много фоток модуля - - http://www.google.ru/search?q=RFM12B&hl ... 80&bih=917


Т.е. именно диполь делайте 2 по 17 см или рамку из провода длиной 34 см.
Вложения
RFM12B_433D_pic_1.jpg
RFM12B_433D_pic_1.jpg (44.37 КиБ) Просмотров: 5246
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: RFM12B-433DP и AVR

Сообщение Raskolin » 17 апр 2011, 20:42

Попробовал уже три версии программы. Свою, из статьи и смесь программы из статьи с оф предложенной в даташите.
Результата нет. Мыслей больше нет, поэтому выложу тут последнюю версию может кто что подскажет.

Приемник:
Код: Выделить всёРазвернуть
#include <mega8.h> 
#include <stdint.h>
#include <delay.h>
/* RFM12B INTERFACE */
#define SCK 5   // SPI clock
  #define SDO 4   // SPI Data output (RFM12B side)
  #define SDI 3   // SPI Data input (RFM12B side)
  #define CS  2   // SPI SS (chip select)
  #define NIRQ 1  // (PORTB)
  /* IO CONTROL */
  #define HI(x) PORTB |= (1<<(x))
  #define LO(x) PORTB &= ~(1<<(x))
  #define WAIT_NIRQ_LOW() while(PINB&(1<<NIRQ))
  /* LED */
  #define LED 0
  #define LED_OFF() PORTB &= ~(1<<LED)
  #define LED_ON() PORTB |= (1<<LED)

int8_t usart_read()
{
while(!(UCSRA & (1<<7)))
{
}
return UDR;
}         

usart_write(int8_t bite)
{
while(!(UCSRA & (1<<5)))
{
}
UDR=bite;
}   

void portInit() {
    HI(CS);
    HI(SDI);
    LO(SCK);
    DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
    DDRB = (1<<LED);
  }
write0()
{
LO(SCK);
#asm("nop");
LO(SDI);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
HI(SCK);
#asm("nop");
}
write1()
{
LO(SCK);
#asm("nop");
HI(SDI);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
HI(SCK);
#asm("nop");
}
   
writeCmd(unsigned int cmd) {
    unsigned char i;
    LO(SCK);
    LO(CS);
    for(i=0; i<16; i++) {
      if(cmd&0x8000) write1(); else write0();
      cmd=cmd<<1;
    }
    LO(SCK);
    HI(CS);
    }

 
void rfInit() {
    writeCmd(0x80D8);
    writeCmd(0x82D8);
    writeCmd(0xA640);
    writeCmd(0xC647);   
    writeCmd(0x94A0);
    writeCmd(0xC2AC);
    writeCmd(0xCC77);
    writeCmd(0xCA80);
    writeCmd(0xCA83);   
    writeCmd(0xC49B);
    writeCmd(0x9850);
    writeCmd(0xE000); //NOT USED
    writeCmd(0xC800); //NOT USED
    writeCmd(0xC000);
  }

unsigned char rfRecv() {
    unsigned char data,i;
    LO(SCK);
    LO(SDI);
    LO(CS);
    for(i=0;i<16;i++)
    {
    HI(SCK);
    #asm("nop");
    #asm("nop");
    LO(SCK);
    #asm("nop");
    #asm("nop");
    }
    for(i=0;i<8;i++)
    {
    data=data<<1;
    if(PINB&(1<<SDO))
    {
    data|=1;
    }
    HI(SCK);
    #asm("nop");
    #asm("nop");
    LO(SCK);
    #asm("nop");
    #asm("nop");
    }
    HI(CS);
    return(data);   
  }

  void FIFOReset() {
    writeCmd(0xCA80);
    writeCmd(0xCA83);
  }
 


void main(void)
{   
unsigned char data, i;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
portInit();
LED_ON();
rfInit();

// 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=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
usart_write('O'); usart_write('K'); usart_write('\r'); usart_write('\n'); 
delay_ms(10000);   

while (1)
        { 
        while(!(PINB&(1<<NIRQ)))
        {
        usart_write(data);
        for (i=0; i<16; i++) {
        data = rfRecv();
        usart_write(data);
        }
        FIFOReset();
        }
       
       };
}

Передатчик:

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 16.04.2011
Author  : AvrMeg                         
Company : AvrMeg                         
Comments:


Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>
  /* RFM12B INTERFACE */
  #define SCK 7   // SPI clock
  #define SDO 6   // SPI Data output (RFM12B side)
  #define SDI 5   // SPI Data input (RFM12B side)
  #define CS  4   // SPI SS (chip select)
  #define NIRQ 3  // (PORTB)
  /* IO CONTROL */
  #define HI(x) PORTB |= (1<<(x))
  #define LO(x) PORTB &= ~(1<<(x))
  #define WAIT_NIRQ_LOW() while(PINB&(1<<NIRQ))
  /* LED */
  #define LED 6
  #define LED_OFF() PORTD &= ~(1<<LED)
  #define LED_ON() PORTD |= (1<<LED)

void portInit() {
    HI(CS);
    HI(SDI);
    LO(SCK);
    DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
    DDRD = (1<<LED);
  }

write0()
{
LO(SCK);
#asm("nop");
LO(SDI);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
HI(SCK);
#asm("nop");
}
write1()
{
LO(SCK);
#asm("nop");
HI(SDI);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
HI(SCK);
#asm("nop");
}
   
writeCmd(unsigned int cmd) {
    unsigned char i;
    LO(SCK);
    LO(CS);
    for(i=0; i<16; i++) {
      if(cmd&0x8000) write1(); else write0();
      cmd=cmd<<1;
    }
    LO(SCK);
    HI(CS);
    }
   void rfSend(unsigned char data)
  {   
  WAIT_NIRQ_LOW();
    writeCmd(0xB800 + data);
  }
     
  void rfInit() {
    writeCmd(0x80D8);
    writeCmd(0x8208);
    writeCmd(0xA640);
    writeCmd(0xC647);   
    writeCmd(0xCC77);
    writeCmd(0x94A0);
    writeCmd(0xC2AC);
    writeCmd(0xCA80);
    writeCmd(0xCA83);   
    writeCmd(0xC49B);
    writeCmd(0x9850);
    writeCmd(0xE000); //NOT USED
    writeCmd(0xC80E); //NOT USED
    writeCmd(0xC000);
  }
 



void main(void)
{
volatile unsigned int i;
portInit();
rfInit();
LED_ON();
#asm("cli");
    delay_ms(1000);
while (1)
      {   
     
      LED_ON();
     
      writeCmd(0x8228);
      delay_us(4);
      writeCmd(0x8238);
      #asm("nop");
      #asm("nop");
      rfSend(0xAA);
      rfSend(0xAA);
      rfSend(0xAA);
      rfSend(0x2D);
      rfSend(0xD4); 
     
      for(i=0; i<16; i++) {
        rfSend(0x30+i);
      }
      rfSend(0xAA);
      writeCmd(0x8208);
      writeCmd(0x8200);
      LED_OFF();
      delay_ms(1000);
      LED_ON();
      delay_ms(1000);
      LED_OFF();
      delay_ms(1000);
      };
}


Модератор Setar:Облачайте код в соответствующий тег [соde]...[/cоde] - читать удобнее
Raskolin
 
Сообщения: 20
Зарегистрирован: 22 мар 2011, 01:02

Re: RFM12B-433DP и AVR

Сообщение avr123.nm.ru » 17 апр 2011, 21:06

Советую посмотреть осцилограммы (хотябы в PROTEUS) и убедится что обмен по SPI правильный. Попробуйте прочитать читаемые регистры трансивера - адекватные ли данные оттуда читаются.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14200
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: RFM12B-433DP и AVR

Сообщение Raskolin » 17 апр 2011, 21:34

По случайке там где приемник я прислал фигню. вот другой.
Код: Выделить всёРазвернуть
#include <mega8.h> 
#include <stdint.h>
#include <delay.h>
/* RFM12B INTERFACE */
#define SCK 5   // SPI clock
  #define SDO 4   // SPI Data output (RFM12B side)
  #define SDI 3   // SPI Data input (RFM12B side)
  #define CS  2   // SPI SS (chip select)
  #define NIRQ 1  // (PORTB)
  /* IO CONTROL */
  #define HI(x) PORTB |= (1<<(x))
  #define LO(x) PORTB &= ~(1<<(x))
  #define WAIT_NIRQ_LOW() while(PINB&(1<<NIRQ))
  /* LED */
  #define LED 0
  #define LED_OFF() PORTB &= ~(1<<LED)
  #define LED_ON() PORTB |= (1<<LED)

int8_t usart_read()
{
while(!(UCSRA & (1<<7)))
{
}
return UDR;
}         

usart_write(int8_t bite)
{
while(!(UCSRA & (1<<5)))
{
}
UDR=bite;
}   

void portInit() {
    HI(CS);
    HI(SDI);
    LO(SCK);
    DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
    DDRB = (1<<LED);
  }
write0()
{
LO(SCK);
#asm("nop");
LO(SDI);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
HI(SCK);
#asm("nop");
}
write1()
{
LO(SCK);
#asm("nop");
HI(SDI);
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
#asm("nop");
HI(SCK);
#asm("nop");
}
   
unsigned int writeCmd(unsigned int cmd) {
    unsigned char i;
    unsigned int recv;
    recv = 0;
    LO(SCK);
    LO(CS);
    for(i=0; i<16; i++) {
      if(cmd&0x8000) write1(); else write0();
      HI(SCK);
      recv<<=1;
      if( PINB&(1<<SDO) ) {
        recv|=0x0001;
      }
      LO(SCK);
      cmd<<=1;
    }
    HI(CS);
    return recv;
  }
 
void rfInit() {
    writeCmd(0x80D8);
    writeCmd(0x82D8);
    writeCmd(0xA640);
    writeCmd(0xC647);   
    writeCmd(0x94A0);
    writeCmd(0xC2AC);
    writeCmd(0xCC77);
    writeCmd(0xCA80);
    writeCmd(0xCA83);   
    writeCmd(0xC49B);
    writeCmd(0x9850);
    writeCmd(0xE000); //NOT USED
    writeCmd(0xC800); //NOT USED
    writeCmd(0xC000);
  }

  unsigned char rfRecv() {
    unsigned int data;
    while(1) {
      data = writeCmd(0x0000);
      if ( (data&0x8000) ) {
        data = writeCmd(0xB000);
        return (data&0x00FF);
      }
    } 
  }

  void FIFOReset() {
    writeCmd(0xCA81);
    writeCmd(0xCA83);
  }


void main(void)
{   
unsigned char data, i;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
portInit();
LED_ON();
rfInit();

// 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=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
usart_write('O'); usart_write('K'); usart_write('\r'); usart_write('\n'); 
delay_ms(1000);   
LED_OFF();
while (1)
        { 
         for (i=0; i<16; i++) {
          data = rfRecv();
          usart_write(data);
        }
        FIFOReset();
     
       };
}
Raskolin
 
Сообщения: 20
Зарегистрирован: 22 мар 2011, 01:02

Re: RFM12B-433DP и AVR

Сообщение Raskolin » 18 апр 2011, 16:17

avr123.nm.ru писал(а):Советую посмотреть осцилограммы (хотябы в PROTEUS) и убедится что обмен по SPI правильный. Попробуйте прочитать читаемые регистры трансивера - адекватные ли данные оттуда читаются.

Переписал код для меги под аппаратный spi с mode1. Проверил на осциллографе в протеусе. Вроде норм все. В железе же ничего не работает. Прочитать там можно только биты статуса и насколько я понимаю они равны 0 когда ничего не принимается с передатчика. 0 и получаю.
Буду рад если кто то глянет и подскажет, а то из-за этого модуля уже три дня работа не движется дальше.
последний код приемника:
Код: Выделить всёРазвернуть
#include <mega8.h>
#include <stdint.h>
#include <delay.h>
#define NIRQ PINB.1
#define CS PORTB.2
#define LED PORTB.0
#define SPIF 7
int8_t usart_read()
{
while(!(UCSRA & (1<<7)))
{
}
return UDR;
}         

usart_write(int8_t bite)
{
while(!(UCSRA & (1<<5)))
{
}
UDR=bite;
}

spi_write_cmd(int8_t bite1, int8_t bite2)
{
CS=0;
SPDR=bite1;
while ((SPSR & (1<<SPIF))==0);
SPDR=bite2;
while ((SPSR & (1<<SPIF))==0);
CS=1;
}

spi_write_data(int8_t bite)
{
spi_write_cmd(0xB8,bite);
}

transiver_send_data(int8_t bite1,int8_t bite2)
{
spi_write_cmd(0x82,0x28);
delay_us(4);
spi_write_cmd(0x82,0x38);
delay_us(4);
spi_write_data(0xAA);
spi_write_data(0xAA);
spi_write_data(0xAA);
spi_write_data(0x2D);
spi_write_data(0xD4);
spi_write_data(0xFF);
spi_write_data(bite1);
spi_write_data(bite2);
spi_write_data(0xAA);
spi_write_cmd(0x82,0x08);
spi_write_cmd(0x82,0xD8); //Переводим обратно в режим чтения.
delay_ms(1);
usart_write('s'); usart_write('e'); usart_write('n'); usart_write('d');
}

int8_t transiver_status() // Временная проверка
{
CS=0;
SPDR=0x00;
while ((SPSR & (1<<SPIF))==0); 
usart_write(SPDR); 
SPDR=0x00;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR);
CS=1;
return SPDR;
}

int8_t spi_read_data()
{   
CS=0;
SPDR=0xB0;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR); 
SPDR=0x00;
while ((SPSR & (1<<SPIF))==0);
usart_write(SPDR);
CS=1;
return SPDR;


spi_fifo_reset()
{
spi_write_cmd(0xCA,0x80);
spi_write_cmd(0xCA,0x83);
}


void main(void)
{   
PORTB=0x00;
DDRB=0x2C;
DDRB.0=1;
PORTB.0=1;
DDRB.1=0;
PORTB.1=0;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0x00;
CS=1;
// 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=0x33;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 500,000 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: Low
// SPI Data Order: MSB First
//SPCR=0x51;
//SPSR=0x00;
SPCR=0x55;
SPSR=0x00;

spi_write_cmd(0x80,0xD8);
spi_write_cmd(0x82,0xD8);
spi_write_cmd(0xA6,0x40);
spi_write_cmd(0xC6,0x47);
spi_write_cmd(0xCC,0x77);
spi_write_cmd(0x94,0xA0);
spi_write_cmd(0xC2,0xAC);
spi_write_cmd(0xCA,0x83);
spi_write_cmd(0xC4,0x8B);
spi_write_cmd(0x98,0x50);
spi_write_cmd(0xE0,0x00);
spi_write_cmd(0xC8,0x00);
spi_write_cmd(0xC0,0xE0);
spi_write_cmd(0x82,0xC8);
usart_write('O'); usart_write('K');
transiver_status();
delay_ms(1000);
while (1)
        {

delay_ms(100);
//transiver_status();
      if(!NIRQ)
      {   
      LED=~LED;
      transiver_status();
      usart_write(spi_read_data());
      spi_fifo_reset();
      }
     
        };
}



Код передатчика
Код: Выделить всёРазвернуть
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 16.04.2011
Author  : AvrMeg                         
Company : AvrMeg                         
Comments:


Chip type           : ATtiny2313
Clock frequency     : 8,000000 MHz
Memory model        : Tiny
External SRAM size  : 0
Data Stack size     : 32
*****************************************************/

#include <tiny2313.h>
#include <delay.h>
  /* RFM12B INTERFACE */
  #define SCK 7   // SPI clock
  #define SDO 6   // SPI Data output (RFM12B side)
  #define SDI 5   // SPI Data input (RFM12B side)
  #define CS  4   // SPI SS (chip select)
  #define NIRQ 3  // (PORTB)
  /* IO CONTROL */
  #define HI(x) PORTB |= (1<<(x))
  #define LO(x) PORTB &= ~(1<<(x))
  #define WAIT_NIRQ_LOW() while(PORTB.3==1)
  /* LED */
  #define LED 6
  #define LED_OFF() PORTD &= ~(1<<LED)
  #define LED_ON() PORTD |= (1<<LED)

void portInit() {
    HI(CS);
    HI(SDI);
    LO(SCK);
    DDRB = (1<<CS) | (1<<SDI) | (1<<SCK);
    DDRD = (1<<LED);
  }

  unsigned int writeCmd(unsigned int cmd) {
    unsigned char i;
    unsigned int recv;
    recv = 0;
    LO(SCK);
    LO(CS);
    for(i=0; i<16; i++) {
      if(cmd&0x8000) HI(SDI); else LO(SDI);
      HI(SCK);
      recv<<=1;
      if( PINB&(1<<SDO) ) {
        recv|=0x0001;
      }
      LO(SCK);
      cmd<<=1;
    }
    HI(CS);
    return recv;
  }
     
  void rfInit()
  {
writeCmd(0x80D8);
writeCmd(0x8219);
writeCmd(0xA640);
writeCmd(0xC647);
writeCmd(0xCC77);
writeCmd(0x94A0);
writeCmd(0xC2AC);
writeCmd(0xCA83);
writeCmd(0xC48B);
writeCmd(0x9850);
writeCmd(0xE000);
writeCmd(0xC800);
writeCmd(0xC0E0);
  }
 
  void rfSend(unsigned char data){
WAIT_NIRQ_LOW();
writeCmd(0xB800 + data);
  }


void main(void)
{

volatile unsigned int i;
DDRB=0;
DDRD=0;
DDRA=0;
PORTB=0;
PORTD=0;
PORTA=0;
#asm("cli");
delay_ms(100);
    portInit();
    delay_ms(100);
    rfInit();
    while(1){ 
      LED_ON();
      delay_ms(100);
      writeCmd(0x8238);
      rfSend(0xAA); // PREAMBLE
      rfSend(0xAA);
      rfSend(0xAA);
      rfSend(0x2D); // SYNC
      rfSend(0xD4);
      for(i=0; i<16; i++) {
        rfSend(0x30+i);
      }
      rfSend(0xAA); // DUMMY BYTES
      rfSend(0xAA);
      rfSend(0xAA);
      writeCmd(0x8208);
      LED_OFF();
      delay_ms(100);
         
      };
}

Raskolin
 
Сообщения: 20
Зарегистрирован: 22 мар 2011, 01:02

Re: RFM12B-433DP и AVR

Сообщение Raskolin » 24 апр 2011, 21:42

Продолжение. Теперь могу нормально общаться с передатчиком и приемником.
При опросе статус регистра при включении выдавал 0x4000, т.е. все ок. Далее начинал выдавать все время 01A0 или 0180 например. Прочитал что 1единичка это превышен уровень приходящего сигнала. Укоротил антенну примерно сантиметров до 14 и MSB стал показывать 00. Насколько я понимаю это правильно. Включаю передатчик тут же опять появляется единичка и в LSB появляется множество разных значений. Вроде как изменения lsb логичны, но непонятен смысл постоянного включения RSSI(единички в MSB) . При этом nirq никогда не опускается и команда "B000" всегда выдает нули. В статус регистре так же никогда не поднимается бит о заполнение FIFO. Есть идеи?
Raskolin
 
Сообщения: 20
Зарегистрирован: 22 мар 2011, 01:02


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Mail.ru counter