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; }
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(); }
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; } }
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(); }
u8 hal_nrf_receive_pkt(u8 *buf) { u8 i,len=0; //ENTER_MUTEX(); IRQ_DIS(); len = hal_nrf_rx_buf[hal_nrf_rx_rd_index]; hal_nrf_rx_rd_index++; if(hal_nrf_rx_rd_index == HAL_NRF_RX_BUF_LEN){ hal_nrf_rx_rd_index = 0; } for(i=0; i<len; i++){ buf[i] = hal_nrf_rx_buf[hal_nrf_rx_rd_index]; hal_nrf_rx_rd_index++; if(hal_nrf_rx_rd_index == HAL_NRF_RX_BUF_LEN){ hal_nrf_rx_rd_index = 0; } } hal_nrf_rx_cnt = hal_nrf_rx_cnt - len -1; IRQ_EN(); //EXIT_MUTEX(); return len; }
void imx233_timrot_setup(unsigned timer_nr, bool reload, unsigned count, unsigned src, unsigned prescale, bool polarity, imx233_timer_fn_t fn) { int oldstatus = disable_interrupt_save(IRQ_FIQ_STATUS); /* only enable interrupt if function is set */ bool irq = fn != NULL; timer_fns[timer_nr] = fn; /* make sure we start from stop state */ HW_TIMROT_TIMCTRLn(timer_nr) = BF_OR2(TIMROT_TIMCTRLn, SELECT(BV_TIMROT_TIMCTRLn_SELECT__NEVER_TICK), UPDATE(1)); /* write count and take effect immediately with UPDATE * manual says count-1 for reload timers */ HW_TIMROT_TIMCOUNTn(timer_nr) = reload ? count - 1 : count; /* start timer */ HW_TIMROT_TIMCTRLn(timer_nr) = BF_OR6(TIMROT_TIMCTRLn, SELECT(src), PRESCALE(prescale), POLARITY(polarity), RELOAD(reload), IRQ(irq), IRQ_EN(irq)); imx233_icoll_enable_interrupt(INT_SRC_TIMER(timer_nr), irq); restore_interrupt(oldstatus); }