示例#1
0
/*

  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;
}
示例#2
0
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;
}
示例#3
0
void RFXX_PORT_INIT(void) {
  HI_SEL();
  HI_SDI();
  LOW_SCK();

  SEL_OUTPUT();
  SDI_OUTPUT();
  SDO_INPUT();
  SCK_OUTPUT();
}
示例#4
0
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();
}
示例#5
0
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	


}
示例#6
0
/* 
  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
	}
}
示例#7
0
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);
}