void mirf_config() 
// Sets the important registers in the MiRF module and powers the module
// in receiving mode
{
    // Set RF channel
    mirf_config_register(RF_CH,mirf_CH);

    // Set length of incoming payload 
    mirf_config_register(RX_PW_P0, mirf_PAYLOAD);

    // Start receiver 
    PTX = 0;        // Start in receiving mode
    RX_POWERUP;     // Power up in receiving mode
    mirf_CE_hi;     // Listening for pakets
}
Exemple #2
0
/*******************************************************************************
 * Sends a data package to the default address. Be sure to send the correct    *
 * amount of bytes as configured as payload on the receiver                    *
 ******************************************************************************/
void mirf_send(uint8_t * value, uint8_t len)
{
    while (PTX) {}                  // Wait until last paket is send

    mirf_CE_lo;

    PTX = 1;                        // Set to transmitter mode
    TX_POWERUP;                     // Power up

    mirf_CSN_lo;                    // Pull down chip select
    spi_fast_shift( FLUSH_TX );     // Write cmd to flush tx fifo
    mirf_CSN_hi;                    // Pull up chip select

    mirf_CSN_lo;                    // Pull down chip select
    spi_fast_shift( W_TX_PAYLOAD ); // Write cmd to write payload
    spi_transmit_sync(value,len);   // Write payload
    mirf_CSN_hi;                    // Pull up chip select

    mirf_CE_hi;                     // Start transmission

    while(mirf_is_sending());

	mirf_CE_lo;                     // Deactivate transreceiver
	RX_POWERUP;                     // Power up in receiving mode

	mirf_CE_hi;                     // Listening for pakets
	PTX = 0;                        // Set to receiving mode

	// Reset status register for further interaction
	mirf_config_register(STATUS,(1<<TX_DS)|(1<<MAX_RT));

	//mirf_CE_lo;

	POWERDOWN;
}
Exemple #3
0
// Reads mirf_PAYLOAD bytes into data array
void mirf_get_data(uint8_t *data) {
	mirf_CSN_lo; // Pull down chip select
	spi_transfer(R_RX_PAYLOAD); // Send cmd to read rx payload
	spi_read_data(data, mirf_PAYLOAD); // Read payload
	mirf_CSN_hi; // Pull up chip select
	mirf_config_register(STATUS,(1<<RX_DR)); // Reset status register
}
Exemple #4
0
// Sets the important registers in the MiRF module and powers the module
// in receiving mode
void mirf_config(void) {
	// Set RF channel
	mirf_config_register(RF_CH, mirf_CH);

	// Set length of incoming payload 
	mirf_config_register(RX_PW_P0, mirf_PAYLOAD);
	
	// Set RADDR and TADDR
	mirf_write_register(RX_ADDR_P0, TADDR, 5);
	mirf_write_register(TX_ADDR, TADDR, 5);
	
	// Enable RX_ADDR_P0 address matching since we also enable auto acknowledgement
	mirf_config_register(EN_RXADDR, 1<<ERX_P0);

	PMODE = TXMODE; // Start in transmitting mode
	TX_POWERUP;     // Power up in transmitting mode
}
extern void mirf_get_data(uint8_t * data) 
// Reads mirf_PAYLOAD bytes into data array
{
    mirf_CSN_lo;                               // Pull down chip select
    spi_fast_shift( R_RX_PAYLOAD );            // Send cmd to read rx payload
    spi_transfer_sync(data,data,mirf_PAYLOAD); // Read payload
    mirf_CSN_hi;                               // Pull up chip select
    mirf_config_register(STATUS,(1<<RX_DR));   // Reset status register
}
Exemple #6
0
// Sets the important registers in the MiRF module and powers the module
// in receiving mode
void mirf_config(void) {
  // Set RF channel
  mirf_config_register(RF_CH, mirf_CH);

  // Set length of incoming payload 
  mirf_config_register(RX_PW_P0, mirf_PAYLOAD);

  // Set RADDR and TADDR
  mirf_write_register(RX_ADDR_P0, RADDR, 5);
  mirf_write_register(TX_ADDR, TADDR, 5);
  
  // Only enable RX_ADDR_P0 address matching
  mirf_config_register(EN_RXADDR, (1<<ERX_P0));
  mirf_config_register(EN_AA, 0x00);

  // Start receiver 
  PMODE = RXMODE; // Start in receiving mode
  RX_POWERUP;     // Power up in receiving mode
}
Exemple #7
0
/*******************************************************************************
 * Initializes pins ans interrupt to communicate with the MiRF module          *
 * Should be called in the early initializing phase at startup.                *
 ******************************************************************************/
void mirf_init()
{
    // Define CSN and CE as Output and set them to default
    DDRB |= ((1<<CSN)|(1<<CE));

    mirf_CE_lo;
    mirf_CSN_hi;

    // Initialize external interrupt on port PD2
	//EICRA |= _BV(ISC01);
	//EIMSK |= _BV(INT0);

    spi_init();

	// Set RF channel
	mirf_config_register(RF_CH,mirf_CH);

    // Set length of incoming payload
    mirf_config_register(RX_PW_P0, mirf_PAYLOAD);
}
Exemple #8
0
// Sets the important registers in the MiRF module and powers the module
// in receiving mode
void mirf_config(void) {
	// Set RF channel
	mirf_config_register(RF_CH, mirf_CH);
	
	// Set length of incoming payload 
	mirf_config_register(RX_PW_P0, mirf_PAYLOAD);
	mirf_config_register(RX_PW_P1, mirf_PAYLOAD);
	
	// Set auto retransmit delay to 500uS and leave auto retransmit count to 3
	mirf_config_register(SETUP_RETR, (1<<4) | 3);
	
	// Set RADDR and TADDR
	mirf_write_register(RX_ADDR_P0, TADDR, 5);
	mirf_write_register(RX_ADDR_P1, RADDR, 5);
	mirf_write_register(TX_ADDR, TADDR, 5);
	
	// Enable RX_ADDR_P0 and RX_ADDR_P1 address matching since we also enable auto acknowledgement
	mirf_config_register(EN_RXADDR, (1<<ERX_P0 | 1<<ERX_P1));
	
	// Power up in transmitter mode
	TX_POWERUP;
}
Exemple #9
0
// Send data and wait for an ACK
uint8_t mirf_transmit_data(void) {
	TX_POWERUP; // Power up to transmitter mode
	
	mirf_CSN_lo; // Pull down chip select
	spi_transfer(FLUSH_TX); // Write cmd to flush tx fifo
	mirf_CSN_hi; // Pull up chip select
	
	mirf_CSN_lo;  // Pull down chip select
	spi_transfer(W_TX_PAYLOAD); // Write cmd to write payload
	spi_write_data(data_out, mirf_PAYLOAD); // Write payload
	mirf_CSN_hi; // Pull up chip select
	
	mirf_CE_hi; // Start transmission
	_delay_us(15);
	mirf_CE_lo;
	
	int waitcount = 0;
	while (!(mirf_status() & (1<<TX_DS))) { // Wait until we receive an ACK back
		_delay_us(500); // Wait the auto retransmit time
		if (mirf_status() & (1<<MAX_RT)) { // If maximum retries reached
			mirf_config_register(STATUS, 1<<MAX_RT); // Reset maximum retries to be able to transmit again next time
			mirf_CE_hi;
			_delay_us(15);
			mirf_CE_lo;
		}
		waitcount++;
		if (waitcount >= 10) { // If we haven't heard back in 5ms, exit
			mirf_config_register(STATUS, 1<<MAX_RT); // Reset maximum retries to be able to transmit again next time
			return 0;
		}
	}
	
	mirf_config_register(STATUS,(1<<TX_DS)); // Reset status register
	
	return 1;
}
extern void mirf_poll_for_irq(void)
{    
	uint8_t status;   
    // If still in transmitting mode then finish transmission
    if (PTX) {
    
        // Read MiRF status 
        mirf_CSN_lo;                                // Pull down chip select
        status = spi_fast_shift(NOP);               // Read status register
        mirf_CSN_hi;                                // Pull up chip select

        mirf_CE_lo;                             // Deactivate transreceiver
        RX_POWERUP;                             // Power up in receiving mode
        mirf_CE_hi;                             // Listening for pakets
        PTX = 0;                                // Set to receiving mode

        // Reset status register for further interaction
        mirf_config_register(STATUS,(1<<TX_DS)|(1<<MAX_RT)); // Reset status register
	}	
}
Exemple #11
0
// Sets the important registers in the MiRF module and powers the module
// in receiving mode
void mirf_config(void) {
  // Set RF channel
  mirf_config_register(RF_CH, mirf_CH);

  // air data rate: 1Mbps
  mirf_config_register(RF_SETUP, 0x6);

  // Set length of incoming payload 
  mirf_config_register(RX_PW_P0, mirf_PAYLOAD);
  mirf_config_register(RX_PW_P1, mirf_PAYLOAD);  
  // Set RADDR and TADDR(autoack)
  /* mirf_write_register(RX_ADDR_P0, &tx_addr[0], 5); */
  /* mirf_write_register(TX_ADDR, &tx_addr[0], 5); */
  /* mirf_write_register(RX_ADDR_P1, &rx_addr[0], 5); */
#ifdef TRANSMIT_MODE
  mirf_write_register(RX_ADDR_P0, &addr[0], 5);
  mirf_write_register(TX_ADDR, &addr[0], 5);
#endif
#ifdef RECEIVE_MODE
  mirf_CE_hi
  mirf_write_register(RX_ADDR_P1, &addr[0], 5);
#endif
  mirf_config_register(EN_AA, 0x03);

  // Enable RX_ADDR_P0 address matching since we also enable auto acknowledgement
  /* mirf_config_register(EN_RXADDR, 1<<ERX_P1); */
  mirf_config_register(EN_RXADDR, 1<<ERX_P0 | 1<<ERX_P1);
//from enrf24
  //mirf_config_register(FEATURE, 0x04);  // enable dynamic payloads length
  //mirf_config_register(DYNPD, 0x03); // enable dynamic payload length data pipe 0 and data pipe 1

  /* mirf_config_register(SETUP_RETR, 0x7F); */
  /* PMODE = TXMODE; // Start in transmitting mode */
  /* TX_POWERUP;     // Power up in transmitting mode */
  //frankalicious: testing
  /* PMODE = RXMODE; // Start in transmitting mode */
  /* RX_POWERUP; */
#ifdef TRANSMIT_MODE
  PMODE = TXMODE; // Start in transmitting mode
  TX_POWERUP;     // Power up in transmitting mode
#endif
#ifdef RECEIVE_MODE
  PMODE = RXMODE; // Start in transmitting mode
  RX_POWERUP;     // Power up in transmitting mode
#endif

}