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; }
uint8_t hal_nrf_nop(void) { uint8_t retval; CSN_LOW(); retval = hal_nrf_rw(NOP); CSN_HIGH(); return retval; }
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); }
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(); }
uint8_t hal_nrf_read_reg(uint8_t reg) { uint8_t temp; CSN_LOW(); HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)®, (uint8_t *)&temp, 1, 5000); reg = 0U; HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)®, (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; } }
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; }
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*)®, (uint8_t *)&retval, 1, 5000); HAL_SPI_TransmitReceive(&SpiHandle, (uint8_t*)&value, (uint8_t *)&dummy, 1, 5000); CSN_HIGH(); return retval; }
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); }
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; }
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 } } }
void hal_nrf_flush_tx(void) { CSN_LOW(); hal_nrf_rw(FLUSH_TX); CSN_HIGH(); }
void hal_nrf_reuse_tx(void) { CSN_LOW(); hal_nrf_rw(REUSE_TX_PL); CSN_HIGH(); }