Exemple #1
0
uint8_t hal_nrf_write_reg(uint8_t data reg, uint8_t data value)
{
  uint8_t data retval;
  
  CSN_LOW();
  // retval = hal_nrf_rw(W_REGISTER + reg);

  RFDAT = W_REGISTER + reg;
  RFSPIF = 0;     // ! IMPORTANT ! Clear RF SPI ready flag
                  // after data written to RFDAT..
  while(!RFSPIF); // wait for byte transfer finished
    
  retval = RFDAT;   // return SPI read value


  RFDAT = value;
  RFSPIF = 0;     // ! IMPORTANT ! Clear RF SPI ready flag
                  // after data written to RFDAT..
  while(!RFSPIF); // wait for byte transfer finished
    
  // retval = RFDAT;   // return SPI read value

 //  hal_nrf_rw(value);
  CSN_HIGH();

  return retval;
}
void hal_nrf_init(void)
{
	hal_nrf_sta=HAL_NRF_STA_RX;
	hal_nrf_tx_sta = HAL_NRF_TX_STA_IDLE;
		
	hal_nrf_tx_rd_index=0, hal_nrf_tx_cnt=0, hal_nrf_tx_wr_index=0;
	hal_nrf_tx_busy = 0;
	
	hal_nrf_rx_sta = HAL_NRF_RX_STA_IDLE;
	hal_nrf_rx_rd_index=0, hal_nrf_rx_cnt=0, hal_nrf_rx_wr_index=0;
	
	CSN_OUTPUT();
	CE_OUTPUT();
	CSN_HIGH();
	CE_LOW();
	
	IRQ_INPUT()	;
	IRQ_EN();
	
	t2_init();
	spi_init();
	
	hal_nrf_tick_num = sys_tick_apply();
	sys_tick_set(hal_nrf_tick_num, ON);
	hal_nrf_cnt = 0;
}
Exemple #3
0
uint8_t hal_nrf_nop(void)
{
  uint8_t retval;

  CSN_LOW();
  retval = hal_nrf_rw(NOP);
  CSN_HIGH();

  return retval;
}
Exemple #4
0
uint16_t hal_nrf_read_multibyte_reg(uint8_t reg, uint8_t *buf)
{
  uint8_t ctr, length;
  uint8_t memtype;
  uint8_t read_byte, dummy = 0U; /*lint -esym(530,read_byte) symbol not initialized*/
  bool first_round;
  first_round = true;

  switch(reg)
  {
    case HAL_NRF_PIPE0:
    case HAL_NRF_PIPE1:
    case HAL_NRF_TX:
      length = ctr = hal_nrf_get_address_width();
      CSN_LOW();
      hal_nrf_rw(RX_ADDR_P0 + reg);
      break;

    case HAL_NRF_RX_PLOAD:
      reg = hal_nrf_get_rx_data_source();
      if (reg < 7U)
      {
        length = ctr = hal_nrf_read_rx_payload_width();
        CSN_LOW();
        hal_nrf_rw(R_RX_PAYLOAD);
      }
      else
      {
        ctr = length = 0U;
      }
      break;

    default:
      ctr = length = 0U;
      break;
  }    
	while( ctr-- ){
			HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)&dummy, (uint8_t *)buf++, 1, 5000);
      /*if (!first_round) \
      { \
        *buf = read_byte; \
        buf++; \
      } \
      else \
      { \
        first_round = false; \
      } \*/
      /* wait for byte transfer finished */ \
    }
    //*buf = read_byte;

  CSN_HIGH();

  return (((uint16_t) reg << 8) | length);
}
Exemple #5
0
static uint8_t hal_nrf_read_reg(uint8_t data reg)
{
  uint8_t temp;

  CSN_LOW();
  hal_nrf_rw(reg);
  temp = hal_nrf_rw(0);
  CSN_HIGH();

  return temp;
}
void hal_nrf_read_payload(u8 *buf, u8 length)
{
	u8 i;
	CSN_LOW();
	hal_nrf_rw(R_RX_PAYLOAD);
	for(i=0; i<length; i++){
		HAL_NRF_HW_SPI_WRITE(0U);
		while(HAL_NRF_HW_SPI_BUSY){} 
      	buf[i] =  HAL_NRF_HW_SPI_READ(); 
	}
	
	CSN_HIGH();
}
void hal_nrf_write_payload(u8 *buf, u8 length)
{
	u8 i;
	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<length; i++){
		HAL_NRF_HW_SPI_WRITE(buf[i]);
		while(HAL_NRF_HW_SPI_BUSY) {} /* wait for byte transfer finished */
		HAL_NRF_HW_SPI_READ();
	}
	CSN_HIGH();
}
void hal_nrf_ack_payload(u8 pipe, u8 *buf, u8 length)
{
	u8 i;
	CSN_LOW();
	HAL_NRF_HW_SPI_WRITE(W_ACK_PAYLOAD | pipe);
	while(HAL_NRF_HW_SPI_BUSY) {}
	 HAL_NRF_HW_SPI_READ();
	for(i=0; i<length; i++){
		HAL_NRF_HW_SPI_WRITE(buf[i]);
		while(HAL_NRF_HW_SPI_BUSY){} 
		HAL_NRF_HW_SPI_READ(); 
	}
	CSN_HIGH();
}
Exemple #9
0
uint8_t hal_nrf_read_reg(uint8_t reg)
{
  uint8_t temp;

  CSN_LOW();

	HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)&reg, (uint8_t *)&temp, 1, 5000);

	reg = 0U;
	HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)&reg, (uint8_t *)&temp, 1, 5000);

  CSN_HIGH();

  return temp;
}
void hal_nrf_set_sta(hal_nrf_sta_t sta)
{
	u8 len, i;
	if(hal_nrf_tx_cnt){
		hal_nrf_tx_cmd_flag = 0;
		HAL_NRF_WAIT_ACK_DONE();
		IRQ_DIS();
		
		CE_LOW();
		hal_nrf_flush_tx();
		hal_nrf_flush_rx();
		
		hal_nrf_sta = HAL_NRF_STA_TX;
		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();
		hal_nrf_set_operation_mode(HAL_NRF_PTX);
//		CE_HIGH();
//		T2_START();
		t2_start_delay();
		IRQ_EN();
		
	}else{
		read_flash_buf(slave_cmd, slave_cmd_end, CMD_LENGTH);
		hal_nrf_send_cmd(slave_cmd, HAL_NRF_STA_RX);
		hal_nrf_tx_cmd_flag = 2;
	}
}
Exemple #11
0
uint8_t hal_nrf_read_reg(uint8_t reg)
{
  uint8_t temp;

  CSN_LOW();

  HAL_NRF_HW_SPI_WRITE(reg);
  while(HAL_NRF_HW_SPI_BUSY) {}
  temp = HAL_NRF_HW_SPI_READ();

  HAL_NRF_HW_SPI_WRITE(0U);
  while(HAL_NRF_HW_SPI_BUSY) {}
  temp = HAL_NRF_HW_SPI_READ();

  CSN_HIGH();

  return temp;
}
Exemple #12
0
uint8_t hal_nrf_write_reg(uint8_t reg, uint8_t value)
{
  uint8_t retval, dummy;
/*lint -esym(550,dummy) symbol not accessed*/
/*lint -esym(438,dummy) last assigned value not used*/
/*lint -esym(838,dummy) previously assigned value not used*/

  CSN_LOW();
	
	reg += W_REGISTER;
	HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)&reg, (uint8_t *)&retval, 1, 5000);

	HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)&value, (uint8_t *)&dummy, 1, 5000);

  CSN_HIGH();

  return retval;
}
Exemple #13
0
uint16_t hal_nrf_read_multibyte_reg(uint8_t data reg, uint8_t data *pbuf)
{
  uint8_t data ctr, length;
  switch(reg)
  {
    case HAL_NRF_PIPE0:
    case HAL_NRF_PIPE1:
    case HAL_NRF_TX:
      length = ctr = hal_nrf_get_address_width();
      CSN_LOW();
      hal_nrf_rw(RX_ADDR_P0 + reg);
      break;
      
    case HAL_NRF_RX_PLOAD:
      if( (reg = hal_nrf_get_rx_data_source()) < 7)
      {
        length = ctr = hal_nrf_read_rx_payload_width();
        CSN_LOW();
        hal_nrf_rw(R_RX_PAYLOAD);
      }
      else
      {
        ctr = length = 0;
      }
      break;

    default:
      ctr = length = 0;
      break;
  }

  while(ctr--)
  {
    *pbuf++ = hal_nrf_rw(0);
  }

  CSN_HIGH();

  return (((uint16_t) reg << 8) | length);
}
Exemple #14
0
uint8_t hal_nrf_write_reg(uint8_t reg, uint8_t value)
{
  uint8_t retval;
/*lint -esym(550,dummy) symbol not accessed*/
/*lint -esym(438,dummy) last assigned value not used*/
/*lint -esym(838,dummy) previously assigned value not used*/
  uint8_t volatile dummy;

  CSN_LOW();

  HAL_NRF_HW_SPI_WRITE((W_REGISTER + reg));
  while(HAL_NRF_HW_SPI_BUSY) {}
  retval = HAL_NRF_HW_SPI_READ();

  HAL_NRF_HW_SPI_WRITE(value);
  while(HAL_NRF_HW_SPI_BUSY) {}
  dummy = HAL_NRF_HW_SPI_READ();

  CSN_HIGH();

  return retval;
}
Exemple #15
0
static void hal_nrf_write_multibyte_reg( uint8_t data cmd, const uint8_t data *pbuf, uint8_t data length)
{
  data uint8_t dummy;

  CSN_LOW();

  HAL_NRF_HW_SPI_WRITE(cmd);

  for(; length > 0; --length, ++pbuf)
 {
   // next = *(pbuf + i);
    while(HAL_NRF_HW_SPI_BUSY);  // wait for byte transfer finished
    ;
    dummy = HAL_NRF_HW_SPI_READ();
    HAL_NRF_HW_SPI_WRITE(*pbuf);    
  }
 
  while(HAL_NRF_HW_SPI_BUSY);  // wait for byte transfer finished
  ;
  dummy = HAL_NRF_HW_SPI_READ();
  CSN_HIGH();
}
__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
		}
	}
}
Exemple #17
0
void hal_nrf_flush_tx(void)
{
  CSN_LOW();
  hal_nrf_rw(FLUSH_TX);
  CSN_HIGH();
}
Exemple #18
0
void hal_nrf_reuse_tx(void)
{
  CSN_LOW();
  hal_nrf_rw(REUSE_TX_PL);
  CSN_HIGH();
}