Пример #1
0
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;
}
Пример #2
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();
}
Пример #3
0
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;
	}
}
Пример #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();
}
Пример #5
0
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;
}
Пример #6
0
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);
}