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 }
/******************************************************************************* * 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; }
// 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 }
// 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 }
// 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 }
/******************************************************************************* * 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); }
// 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; }
// 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 } }
// 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 }