/* Write a Command to the RFM Module using SPI Requires: 16bit valid command Returns: 16bit result from transaction This is a bi-directional transfer. A command is clocked out to the RFM a bit at a time. At the same time a result is clocked back in a bit at a time. */ uint WriteCMD(uint CMD) { uint RESULT = 0; // Holds the received SDI uchar n=16; // number of bits in SPI Command we need to send LOW_SCK(); // SCK LOW LOW_SEL(); // CS LOW while(n--) // Send All 16 Bits MSB First { if (CMD&0x8000) { Write1(); // Write 1 via SDI } else { Write0(); // Write 0 via SPI } RESULT<<=1; // Shift left for next bit to receive if(SDI) // Check if we received a high on SDI RESULT |= 0x0001; // RESULT LSB = 1 CMD<<=1; // Shift left for next bit to send } LOW_SCK(); // SCK LOW HI_SEL(); // CS HIGH - Finished Sending Command return RESULT; }
uint16_t rfxx_wrt_cmd(uint16_t aCmd) { uint8_t i; uint16_t temp = 0; LOW_SCK(); LOW_SEL(); //for (i=0; i<16; i++) { for (i = 0; i < sizeof(uint16_t); ++i) { temp <<= 1; if (SDO_HI()) temp |= 0x0001; LOW_SCK(); (aCmd & 0x8000) ? (HI_SDI()) : (LOW_SDI()); /* if (aCmd & 0x8000) HI_SDI(); else LOW_SDI(); */ HI_SCK(); aCmd <<= 1; } LOW_SCK(); HI_SEL(); return temp; }
void RFXX_PORT_INIT(void) { HI_SEL(); HI_SDI(); LOW_SCK(); SEL_OUTPUT(); SDI_OUTPUT(); SDO_INPUT(); SCK_OUTPUT(); }
void RFXX_PORT_INIT(void){ HI_SEL(); HI_SDI(); LOW_SCK(); //SET nFFS pin HI when using FIFO HI_DATA(); SEL_OUTPUT(); SDI_OUTPUT(); SDO_INPUT(); SCK_OUTPUT(); IRQ_IN(); DATA_OUT(); }
void init(void) { //osccon = 0x70; // 8Mhz internal OSC cmcon = 0x07; //ansel = 0; // all is digital i/o on PortA option_reg.NOT_RBPU = 0; // enable pullup resistors on PB option_reg.INTEDG = 0; // falling edge interrupt CONF_LED1_OUT(); LED1=0; // setup SPI // outputs RFM12_CS_OUT(); // Module Chip Select HI_SEL(); // RF CS is Active Low so set High SCK_OUT(); // SPI SCK as Output LOW_SCK(); SDO_OUT(); // SPI SDO as Output LOW_SDO(); // inputs RFM12_nIRQ_IN(); // nIRQ SDI_IN(); // SPI SDI delay_ms(500); // Wait for RFM12 POR WriteCMD(0x80F7); // 915 EL, EF, 12.0pf WriteCMD(0xA7D0); // 915=A7D0 904.50MHZ = A258 WriteCMD(0xC623); // c608=38400 c611=19200 c623= 9600bps WriteCMD(0xC22C); // Data Filter: AL, !ML, digital filter, 4 dqd WriteCMD(0xC4F7); // AFC Autotune, -10khz..+7.5Khz, !st, !fi, OE, EN WriteCMD(0x96A0); // P16, VDI, FAST, 65khz, 0dBm, -103dBm WriteCMD(0xCA81); // FIFO8, SYNC, !ff, DR //TX Config //WriteCMD(0x9850); // !mp, 9810=30Khz, MAX out WriteCMD(0xE000); // NOT USE WriteCMD(0xC80E); // NOT USE WriteCMD(0xC000); // CLK 1mhz, 2.2v WriteCMD(0x8280); // ER, EBB, !ET, ES, EX, !EB, !EW, !DC }
/* Waits for RFM 12 to become ready by checking first bit of status register Before we can Tx or Rx data the RFM12 needs to be ready, i.e. not in the middle of transmitting a previous byte This function is blocking and will only return when it is ready to Tx or Rx */ void WaitReady(void) { //#ifdef DEBUG // always return for simulator // return; //#endif unsigned long timeout = 0; bit READY = 0; while(READY == 0) { LOW_SCK(); // SCK LOW LOW_SEL(); // CS LOW Write0(); if(SDI==1) // check RGIT bit of status (first bit) { // If HIGH then Tx/RX is ready to accept the next byte READY = 1; } LOW_SCK(); // SCK LOW LOW_SDO(); HI_SEL(); // CS HIGH - Finished Sending Command } }
unsigned int RFXX_WRT_CMD(unsigned int aCmd){ unsigned char i; unsigned int temp; temp=0; LOW_SCK(); LOW_SEL(); for(i=0;i<16;i++){ if(aCmd&0x8000){ HI_SDI(); }else{ LOW_SDI(); } HI_SCK(); temp<<=1; if(SDO_HI()){ temp|=0x0001; } LOW_SCK(); aCmd<<=1; }; HI_SEL(); return(temp); }