u8 XN297_ReadPayload(u8* msg, int len) { // TODO: if xn297_crc==1, check CRC before filling *msg u8 res = NRF24L01_ReadPayload(msg, len); for(u8 i=0; i<len; i++) msg[i] = bit_reverse(msg[i])^bit_reverse(xn297_scramble[i+xn297_addr_len]); return res; }
bool NRF24L01_ReadPayloadIfAvailable(uint8_t *data, uint8_t length) { if (NRF24L01_ReadReg(NRF24L01_17_FIFO_STATUS) & BV(NRF24L01_17_FIFO_STATUS_RX_EMPTY)) { return false; } NRF24L01_ReadPayload(data, length); return true; }
uint8_t XN297_ReadPayload(uint8_t* msg, int len) { uint8_t res = NRF24L01_ReadPayload(msg, len); uint8_t i; for(i = 0; i<len; i++) msg[i] = bit_reverse(msg[i]) ^ bit_reverse(xn297_scramble[i+xn297_addr_len]); return res; }
static rx_spi_received_e readrx(uint8_t *packet) { if (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_STATUS_RX_DR))) { uint32_t t = micros() - packet_timer; if (t > rx_timeout) { switch_channel(); packet_timer = micros(); } return RX_SPI_RECEIVED_NONE; } packet_timer = micros(); NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_STATUS_RX_DR)); // clear the RX_DR flag NRF24L01_ReadPayload(packet, V2X2_PAYLOAD_SIZE); NRF24L01_FlushRx(); switch_channel(); return decode_packet(packet); }
static u8 packet_ack() { if (++dbg_cnt > 50) { dbgprintf("S: %02x\n", NRF24L01_ReadReg(NRF24L01_07_STATUS)); dbg_cnt = 0; } switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT))) { case BV(NRF24L01_07_TX_DS): rx_payload_len = NRF24L01_GetDynamicPayloadSize(); if (rx_payload_len > MAX_PACKET_SIZE) { rx_payload_len = MAX_PACKET_SIZE; } NRF24L01_ReadPayload(rx_packet, rx_payload_len); return PKT_ACKED; case BV(NRF24L01_07_MAX_RT): return PKT_TIMEOUT; } return PKT_PENDING; }
void readrx(void) { int chan; uint16_t data[8]; if (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))) { uint32_t t = lib_timers_gettimermicroseconds(packet_timer); if (t > rx_timeout) { if (boundprotocol != PROTO_NONE) { if (++missed_packets > 500 && bind_phase == PHASE_JUST_BOUND) { valid_packets = missed_packets = bad_packets = 0; bind_phase = PHASE_LOST_BINDING; prepare_to_bind(); } } else switch_channel(); packet_timer = lib_timers_starttimer(); } return; } packet_timer = lib_timers_starttimer(); NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_RX_DR)); NRF24L01_ReadPayload(packet, V2X2_PAYLOAD_SIZE); NRF24L01_FlushRx(); switch_channel(); if (!decode_packet(packet, data)) return; for (chan = 0; chan < 8; ++chan) { // data = pwmRead(chan); // if (data < 750 || data > 2250) // data = 1500; // convert from 1000-2000 range to -1 to 1 fixedpointnum range and low pass filter to remove glitches lib_fp_lowpassfilter(&global.rxvalues[chan], ((fixedpointnum) data[chan] - 1500) * 131L, global.timesliver, FIXEDPOINTONEOVERONESIXTYITH, TIMESLIVEREXTRASHIFT); } // reset the failsafe timer global.failsafetimer = lib_timers_starttimer(); }
u16 ASSAN_callback() { switch (state) { // Bind case BIND0: //Config RX @1M NRF24L01_WriteReg(NRF24L01_05_RF_CH, RF_BIND_CHANNEL); NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps NRF24L01_SetTxRxMode(RX_EN); state = BIND1; /* FALLTHROUGH */ case BIND1: //Wait for receiver to send the frames if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR)) { //Something has been received NRF24L01_ReadPayload(packet, PACKET_SIZE); if(packet[19]==0x13) { //Last frame received state = BIND2 | WAIT; //Switch to TX NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TX_EN); //Prepare bind packet memset(packet,0x05,PACKET_SIZE-5); packet[15]=0x99; for(u8 i=0;i<4;i++) packet[16+i]=packet[23-i]; packet_count=0; return 10000; } } return 1000; case BIND2|WAIT: if(++packet_count == 27) // Wait 270ms in total... { packet_count = 0; state &= ~WAIT; } return 10000; case BIND2: // Send 20 packets packet_count++; if(packet_count==20) packet[15]=0x13; // different value for last packet NRF24L01_WritePayload(packet, PACKET_SIZE); if(packet_count==20) { state = DATA0 | WAIT; packet_count = 0; } return 22520; case DATA0|WAIT: if(++packet_count == 217) state &= ~WAIT; return 10000; // Normal operation case DATA0: // Bind Done PROTOCOL_SetBindState(0); NRF24L01_SetBitrate(NRF24L01_BR_250K); // 250Kbps NRF24L01_SetTxRxMode(TXRX_OFF); NRF24L01_SetTxRxMode(TX_EN); /* FALLTHROUGH */ case DATA1: case DATA4: // Change ID and RF channel NRF24L01_WriteRegisterMulti(NRF24L01_10_TX_ADDR, packet+20+4*hopping_frequency_no, ADDRESS_LENGTH); NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no]); hopping_frequency_no^=0x01; state=DATA2; return 2000; case DATA2: case DATA3: send_packet(); state++; // DATA 3 or 4 return 5000; } return 0; }