CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

RFM12B nIRQ pin
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Jody



Joined: 08 Sep 2006
Posts: 182

View user's profile Send private message Send e-mail

RFM12B nIRQ pin
PostPosted: Thu Sep 16, 2010 1:52 am     Reply with quote

Hello,
Right now I have communications between two PIC's using both a RFM12B RF module. So far so good.
But at this moment I can receive data only when I ongoing check for data.
At that moment the received data is correct and the same as I send.
But there is a nIRQ pin on the RFM12B module, which I want to use to notify me that there is data waiting for me, but whatever I do I can't get it react on the incoming data. So I can't put the responsible in a ISR function.

Is there somebody who has done this before???

Regards,
Jody
languer



Joined: 09 Jan 2004
Posts: 144
Location: USA

View user's profile Send private message

PostPosted: Thu Sep 16, 2010 12:04 pm     Reply with quote

Have you look at the example here ( http://www.futurlec.com/RFM12B_Programming.shtml ). They poll the nIRQ pin to determine when to receive the data.
Jody



Joined: 08 Sep 2006
Posts: 182

View user's profile Send private message Send e-mail

PostPosted: Thu Sep 16, 2010 12:30 pm     Reply with quote

Yep I did see this way.
And that's exact what I want.
I poll the nIRQ line but never is goes low.

Regards,
Jody
languer



Joined: 09 Jan 2004
Posts: 144
Location: USA

View user's profile Send private message

PostPosted: Fri Sep 17, 2010 2:10 am     Reply with quote

The following two guys have some really good info on the RFM modules.

http://blog.strobotics.com.au/tutorials/rfm12-stuff/
http://www.technofun.org/blog/2008/07/22/rmf12b-interfaced-to-an-atmel-avr-atmega88-running-bascom-code/

I have a couple modules which I haven't used yet, but you've peaked my interest.
Jody



Joined: 08 Sep 2006
Posts: 182

View user's profile Send private message Send e-mail

PostPosted: Fri Sep 17, 2010 3:02 am     Reply with quote

Well if you want I can send you the code I use at the transmitter and the receiver.
It works... accept the nIRQ pin.
Maybe you can find the 'mistake'.
languer



Joined: 09 Jan 2004
Posts: 144
Location: USA

View user's profile Send private message

PostPosted: Fri Sep 17, 2010 1:44 pm     Reply with quote

i can take a look. either post it here or pm me
exjra



Joined: 25 Sep 2010
Posts: 3

View user's profile Send private message

PostPosted: Sat Sep 25, 2010 9:59 am     Reply with quote

hi
I use this modules too, but i can't receive any data.
I can't debug during at working this modules, but I think transmitter is working. But receiver module dont work. I noticed nIRQ pin of receiver is never be low.

If you able to work this modules (transmitter and receiver) can you help me and can you send me microcontroller codes for PIC16F73 at C language?

e-mail: exjra@hotmail.com
Ttelmah



Joined: 11 Mar 2010
Posts: 19504

View user's profile Send private message

PostPosted: Sat Sep 25, 2010 2:36 pm     Reply with quote

Are you sending the correct sync pattern?.
The IRQ on the receiver, line doesn't drop, till the receiver is synced, and data is received.

Best Wishes
exjra



Joined: 25 Sep 2010
Posts: 3

View user's profile Send private message

PostPosted: Mon Sep 27, 2010 6:44 am     Reply with quote

My issue still unresolved. As you see I'm managed to make transmitter/receiver work with those source code you sent. The data receiver received are being sent to the PC by USART. I'm sending those data PC received to you. I could not understand where is the problem. can you help me?

TRANSMITTER CODE:
Code:

#include <16F73.h>

#device adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NOBROWNOUT
#use delay(clock=10000000)
///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
///                                                   ///
///      ####    #####  #    #    #   ##   ####       ///
///      #   #   #      ##  ##   ##  #  #  #   #      ///
///      ####    ####   # ## #  # #    #   ####       ///
///      # #     #      #    #    #   #    #   #      ///
///      #  #    #      #    #    #  #     #   #      ///
///      #   #   #      #    #    #  ####  ####       ///
///                                                   ///
///      RFM12B Driver                                ///
///                                                   ///
/////////////////////////////////////////////////////////
///                                                   ///
/// Functions:                                        ///
///                                                   ///
/// RFM12B_INIT(int type)                             ///
/// RFM12B_SEND(int buffer, int size)                 ///
/// RFM12B_RECEIVE(int buffer, int size)              ///
///                                                   ///
/////////////////////////////////////////////////////////
///                                                   ///
/// Updates:                                          ///
///                                                   ///
/// 09.01.2010 New Driver                             ///
///                                                   ///
/////////////////////////////////////////////////////////
///                                                   ///
/// Code was written by Severin Birrer                ///
/// More informations at www.blucorazon.ch            ///
///                                                   ///
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
///                                                   ///
/// PIN settings                                      ///
///                                                   ///
/////////////////////////////////////////////////////////
#define MOSI      PIN_C4 //cikis
#define MISO      PIN_C5
#define nSEL      PIN_C2
#define SCK       PIN_C3
#define IRQ       PIN_B0
#define LED       PIN_A0
#define LED3      PIN_B2
#define LED4      PIN_B3

/////////////////////////////////////////////////////////
///                                                   ///
/// Definitions                                       ///
///                                                   ///
/////////////////////////////////////////////////////////
#define MOSI_hi() output_high(MOSI)
#define MOSI_lo() output_low(MOSI)
#define nSEL_hi() output_high(nSEL)
#define nSEL_lo() output_low(nSEL)
#define SCK_hi()  output_high(SCK)
#define SCK_lo()  output_low(SCK)
#define in_MISO() input(MISO)
#define in_IRQ()  input(IRQ)
#define TX        1
#define RX        0

int16 RFM12B_READ_STATUS(void);
void RFM12B_FIFO_RESET(void);


/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_PORT_INIT                                  ///
/// Function: Initalise ports to defined states       ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_PORT_INIT(void)
{
    nSEL_hi();
    SCK_lo();
    MOSI_lo();
    delay_ms(100);
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_CMD                                        ///
/// Function: Sends command and receives data         ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_CMD(int16 cmd)
{
    int i;
    int16 temp=0;

    SCK_lo();
    nSEL_lo();
    for(i=0;i<16;i++)
    {
        if(cmd&0x8000)
        {
            MOSI_hi();
        }
        else
        {
            MOSI_lo();
        }
        delay_us(5);
        SCK_hi();
        delay_us(5);

        temp<<=1;

        if(in_MISO())
        {
            temp|=0x0001;
        }

        SCK_lo();
        cmd<<=1;
    }
    nSEL_hi();
    return(temp);
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_WAIT_READY                                 ///
/// Function: Wait for RFM12B to be ready (FFIT)      ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_WAIT_READY(void)
{
    unsigned int16 data;

    nSEL_lo();//test
    while(!in_MISO())
        ;//test
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_READ                                       ///
/// Function: Wait and read a byte from FIFO          ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_READ(void)
{
    int16 data;

    //  RFM12B_WAIT_READY();
    data = RFM12B_CMD(0xB000); // Read Data
    return (data&0x00FF);
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_WRITE                                      ///
/// Function: Write a byte                            ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_WRITE(int abyte)
{
    RFM12B_WAIT_READY();
    RFM12B_CMD(0xB800 + abyte); // Write Data
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_INIT                                       ///
/// Function: Initalise as a sender or a receiver     ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_INIT(int type)
{
    RFM12B_PORT_INIT();

    delay_ms(200);

    if (type)
    {
        // Init Sender
        RFM12B_CMD(0x80A8); // Configuration Command  868MHz 12,pF Enable Tx Register
    }
    else
    {
        // Init Receive
        RFM12B_CMD(0x8068); // Configuration Command  868MHz 12,5pF Enable Rx FIFO buffer
    }

    // General Init
    RFM12B_CMD(0x82D8); // Power Management Command  Enable Crystal Osc.
    RFM12B_CMD(0xA640); // Frequency Command    Center Frequency 868.3200 MHz
    RFM12B_CMD(0xC647); // Datarate Command    Data Rate 4.789kbps
    RFM12B_CMD(0x94A5); // Receiver Control Command  VDI, Fast, 134kHz, Max, -73dBm
    RFM12B_CMD(0xC2EC); // Datafilter Command   Auto, Slow, Digital, 4
    RFM12B_CMD(0xCA8B); // FIFO / Reset Mode Command  8, 1 bytes, Synchrone, Low, FIFO Fill Enabled
    RFM12B_CMD(0xCED4); // Synchron Pattern Command  Synchron byte(LSB) D4
    RFM12B_CMD(0xC483); // AFC Command
    RFM12B_CMD(0x9827); // TX Configuration Command
    RFM12B_CMD(0xCC77); // PLL Command
    RFM12B_CMD(0xE000); // Wake-Up Timer Command
    RFM12B_CMD(0xC800); // Low Duty-Cycle Command
    RFM12B_CMD(0xC000); // LB Det./Clock Div. Command 2.2V, 1.66MHz
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_SEND                                       ///
/// Function: Send multiple bytes                     ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_SEND(int *ptr, int16 size)
{
    int16 i;

    RFM12B_CMD(0x8238); // Enable Sender

    RFM12B_WRITE(0xAA); // Preamble
    RFM12B_WRITE(0xAA); // Preamble
    RFM12B_WRITE(0xAA); // Preamble

    RFM12B_WRITE(0xCE); // Sync HighByte
    RFM12B_WRITE(0xD4); // Sync LowByte

    for (i=0;i<size;i++)
    {
        RFM12B_WRITE(*ptr); // DATA Byte
        ptr++;
    }

    RFM12B_WRITE(0xAA); // Dummy Byte
    RFM12B_WRITE(0xAA); // Dummy Byte
    RFM12B_WRITE(0xAA); // Dummy Byte

    RFM12B_WAIT_READY();
    RFM12B_CMD(0x8208); // Disable Sender
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_RECEIVE                                    ///
/// Function: Receive multiple bytes                  ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_RECEIVE(int *ptr, int16 size)
{
    int16 i;

    //RFM12B_CMD(0x82C8); // Init Receiver//test
    RFM12B_CMD(0x82D8); // Init Receiver//Candy
    //RFM12B_CMD(0xCA81); // Enable FIFO//test
    //RFM12B_CMD(0xCA83); // Clear FIFO//test

    for (i=0;i<size;i++)
    {
        *ptr = RFM12B_READ(); // Send Data
        ptr++;
    }

     //RFM12B_CMD(0x8208); // Disable Receiver test of we hem wel aan laten staan
    //RFM12B_CMD(0xCA83); // Clear FIFO//test
    //RFM12B_FIFO_RESET();
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_FIFO_RESET                                 ///
/// Function: Reset the FIFO                          ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_FIFO_RESET(void)
{
    RFM12B_CMD(0xCA81);
    RFM12B_CMD(0xCA83);
}


/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_READ_STATUS                                ///
/// Function: Wait and read a byte from FIFO          ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_READ_STATUS(void)
{
    int16 data;

    data = RFM12B_CMD(0x0000); // Read Data//test
    return (data);
}
///////////////////////////////////////////////////////////////////////////////





void main()
{
   int buffi[16] ={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   set_tris_a(0x00);
   delay_ms(250);
   RFM12B_INIT(1);
   
   while(1)
   {
      RFM12B_SEND(buffi, 16);
      output_high(LED);
      delay_ms(250);
      delay_ms(250);
      output_low(LED); 
      delay_ms(250);
      delay_ms(250);
   }
}


RECEIVER CODE:
Code:
#include <16F73.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset

#use delay(clock=10000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=mypcconn)

///////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
///                                                   ///
///      ####    #####  #    #    #   ##   ####       ///
///      #   #   #      ##  ##   ##  #  #  #   #      ///
///      ####    ####   # ## #  # #    #   ####       ///
///      # #     #      #    #    #   #    #   #      ///
///      #  #    #      #    #    #  #     #   #      ///
///      #   #   #      #    #    #  ####  ####       ///
///                                                   ///
///      RFM12B Driver                                ///
///                                                   ///
/////////////////////////////////////////////////////////
///                                                   ///
/// Functions:                                        ///
///                                                   ///
/// RFM12B_INIT(int type)                             ///
/// RFM12B_SEND(int buffer, int size)                 ///
/// RFM12B_RECEIVE(int buffer, int size)              ///
///                                                   ///
/////////////////////////////////////////////////////////
///                                                   ///
/// Updates:                                          ///
///                                                   ///
/// 09.01.2010 New Driver                             ///
///                                                   ///
/////////////////////////////////////////////////////////
///                                                   ///
/// Code was written by Severin Birrer                ///
/// More informations at www.blucorazon.ch            ///
///                                                   ///
/////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
///                                                   ///
/// PIN settings                                      ///
///                                                   ///
/////////////////////////////////////////////////////////
#define MOSI      PIN_C4 //cikis
#define MISO      PIN_C5
#define nSEL      PIN_C2
#define SCK       PIN_C3
#define IRQ       PIN_B0
#define LED       PIN_A0
#define LED3      PIN_B2
#define LED4      PIN_B3

/////////////////////////////////////////////////////////
///                                                   ///
/// Definitions                                       ///
///                                                   ///
/////////////////////////////////////////////////////////
#define MOSI_hi() output_high(MOSI)
#define MOSI_lo() output_low(MOSI)
#define nSEL_hi() output_high(nSEL)
#define nSEL_lo() output_low(nSEL)
#define SCK_hi()  output_high(SCK)
#define SCK_lo()  output_low(SCK)
#define in_MISO() input(MISO)
#define in_IRQ()  input(IRQ)
#define TX        1
#define RX        0

int16 RFM12B_READ_STATUS(void);
void RFM12B_FIFO_RESET(void);


/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_PORT_INIT                                  ///
/// Function: Initalise ports to defined states       ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_PORT_INIT(void)
{
    nSEL_hi();
    SCK_lo();
    MOSI_lo();
    delay_ms(100);
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_CMD                                        ///
/// Function: Sends command and receives data         ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_CMD(int16 cmd)
{
    int i;
    int16 temp=0;

    SCK_lo();
    nSEL_lo();
    for(i=0;i<16;i++)
    {
        if(cmd&0x8000)
        {
            MOSI_hi();
        }
        else
        {
            MOSI_lo();
        }
        delay_us(5);
        SCK_hi();
        delay_us(5);

        temp<<=1;

        if(in_MISO())
        {
            temp|=0x0001;
        }

        SCK_lo();
        cmd<<=1;
    }
    nSEL_hi();
    return(temp);
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_WAIT_READY                                 ///
/// Function: Wait for RFM12B to be ready (FFIT)      ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_WAIT_READY(void)
{
    unsigned int16 data;

    nSEL_lo();//test
    while(!in_MISO())
        ;//test
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_READ                                       ///
/// Function: Wait and read a byte from FIFO          ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_READ(void)
{
    int16 data;

    //RFM12B_WAIT_READY();
    data = RFM12B_CMD(0xB000); // Read Data
    return (data&0x00FF);
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_WRITE                                      ///
/// Function: Write a byte                            ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_WRITE(int abyte)
{
    RFM12B_WAIT_READY();
    RFM12B_CMD(0xB800 + abyte); // Write Data
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_INIT                                       ///
/// Function: Initalise as a sender or a receiver     ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_INIT(int type)
{
    RFM12B_PORT_INIT();

    delay_ms(200);

    if (type)
    {
        // Init Sender
        RFM12B_CMD(0x80A8); // Configuration Command  868MHz 12,pF Enable Tx Register
    }
    else
    {
        // Init Receive
        RFM12B_CMD(0x8068); // Configuration Command  868MHz 12,5pF Enable Rx FIFO buffer
    }

    // General Init
    RFM12B_CMD(0x82D8); // Power Management Command  Enable Crystal Osc.
    RFM12B_CMD(0xA640); // Frequency Command    Center Frequency 868.3200 MHz
    RFM12B_CMD(0xC647); // Datarate Command    Data Rate 4.789kbps
    RFM12B_CMD(0x94A5); // Receiver Control Command  VDI, Fast, 134kHz, Max, -73dBm
    RFM12B_CMD(0xC2EC); // Datafilter Command   Auto, Slow, Digital, 4
    RFM12B_CMD(0xCA8B); // FIFO / Reset Mode Command  8, 1 bytes, Synchrone, Low, FIFO Fill Enabled
    RFM12B_CMD(0xCED4); // Synchron Pattern Command  Synchron byte(LSB) D4
    RFM12B_CMD(0xC483); // AFC Command
    RFM12B_CMD(0x9827); // TX Configuration Command
    RFM12B_CMD(0xCC77); // PLL Command
    RFM12B_CMD(0xE000); // Wake-Up Timer Command
    RFM12B_CMD(0xC800); // Low Duty-Cycle Command
    RFM12B_CMD(0xC000); // LB Det./Clock Div. Command 2.2V, 1.66MHz
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_SEND                                       ///
/// Function: Send multiple bytes                     ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_SEND(int *ptr, int16 size)
{
    int16 i;

    RFM12B_CMD(0x8238); // Enable Sender

    RFM12B_WRITE(0xAA); // Preamble
    RFM12B_WRITE(0xAA); // Preamble
    RFM12B_WRITE(0xAA); // Preamble

    RFM12B_WRITE(0xCE); // Sync HighByte
    RFM12B_WRITE(0xD4); // Sync LowByte

    for (i=0;i<size;i++)
    {
        RFM12B_WRITE(*ptr); // DATA Byte
        ptr++;
    }

    RFM12B_WRITE(0xAA); // Dummy Byte
    RFM12B_WRITE(0xAA); // Dummy Byte
    RFM12B_WRITE(0xAA); // Dummy Byte

    RFM12B_WAIT_READY();
    RFM12B_CMD(0x8208); // Disable Sender
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_RECEIVE                                    ///
/// Function: Receive multiple bytes                  ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_RECEIVE(int *ptr, int16 size)
{
    int16 i;

    //RFM12B_CMD(0x82C8); // Init Receiver//test
    RFM12B_CMD(0x82D8); // Init Receiver//Candy
    //RFM12B_CMD(0xCA81); // Enable FIFO//test
    //RFM12B_CMD(0xCA83); // Clear FIFO//test

    for (i=0;i<size;i++)
    {
        *ptr = RFM12B_READ(); // Send Data
        ptr++;
    }

    //RFM12B_CMD(0x8208); // Disable Receiver test of we hem wel aan laten staan
    //RFM12B_CMD(0xCA83); // Clear FIFO//test
    //RFM12B_FIFO_RESET();
}

/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_FIFO_RESET                                 ///
/// Function: Reset the FIFO                          ///
///                                                   ///
/////////////////////////////////////////////////////////
void RFM12B_FIFO_RESET(void)
{
    RFM12B_CMD(0xCA81);
    RFM12B_CMD(0xCA83);
}


/////////////////////////////////////////////////////////
///                                                   ///
/// RFM12B_READ_STATUS                                ///
/// Function: Wait and read a byte from FIFO          ///
///                                                   ///
/////////////////////////////////////////////////////////
int16 RFM12B_READ_STATUS(void)
{
    int16 data;

    data = RFM12B_CMD(0x0000); // Read Data//test
    return (data);
}
///////////////////////////////////////////////////////////////////////////////





void main()
{
   int buffi[16];
   int g = 0;
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   
   set_tris_a(0x00);
   set_tris_c(get_tris_c()&(0b10111111));
   delay_ms(250);
   
   RFM12B_INIT(0);
   
   while(1)
   {
      RFM12B_RECEIVE(buffi, 16);  //data receive
     
      for(g = 0; g < 16; g++) //send to pc (USART) received data
      {
         putc(buffi[g]);
      }           
   }
}


PC RECEIVED DATA:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
255
255
255
0
0
0
0
0
0
0
0
255
255
255
255
255
255
255
255
0
0
0
0
0
255
255
255
255
255
255
255
255
255
255
255
0
192
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
255
252
0
0
0
255
255
255
255
255
255
255
255
0
0
0
0
0
0
0
0
255
240
0
0
0
0
0
jimbobanderson



Joined: 29 Sep 2010
Posts: 1

View user's profile Send private message

Verify SPI interface
PostPosted: Wed Sep 29, 2010 9:37 pm     Reply with quote

Jody - I am new to RFM12b and am struggling with the communication between my MCU (TI MSP430F2013) and the RFM module. Can you please tell me how you confirmed that your SPI communication was working between the two devices?

I have been through ALL of the related websites/blogs/technical documents.

Thanks,

Jimbobanderson
exjra



Joined: 25 Sep 2010
Posts: 3

View user's profile Send private message

PostPosted: Thu Sep 30, 2010 12:26 am     Reply with quote

Hello
I am trying to data transmitting for 5 days but can't succeed yet. I sent the circuit diagram and source codes of transmit and receive program. I can't find the mistake. Please help me.

http://hotfile.com/dl/72714041/f3e30b8/RFM12B.rar.html
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

PostPosted: Thu Sep 30, 2010 3:11 am     Reply with quote

exjra,

In your posted code:
RFM12B_WRITE(0xCE); // Sync HighByte
RFM12B_WRITE(0xD4); // Sync LowByte

should be:
RFM12B_WRITE(0x2D); // Sync HighByte
RFM12B_WRITE(0xD4); // Sync LowByte

0xCE is the command code to set the 2nd Sync byte. (0xCED4)
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

PostPosted: Thu Sep 30, 2010 3:27 am     Reply with quote

Jimbob,

I too have been struggling with the SPI interface and the RFM12b.

( for over a month now)

I have not seen anyone having the Hardware SPI working with this unit.

What I can tell you is the only way I have been able to get the transmitter to work is with the aid of a 10k pullup on the RFM12 SDO pin.

Verify you are sending clock pulses and the data stream.

from the strobotics site...
When nSEL signal is logic high, the SDO output is in a high impedance state.

The receiver is a different story. I too have tried several software revisions with no success.

I am abandoning the Hardware SPI for now and try the software spi implementation...
Nora



Joined: 23 Mar 2008
Posts: 50

View user's profile Send private message

RFM communications problems
PostPosted: Fri Mar 04, 2011 3:14 pm     Reply with quote

Resurrecting this thread....
Hoping that all of you from 2010 got this going and can help me out Smile

I am using a PIC18F452 and an RFM12BS @ 915MHz freq
Two boards, one is set for TX, the other RX

I can tell that my SPI is working because I disable the CLK (pin 5 on the RFM) in the Power Management Command (bit 0 = 1)
Then I look with scope and it is dead, when previously (bit 0 =1) there is a clock frequency. Also- I monitor SPI CLK signal (pin 13 on RFM), which is present.

What state is the nIRQ pin in at power up with no code in the PIC (erased)? Mine (on both boards) is LOW. Shouldn't it be HIGH unless it's doing something?

So I will start with TX for this post. I don't know how to know that I am transmitting (transmitted), unless I just look at the nIRQ pin, which is always LOW. Should there be something on the SDO pin (pin1 on RFM)?
I am using the suggested SPI pins on the PIC, so does this mean I am using hardware SPI?

So I'll post my code in pieces. Here are my configuration parameters- thought my notes might be useful to someone else as well.
Code:

//**************************************************
#include <18F452.h>
#fuses HS, NOWDT, PUT, BROWNOUT, NOLVP   
#use delay(clock = 20000000)   
#include <stdlib.h>
#define SPI_MODE_0  (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1  (SPI_L_TO_H)
#define SPI_MODE_2  (SPI_H_TO_L)
#define SPI_MODE_3  (SPI_H_TO_L | SPI_XMIT_L_TO_H)

//========================================
void main()
{
int i;
output_high(PIN_C0); // chip select
delay_us(500);
setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64);
output_low(PIN_C0);  // chip select, ready to rock and roll

//1. Configuration settting. Enable TX register, select 915 band, crystal load capacitor 8.5pF
// The crystal load capacitor is used to fine tune the onboard crystal and is best left to the default of binary ‘1000’ (which I didn't do)
spi_write(0b10000000); // cmd byte
spi_write(0b10110000); // parameter byte
delay_us(100);
output_high(PIN_C0); // chip select high
delay_us(500);

output_low(PIN_C0); // chip select
//2. Power management. Enable base band block, transmitter,synthesizer, low batt detect, disable crystal output
spi_write(0b10000010); // cmd byte
spi_write(0b00100001); // parameter byte
delay_us(100);
output_high(PIN_C0); // chip select high
delay_us(500);

output_low(PIN_C0);
//3. Frequency setting. 915-900/ 0.0075 = 2000 = 0b0111 11010000
spi_write(0b10100111); // cmd byte
spi_write(0b11010000); // parameter byte
delay_us(100);
output_high(PIN_C0);

output_low(PIN_C0);
//4. Data Rate. 9600 Baud rate to start with. TX and RX must be setup to same Baud Rate!
// R[6:0] where BR = 10Mhz / 29 / (R + 1) / (1 + bit7*7)
// For 9600 baud rate BR =  10Mhz / 29 / (R + 1) / (1 + 0*7) = 10000000 / 29 / (35 + 1) = 9578.5 ~ 9600
spi_write(0b11000110); // cmd byte
spi_write(0b00100011); // parameter byte   
delay_us(100);
output_high(PIN_C0);   // chip select off

      output_high(Pin_A5); // LED output say hello
      delay_ms(1000);
      output_low(Pin_A5);
      delay_ms(1000);

// all other parameters left to default
// LNA is low noise amplifier, BB is upper end of signal, -103 dBm is super sensitive


Last edited by Nora on Fri Mar 04, 2011 3:40 pm; edited 1 time in total
Nora



Joined: 23 Mar 2008
Posts: 50

View user's profile Send private message

PostPosted: Fri Mar 04, 2011 3:22 pm     Reply with quote

So here is pseudo code that the vendor RF Solutions in the UK sent to me

To transmit using FIFO you would:-
Initialize the module
Enable TX
Load a byte of data into the FIFO register
Check if nIRQ is high
If so load next byte
Check if nIRQ is high
If so load next byte and so on until packet is sent
Disable TX

And then Stephen at strobotics said this for transmission
Write preamble 2x
Turn on TX
Send out each byte in the packet // how? via spi_write()?
Write preamble 2x
Turn off TX

When the transmission of the byte completed, the nIRQ pin goes low.
The nIRQ pulse shows that the first 8 bits (the first byte, by default ) has transmitted. There are still 8 bits in the transmit register.
Code:

output_low(PIN_C0); // chip select   
spi_write(0b10101010); // preamble
spi_write(0b10101010); // preamble
spi_write(0x2D);       // Synchron pattern from power on reset FIFO and Reset Mode command
spi_write(0xD4);       // Synchron pattern from power on reset FIFO and Reset Mode command   
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group