void nrf_config_get(nrfconfig config){ // nrf_write_reg(R_SETUP_AW,R_SETUP_AW_5); config->channel=nrf_read_reg(R_RF_CH); config->nrmacs=nrf_read_reg(R_EN_RXADDR); if(config->nrmacs & R_EN_RXADDR_ERX_P5 ) config->nrmacs=6; else if(config->nrmacs & R_EN_RXADDR_ERX_P4 ) config->nrmacs=5; else if(config->nrmacs & R_EN_RXADDR_ERX_P3 ) config->nrmacs=4; else if(config->nrmacs & R_EN_RXADDR_ERX_P2 ) config->nrmacs=3; else if(config->nrmacs & R_EN_RXADDR_ERX_P1 ) config->nrmacs=2; else config->nrmacs=1; // config->nrmacs=6; for(int i=0;i<config->nrmacs;i++){ config->maclen[i]=nrf_read_reg(R_RX_PW_P0+i); if(i==0){ nrf_read_long(R_RX_ADDR_P0,5,config->mac0); }else if(i==1){ nrf_read_long(R_RX_ADDR_P1,5,config->mac1); }else if(i>1){ nrf_read_long(R_RX_ADDR_P0+i,1,config->mac2345+i-2); }; }; nrf_read_long(R_TX_ADDR,5,config->txmac); };
int nrf_rcv_pkt_poll(int maxsize, uint8_t * pkt) { uint8_t len; uint8_t status=0; for(int i=0;i<maxsize;i++) pkt[i] = 0x00; // Sanity: clear packet buffer status =nrf_cmd_status(C_NOP); if((status & R_STATUS_RX_P_NO) == R_STATUS_RX_FIFO_EMPTY){ if( (status & R_STATUS_RX_DR) == R_STATUS_RX_DR){ nrf_write_reg(R_STATUS,R_STATUS_RX_DR); }; return 0; }; nrf_read_long(C_R_RX_PL_WID,1,&len); nrf_write_reg(R_STATUS,R_STATUS_RX_DR); if(len>32 || len==0){ return -2; // no packet error }; if(len>maxsize){ return -1; // packet too large }; nrf_read_pkt(len,pkt); return len; };
int nrf_receive_poll (uint8_t * frame) { uint8_t len; uint8_t status = 0; if (mode != MODE_RECEIVE_POLL) return (-1); status = nrf_cmd_status (C_NOP); if ((status & R_STATUS_RX_P_NO) == R_STATUS_RX_FIFO_EMPTY) { if ((status & R_STATUS_RX_DR) == R_STATUS_RX_DR) { nrf_write_reg (R_STATUS, R_STATUS_RX_DR); }; return 0; } nrf_read_long (C_R_RX_PL_WID, 1, &len); nrf_write_reg (R_STATUS, R_STATUS_RX_DR); if (len > 32) return -2; if (len < 1) return -1; /* UART2PutHex (status); UART2PutStr (" "); UART2PutHex (len); UART2PutStr ("\r\n"); */ mLED_2_On (); nrf_read_pkt (32, frame); mLED_2_Off (); return len; }
// High-Level: int nrf_rcv_pkt_time_encr(int maxtime, int maxsize, uint8_t * pkt, uint32_t const key[4]){ uint8_t len; uint8_t status=0; uint16_t cmpcrc; nrf_write_reg(R_CONFIG, R_CONFIG_PRIM_RX| // Receive mode R_CONFIG_PWR_UP| // Power on R_CONFIG_EN_CRC // CRC on, single byte ); nrf_cmd(C_FLUSH_RX); nrf_write_reg(R_STATUS,0); CE_HIGH(); for(int i=0;i<maxsize;i++) pkt[i] = 0x00; // Sanity: clear packet buffer #define LOOPY 10 for (;maxtime >= LOOPY;maxtime-=LOOPY){ delayms(LOOPY); status =nrf_cmd_status(C_NOP); if( (status & R_STATUS_RX_DR) == R_STATUS_RX_DR){ if( (status & R_STATUS_RX_P_NO) == R_STATUS_RX_FIFO_EMPTY){ nrf_cmd(C_FLUSH_RX); delayms(1); nrf_write_reg(R_STATUS,0); continue; }else{ // Get/Check packet... nrf_read_long(C_R_RX_PL_WID,1,&len); if(len>32 || len==0){ continue; return -2; // no packet error }; if(len>maxsize){ continue; return -1; // packet too large }; nrf_read_pkt(len,pkt); if(key != NULL) xxtea_decode_words((uint32_t*)pkt,len/4,key); cmpcrc=crc16(pkt,len-2); if(cmpcrc != (pkt[len-2] <<8 | pkt[len-1])) { continue; return -3; // CRC failed }; break; }; }; }; CE_LOW(); CS_HIGH(); if(maxtime<LOOPY) return 0; // timeout return len; };