void hal_nrf_send_pkt(u8 *buf, u8 len) { u8 i; while( (hal_nrf_tx_cnt+len+1) > HAL_NRF_TX_BUF_LEN); /** enter Mutex region */ IRQ_DIS(); if(hal_nrf_tx_cnt || hal_nrf_tx_busy){ hal_nrf_tx_buf[hal_nrf_tx_wr_index] = len; hal_nrf_tx_wr_index++; if(hal_nrf_tx_wr_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_wr_index = 0; } hal_nrf_tx_cnt++; for(i=0; i<len; i++){ hal_nrf_tx_buf[hal_nrf_tx_wr_index] = buf[i]; hal_nrf_tx_wr_index++; if(hal_nrf_tx_wr_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_wr_index = 0; } hal_nrf_tx_cnt++; } } else{ switch(hal_nrf_sta){ case HAL_NRF_STA_TX: /** TX modoule idle, data to USART data register */ hal_nrf_write_tx_payload(buf, len); // CE_HIGH(); // T2_START(); t2_start_delay(); hal_nrf_tx_busy = 1; break; case HAL_NRF_STA_RX: /* FRIST TX PAYLOAD */ // hal_nrf_ack_flag = 1; // read_flash_buf(slave_cmd, slave_cmd_request, CMD_LENGTH); // hal_nrf_write_ack_payload(0, slave_cmd, CMD_LENGTH); hal_nrf_tx_buf[hal_nrf_tx_wr_index] = len; hal_nrf_tx_wr_index++; if(hal_nrf_tx_wr_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_wr_index = 0; } hal_nrf_tx_cnt++; for(i=0; i<len; i++){ hal_nrf_tx_buf[hal_nrf_tx_wr_index] = buf[i]; hal_nrf_tx_wr_index++; if(hal_nrf_tx_wr_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_wr_index = 0; } hal_nrf_tx_cnt++; } break; } } /** exit Mutex region */ IRQ_EN(); }
/* Send function. * Write to send_buf[1] - send_buf[31] before calling this function. * command will be placed in send_buf[0].*/ void send(command_t command) { uint8_t i; // Set operation mode to transmit. CE_LOW(); hal_nrf_set_operation_mode(HAL_NRF_PTX); // Copy command to send buffer. send_buf[0] = command; hal_nrf_write_tx_payload(send_buf, PAYLOAD_SIZE); // Activate sender CE_PULSE(); send_success = false; // Wait for radio to transmit while (RFF != 1) ; RFF = 0; nrf_irq(); // Clear send buffer. for (i = 0; i < PAYLOAD_SIZE; i++) { send_buf[i] = 0x00; } // Reset operation mode to receive. hal_nrf_set_operation_mode(HAL_NRF_PRX); CE_HIGH(); }
/** Send the RF packet to designated destination. * Use this function to send RF packet. * * @param *in_dst_addr The destination address. * @param *in_tx_pload The pointer point to the packet to be sent. * @param in_length The packet length. */ void epl_rf_en_send_dst(unsigned char *in_dst_addr, unsigned char *in_tx_pload, unsigned char in_pload_length) { hal_nrf_set_address(HAL_NRF_TX, in_dst_addr); // Address for PTX (The address of destination.) epl_rf_en_enter_tx_mode(); hal_nrf_write_tx_payload(in_tx_pload, in_pload_length); CE_PULSE(); }
void hal_nrf_send_cmd(u8 *buf, u8 sta) { /** auto ack delay */ HAL_NRF_WAIT_ACK_DONE(); IRQ_DIS(); CE_LOW(); hal_nrf_flush_tx(); hal_nrf_flush_rx(); hal_nrf_sta = HAL_NRF_STA_TX_CMD; // hal_nrf_sta_next = sta; hal_nrf_write_tx_payload(buf, CMD_LENGTH); // hal_nrf_write_tx_payload_noack(buf, CMD_LENGTH); hal_nrf_set_operation_mode(HAL_NRF_PTX); // CE_HIGH(); // T2_START(); t2_start_delay(); IRQ_EN(); }
void main() { P0DIR = ~((1<<4)|(1<<0)); // hal_spi_slave_init( HAL_SPI_MODE_0, HAL_SPI_LSB_MSB); SPISCON0 = 0x40; I3FR = 1; // rising edge SPI ready detect P0_0 = 0; INTEXP = 0x01; //Slave SPI Interrupt // ET0 = 1; // enable timer interrupt // EX0 = 1; SPISDAT = 0xAA; SPISDAT = 0xAA; SPI = 1; // Enable SPI Interrupt SPISCON0 |= 0x01; // Enable the radio clock // RFCKEN = 1; // Enable RF interrupt // RF = 1; // Enable global interrupt EA = 1; // Power up radio hal_nrf_set_power_mode(HAL_NRF_PWR_UP); while(1) { while(radio_busy); hal_nrf_write_tx_payload('a', 1); // Toggle radio CE signal to start transmission CE_PULSE(); radio_busy = true; } }
void main() { uint8_t is = 0;; acq_block = 0; P0DIR = ~( 1<<6); //P1DIR = ~((1<<6) | (1<<5) | (1<<3)); // P0CON = 0x66; #ifdef MCU_NRF24LU1P USBSLP = 0x01; // disable usb // P0DIR = (1<<3)|(1<<1)|(1<<0); // P0ALT = 0x0F; // P0EXP = 0x02; // Slave SPI for P0 // SSCONF = 0x01; //Enable slave SPI // Enable radio SPI RFCTL = 0x10; // I3FR = 1; // rising edge SPI ready detect P0_0 = 0; // INTEXP = 0x01; //Slave SPI Interrupt #else // P0DIR = ~((1<<4)|(1<<0)); // SPISCON0 = 0x40; // I3FR = 1; // rising edge SPI ready detect // P1_4 = 1; // INTEXP = 0x01; //Slave SPI Interrupt #endif // SPI = 1; // Enable SPI Interrupt // ET0 = 1; // enable timer interrupt // EX0 = 1; // hal_digi_init(); // hal_digi_write(0); prog_led(14); prog_led(0); init_radio(); init_adc(); initTimer(); cnt = MAXLENGTH; dataNeedsTx = 0; hal_adc_start(); procPayload = false; for(;;) { if(!isStimulating) { // PWRDWN = 0x07; } if(dataNeedsTx) { P1_4 = 1; ++pktCount; payload[((acq_block^(0x01))&(0x01))][MAXLENGTH] = (isStimulating) + (pktCount&(0x7F)); // hal_nrf_set_power_mode(HAL_NRF_PWR_UP); hal_nrf_write_tx_payload(payload[((acq_block^(0x01))&(0x01))],MAXLENGTH+1); P1_4 = 0; radio_busy = true; // Toggle radio CE signal to start transmission CE_PULSE(); // Wait for radio operation to finish while(radio_busy); // hal_nrf_set_power_mode(HAL_NRF_PWR_DOWN); if(procPayload) { procPayload = false; pAll = (progAll *)progPayload; if(pAll->pType == PROGSTIM) { pStim = pAll->pStim; // g_Amplitude = pStim.Amplitude; if(0 == pStim.Freq || 0 == pStim.Amplitude) { ET2 = 0; // disable timer2 interrupt isStimulating = 0; prog_led(pStim.Amplitude); } else { ET2 = 1; progTimer(&pStim); } } if(pAll->pType == PROGALGO) { pAlgo = pAll->pAlgo; low_thresh = pAlgo.low; high_thresh = pAlgo.high; progSD(&pAlgo); } } dataNeedsTx = 0; } } }
__interrupt void HAL_NRF_ISR(void) { u8 status, len, i; if(!IRQ) { /** */ // Read and clear IRQ flags from radio status = hal_nrf_nop(); // if(hal_nrf_ack_flag){ // if((status&0x60) == 0x60){ // hal_nrf_ack_flag = 0; // }else{ // read_flash_buf(slave_cmd, slave_cmd_request, CMD_LENGTH); // hal_nrf_write_ack_payload(0, slave_cmd, CMD_LENGTH); // } // } #ifdef SLAVE_DEBUG hal_nrf_irq_flag = status; #endif if(status & (1<< (uint8_t)HAL_NRF_RX_DR)){ do{ len = hal_nrf_read_rx_payload_width(); if(len > 32){ hal_nrf_write_reg (STATUS, (1<< (uint8_t)HAL_NRF_RX_DR)); hal_nrf_rx_sta = HAL_NRF_RX_STA_COM_ERROR; return; } if((hal_nrf_rx_cnt + len + 1) < HAL_NRF_RX_BUF_LEN){ hal_nrf_rx_buf[hal_nrf_rx_wr_index] = len; hal_nrf_rx_wr_index++; if(hal_nrf_rx_wr_index == HAL_NRF_RX_BUF_LEN){ hal_nrf_rx_wr_index=0; } // hal_nrf_read_payload((u8*)hal_nrf_rx_buf[hal_nrf_rx_wr_index].buf, len); CSN_LOW(); HAL_NRF_HW_SPI_WRITE(R_RX_PAYLOAD); while(HAL_NRF_HW_SPI_BUSY) {} HAL_NRF_HW_SPI_READ(); for(i=0; i<len; i++){ HAL_NRF_HW_SPI_WRITE(0U); while(HAL_NRF_HW_SPI_BUSY){} hal_nrf_rx_buf[hal_nrf_rx_wr_index] = HAL_NRF_HW_SPI_READ(); hal_nrf_rx_wr_index++; if(hal_nrf_rx_wr_index == HAL_NRF_RX_BUF_LEN){ hal_nrf_rx_wr_index=0; } } CSN_HIGH(); hal_nrf_rx_cnt = hal_nrf_rx_cnt+len+1; }else{ hal_nrf_flush_rx(); hal_nrf_rx_sta = HAL_NRF_RX_STA_BUF_OVF; /** clear RX_DR */ hal_nrf_write_reg (STATUS, (1<< (uint8_t)HAL_NRF_RX_DR)); break; } /** clear RX_DR */ hal_nrf_write_reg (STATUS, (1<< (uint8_t)HAL_NRF_RX_DR)); }while(!hal_nrf_rx_fifo_empty()); } if(status & (1 << (uint8_t)HAL_NRF_TX_DS)){ hal_nrf_write_reg (STATUS, (1<< (uint8_t)HAL_NRF_TX_DS)); switch(hal_nrf_sta){ case HAL_NRF_STA_TX: hal_nrf_tx_cmd_flag = 0; if(hal_nrf_tx_cnt){ hal_nrf_tx_busy = 1; len = hal_nrf_tx_buf[hal_nrf_tx_rd_index]; hal_nrf_tx_rd_index++; if(hal_nrf_tx_rd_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_rd_index = 0; } hal_nrf_tx_cnt = hal_nrf_tx_cnt-len-1; // hal_nrf_write_tx_payload(hal_nrf_tx_buf_tmp, len); CSN_LOW(); HAL_NRF_HW_SPI_WRITE(W_TX_PAYLOAD); while(HAL_NRF_HW_SPI_BUSY) {} HAL_NRF_HW_SPI_READ(); for(i=0; i<len; i++){ HAL_NRF_HW_SPI_WRITE(hal_nrf_tx_buf[hal_nrf_tx_rd_index]); hal_nrf_tx_rd_index++; if(hal_nrf_tx_rd_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_rd_index = 0; } while(HAL_NRF_HW_SPI_BUSY) {} /* wait for byte transfer finished */ HAL_NRF_HW_SPI_READ(); } CSN_HIGH(); // CE_HIGH(); // T2_START(); t2_start_delay(); }else{ if(hal_nrf_tx_sta == HAL_NRF_TX_STA_IDLE){ /** send end pkt */ hal_nrf_tx_sta = HAL_NRF_TX_STA_DONE; read_flash_buf(slave_cmd, slave_cmd_end, CMD_LENGTH); hal_nrf_write_tx_payload(slave_cmd, CMD_LENGTH); hal_nrf_tx_cmd_flag = 2; // CE_HIGH(); // T2_START(); t2_start_delay(); }else{ hal_nrf_tx_sta = HAL_NRF_TX_STA_IDLE; hal_nrf_sta = HAL_NRF_STA_RX; CE_LOW(); hal_nrf_flush_tx(); hal_nrf_flush_rx(); /** return to RX mode */ hal_nrf_set_operation_mode(HAL_NRF_PRX); CE_HIGH(); hal_nrf_tx_busy = 0; } } break; case HAL_NRF_STA_RX: /** ack payload send */ break; case HAL_NRF_STA_TX_CMD: hal_nrf_sta = HAL_NRF_STA_RX; CE_LOW(); hal_nrf_flush_tx(); hal_nrf_flush_rx(); /** return to RX mode */ hal_nrf_set_operation_mode(HAL_NRF_PRX); CE_HIGH(); hal_nrf_tx_busy = 0; hal_nrf_tx_cmd_flag = 0; break; } } if(status & (1 << (uint8_t)HAL_NRF_MAX_RT)){ #if 0 // When a MAX_RT interrupt occurs the TX payload will not be removed from the TX FIFO. // If the packet is to be discarded this must be done manually by flushing the TX FIFO. // Alternatively, CE_PULSE() can be called re-starting transmission of the payload. // (Will only be possible after the radio irq flags are cleared) hal_nrf_flush_tx(); hal_nrf_flush_rx(); hal_nrf_set_operation_mode(HAL_NRF_PRX); CE_HIGH(); hal_nrf_sta=HAL_NRF_STA_RX; /** discard all data in buffer */ hal_nrf_tx_busy = 0; hal_nrf_tx_cnt = 0; hal_nrf_tx_rd_index =0; hal_nrf_tx_wr_index = 0; // hal_nrf_flush_rx(); // hal_nrf_rx_cnt = 0; // hal_nrf_rx_rd_index =0; // hal_nrf_rx_wr_index = 0; /** set timeout flag */ hal_nrf_timeout = 1; hal_nrf_write_reg (STATUS, (1<< (uint8_t)HAL_NRF_MAX_RT)); #else hal_nrf_write_reg (STATUS, (1<< (uint8_t)HAL_NRF_MAX_RT)); switch(hal_nrf_sta){ case HAL_NRF_STA_TX: hal_nrf_tx_cmd_flag = 0; if(hal_nrf_tx_cnt){ hal_nrf_tx_busy = 1; len = hal_nrf_tx_buf[hal_nrf_tx_rd_index]; hal_nrf_tx_rd_index++; if(hal_nrf_tx_rd_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_rd_index = 0; } hal_nrf_tx_cnt = hal_nrf_tx_cnt-len-1; // hal_nrf_write_tx_payload(hal_nrf_tx_buf_tmp, len); CSN_LOW(); HAL_NRF_HW_SPI_WRITE(W_TX_PAYLOAD); while(HAL_NRF_HW_SPI_BUSY) {} HAL_NRF_HW_SPI_READ(); for(i=0; i<len; i++){ HAL_NRF_HW_SPI_WRITE(hal_nrf_tx_buf[hal_nrf_tx_rd_index]); hal_nrf_tx_rd_index++; if(hal_nrf_tx_rd_index == HAL_NRF_TX_BUF_LEN){ hal_nrf_tx_rd_index = 0; } while(HAL_NRF_HW_SPI_BUSY) {} /* wait for byte transfer finished */ HAL_NRF_HW_SPI_READ(); } CSN_HIGH(); // CE_HIGH(); // T2_START(); t2_start_delay(); }else{ if(hal_nrf_tx_sta == HAL_NRF_TX_STA_IDLE){ /** send end pkt */ hal_nrf_tx_sta = HAL_NRF_TX_STA_DONE; read_flash_buf(slave_cmd, slave_cmd_end, CMD_LENGTH); hal_nrf_write_tx_payload(slave_cmd, CMD_LENGTH); hal_nrf_tx_cmd_flag = 2; // CE_HIGH(); // T2_START(); t2_start_delay(); }else{ hal_nrf_tx_sta = HAL_NRF_TX_STA_IDLE; hal_nrf_sta = HAL_NRF_STA_RX; CE_LOW(); hal_nrf_flush_tx(); hal_nrf_flush_rx(); /** return to RX mode */ hal_nrf_set_operation_mode(HAL_NRF_PRX); CE_HIGH(); hal_nrf_tx_busy = 0; } } break; case HAL_NRF_STA_RX: /** ack payload send */ break; case HAL_NRF_STA_TX_CMD: hal_nrf_sta = HAL_NRF_STA_RX; CE_LOW(); hal_nrf_flush_tx(); hal_nrf_flush_rx(); /** return to RX mode */ hal_nrf_set_operation_mode(HAL_NRF_PRX); CE_HIGH(); hal_nrf_tx_busy = 0; hal_nrf_tx_cmd_flag = 0; break; } #endif } } }
/** Send the RF packet with the unchanged destination address. * Use this function to send RF packet with the last destination * address. * * @param *in_tx_pload The pointer point to the packet to be sent. * @param in_length The packet length. */ void epl_rf_en_send(unsigned char *in_tx_pload, unsigned char in_pload_length) { epl_rf_en_enter_tx_mode(); hal_nrf_write_tx_payload(in_tx_pload, in_pload_length); CE_PULSE(); }