19 #include "radio_trigger.h" 20 #include "hal_radio.h" 24 #include "isr_manager.h" 25 #include "nrf52810_bitfields.h" 33 #define TIMER_USED TIMER_USED_RADIO_TRIGGER 34 #define TIMER_ID CONCAT_2(NRF_TIMER,TIMER_USED) 36 #define TIMER_IRQN TIMER_IRQN_a(TIMER_USED) 37 #define TIMER_IRQ_Handler TIMER_IRQ_Handler_a(TIMER_USED) 39 #define TIMER_IRQN_a(n) TIMER_IRQN_b(n) 40 #define TIMER_IRQN_b(n) TIMER##n##_IRQn 42 #define TIMER_IRQ_Handler_a(n) TIMER_IRQ_Handler_b(n) 43 #define TIMER_IRQ_Handler_b(n) TIMER##n##_IRQHandler 46 #define TIMER_1MHz_PRESCALAR 4 48 #define TIMER_INTEN_OFFSET 16 50 #define TIMER_CHANNEL_COMMON_STARTUP TIMER_CHANNEL_USED_RADIO_TRIGGER_0 52 #define TIMER_CHANNEL_RX_ON TIMER_CHANNEL_USED_RADIO_TRIGGER_1 54 #define TIMER_CHANNEL_TX_ON TIMER_CHANNEL_USED_RADIO_TRIGGER_1 55 #define TIMER_CHANNEL_TX_FREQ TIMER_CHANNEL_USED_RADIO_TRIGGER_2 57 #define XTAL_STARTUP_TIME 450 59 #define MS_TO_US_CONV(n) (n * 1000) 65 static uint32_t radio_tx_freq_ticks = 0;
67 static radio_trigger_dir_t radio_dir = RADIO_TRIGGER_Tx;
69 volatile bool is_radio_free =
true;
71 void (* p_radio_rx_handler) (
void * p_data, uint32_t len);
72 void (* p_radio_tx_handler) (
void * p_data, uint32_t len);
78 void radio_trigger_init (radio_trigger_init_t* radio_trig_init)
80 p_radio_rx_handler = radio_trig_init->radio_trigger_rx_callback;
81 p_radio_tx_handler = radio_trig_init->radio_trigger_tx_callback;
82 radio_trig_irq_priority = radio_trig_init->irq_priority;
83 radio_dir = radio_trig_init->comm_direction;
85 radio_config.
freq = radio_trig_init->comm_freq;
86 radio_config.
irq_priority = radio_trig_init->irq_priority;
90 TIMER_ID->MODE = (TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos) & TIMER_MODE_MODE_Msk;
92 TIMER_ID->BITMODE = TIMER_BITMODE_BITMODE_32Bit;
94 TIMER_ID->PRESCALER = TIMER_1MHz_PRESCALAR;
95 TIMER_ID->CC[TIMER_CHANNEL_COMMON_STARTUP] = XTAL_STARTUP_TIME;
96 if(radio_trig_init->comm_direction == RADIO_TRIGGER_Tx)
99 (1 << (TIMER_CHANNEL_COMMON_STARTUP + TIMER_INTEN_OFFSET)) |
100 (1 << (TIMER_CHANNEL_TX_ON + TIMER_INTEN_OFFSET)) |
101 (1 << (TIMER_CHANNEL_TX_FREQ + TIMER_INTEN_OFFSET)) ;
102 TIMER_ID->CC[TIMER_CHANNEL_TX_ON] =
103 (MS_TO_US_CONV(radio_trig_init->tx_on_time_ms) + XTAL_STARTUP_TIME);
104 TIMER_ID->CC[TIMER_CHANNEL_TX_FREQ] = radio_trig_init->tx_on_freq_us+ XTAL_STARTUP_TIME;
105 radio_tx_freq_ticks = radio_trig_init->tx_on_freq_us;
109 TIMER_ID->CC[TIMER_CHANNEL_RX_ON] = MS_TO_US_CONV(radio_trig_init->rx_on_time_ms) + XTAL_STARTUP_TIME;
111 (1 << (TIMER_CHANNEL_COMMON_STARTUP + TIMER_INTEN_OFFSET)) |
112 (1 << (TIMER_CHANNEL_RX_ON + TIMER_INTEN_OFFSET));
116 NVIC_SetPriority (TIMER_IRQN, radio_trig_init->irq_priority);
117 NVIC_EnableIRQ (TIMER_IRQN);
121 void radio_trigger_yell ()
123 is_radio_free =
false;
124 TIMER_ID->CC[TIMER_CHANNEL_TX_FREQ] = radio_tx_freq_ticks + XTAL_STARTUP_TIME;
126 TIMER_ID->TASKS_START = 1;
128 NVIC_SetPriority (TIMER_IRQN, radio_trig_irq_priority);
129 NVIC_EnableIRQ (TIMER_IRQN);
132 void radio_trigger_listen ()
134 is_radio_free =
false;
135 TIMER_ID->TASKS_START = 1;
137 NVIC_SetPriority (TIMER_IRQN, radio_trig_irq_priority);
138 NVIC_EnableIRQ (TIMER_IRQN);
141 void radio_trigger_shut ()
143 TIMER_ID->TASKS_STOP = 1;
144 TIMER_ID->TASKS_SHUTDOWN = 1;
145 NVIC_DisableIRQ (TIMER_IRQN);
147 is_radio_free =
true;
150 #if ISR_MANAGER == true 151 void radio_trigger_timer_Handler ()
153 void TIMER_IRQ_Handler ()
156 if(radio_dir == RADIO_TRIGGER_Tx)
158 if(TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_COMMON_STARTUP] ==
true)
160 #if ISR_MANAGER == false 161 TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_COMMON_STARTUP] =
false;
163 log_printf(
"%s\n", __func__);
167 if(TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_TX_FREQ] ==
true)
169 #if ISR_MANAGER == false 170 TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_TX_FREQ] =
false;
173 TIMER_ID->CC[TIMER_CHANNEL_TX_FREQ] += radio_tx_freq_ticks;
174 log_printf(
"CC[%d] : %d\n", TIMER_CHANNEL_TX_FREQ, TIMER_ID->CC[TIMER_CHANNEL_TX_FREQ]);
177 if(TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_TX_ON])
179 #if ISR_MANAGER == false 180 TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_TX_ON] =
false;
182 TIMER_ID->TASKS_CLEAR = 1;
183 TIMER_ID->TASKS_STOP = 1;
184 TIMER_ID->TASKS_SHUTDOWN = 1;
185 (void) TIMER_ID->TASKS_SHUTDOWN;
187 is_radio_free =
true;
192 if(TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_COMMON_STARTUP] ==
true)
194 #if ISR_MANAGER == false 195 TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_COMMON_STARTUP] =
false;
200 if(TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_RX_ON])
202 #if ISR_MANAGER == false 203 TIMER_ID->EVENTS_COMPARE[TIMER_CHANNEL_RX_ON] =
false;
205 TIMER_ID->TASKS_CLEAR = 1;
206 TIMER_ID->TASKS_STOP = 1;
207 TIMER_ID->TASKS_SHUTDOWN = 1;
208 (void) TIMER_ID->TASKS_SHUTDOWN;
210 is_radio_free =
true;
215 void radio_trigger_memorize_data (
void * data, uint32_t len)
220 bool is_radio_trigger_availabel ()
222 return is_radio_free;
void hal_radio_deinit()
Function to de-initiate the radio peripheral.
void hal_radio_start_rx()
Function to start data reception.
app_irq_priority_t
Priority levels that the application can use based on whether the SoftDevice (SD) is used.
void hal_radio_set_tx_payload_data(void *p_payload, uint32_t len)
Function to Set the payload data for transmission.
void hal_radio_init(hal_radio_config_t *radio_init_config)
Function to Initiate Radio peripheral.
void hal_radio_start_tx()
Function to start data transmission.
void(* rx_done_handler)(void *p_buff, uint32_t len)
Structure used to store the data required for radio configuration.
app_irq_priority_t irq_priority