Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #4
0
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);
}
Exemple #5
0
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;
}
Exemple #6
0
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;
}