Example #1
0
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();
}
Example #2
0
/* 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();
}
Example #3
0
/** 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();
}
Example #4
0
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();
}
Example #5
0
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;
	}
}
Example #6
0
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;
		}
	}
}
Example #7
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
		}
	}
}
Example #8
0
/** 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();
}