19 #include "tssp_detect.h" 21 #include "common_util.h" 22 #include "hal_clocks.h" 28 #include "isr_manager.h" 32 #define TSSP_DETECT_RTC_USED CONCAT_2(NRF_RTC, RTC_USED_TSSP_DETECT) 35 #define TSSP_DETECT_EGU_USED CONCAT_2(NRF_EGU,EGU_USED_TSSP_DETECT) 38 #define PPI_CHANNEL_USED_RTC PPI_CH_USED_TSSP_DETECT_1 41 #define PPI_CHANNEL_USED_EGU PPI_CH_USED_TSSP_DETECT_2 44 #define GPIOTE_CHANNEL_USED GPIOTE_CH_USED_TSSP_DETECT 47 #define WINDOW_RTC_CHANNEL 2 49 #define SYNC_ON_RTC_CHANNEL 0 51 #define SYNC_OFF_RTC_CHANNEL 1 53 #define EGU_CHANNEL_USED EGU_CHANNEL_USED_TSSP_DETECT 55 #define HALF_TSSP_ENABLE_DURATION TSSP_DETECT_TICKS_MS(2) 71 uint32_t tssp_sync_ms;
74 static bool is_pulse_detect_req =
false;
77 static bool is_window_detect_req =
false;
81 void (*missed_handler)(void);
84 void (*detect_handler)(uint32_t ticks);
88 tssp_en_pin = tssp_detect_config->
rx_en_pin;
89 hal_gpio_cfg_output (tssp_en_pin, DISABLE);
90 tssp_rx_pin = tssp_detect_config->
rx_in_pin;
91 hal_gpio_cfg_input (tssp_rx_pin,
96 is_window_detect_req =
true;
100 TSSP_DETECT_RTC_USED->INTENSET |= ENABLE << (WINDOW_RTC_CHANNEL+16);
102 NRF_PPI->CH[PPI_CHANNEL_USED_RTC].EEP = (uint32_t) &NRF_GPIOTE->EVENTS_IN[
GPIOTE_CHANNEL_USED];
103 NRF_PPI->CH[PPI_CHANNEL_USED_RTC].TEP = (uint32_t) &TSSP_DETECT_RTC_USED->TASKS_CLEAR;
108 is_window_detect_req =
false;
112 is_pulse_detect_req =
true;
116 TSSP_DETECT_EGU_USED->INTENSET |= ENABLE << EGU_CHANNEL_USED;
117 NVIC_SetPriority (SWI0_EGU0_IRQn, APP_IRQ_PRIORITY_HIGHEST);
118 NVIC_EnableIRQ (SWI0_IRQn);
119 NVIC_ClearPendingIRQ (SWI0_IRQn);
121 NRF_PPI->CH[PPI_CHANNEL_USED_EGU].EEP = (uint32_t) &NRF_GPIOTE->EVENTS_IN[
GPIOTE_CHANNEL_USED];
122 NRF_PPI->CH[PPI_CHANNEL_USED_EGU].TEP = (uint32_t) &TSSP_DETECT_EGU_USED->TASKS_TRIGGER[EGU_CHANNEL_USED];
126 is_pulse_detect_req =
false;
134 is_window_detect_req =
true;
137 TSSP_DETECT_RTC_USED->INTENSET |= ENABLE << (WINDOW_RTC_CHANNEL+16);
138 NRF_PPI->CHENSET |= 1 << PPI_CHANNEL_USED_RTC;
143 GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos|
144 GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos|
145 ((tssp_rx_pin << GPIOTE_CONFIG_PSEL_Pos)
146 & GPIOTE_CONFIG_PSEL_Msk);
148 TSSP_DETECT_RTC_USED->EVENTS_COMPARE[WINDOW_RTC_CHANNEL] = 0;
149 (void) TSSP_DETECT_RTC_USED->EVENTS_COMPARE[WINDOW_RTC_CHANNEL];
151 TSSP_DETECT_RTC_USED->TASKS_START = 1;
152 NVIC_SetPriority (RTC0_IRQn, APP_IRQ_PRIORITY_HIGHEST);
153 NVIC_EnableIRQ (RTC0_IRQn);
158 is_pulse_detect_req =
false;
159 if((is_pulse_detect_req ==
false) && (is_window_detect_req ==
false))
162 GPIOTE_CONFIG_MODE_Disabled << GPIOTE_CONFIG_MODE_Pos|
163 GPIOTE_CONFIG_POLARITY_None << GPIOTE_CONFIG_POLARITY_Pos|
164 ((tssp_rx_pin << GPIOTE_CONFIG_PSEL_Pos)
165 & GPIOTE_CONFIG_PSEL_Msk);
167 hal_gpio_pin_write (tssp_en_pin, DISABLE);
169 NRF_PPI->CHENCLR |= 1 << PPI_CHANNEL_USED_EGU;
174 is_window_detect_req =
false;
175 if((is_pulse_detect_req ==
false) && (is_window_detect_req ==
false))
178 GPIOTE_CONFIG_MODE_Disabled << GPIOTE_CONFIG_MODE_Pos|
179 GPIOTE_CONFIG_POLARITY_None << GPIOTE_CONFIG_POLARITY_Pos|
180 ((tssp_rx_pin << GPIOTE_CONFIG_PSEL_Pos)
181 & GPIOTE_CONFIG_PSEL_Msk);
183 hal_gpio_pin_write (tssp_en_pin, DISABLE);
185 TSSP_DETECT_RTC_USED->INTENCLR |= ENABLE << (WINDOW_RTC_CHANNEL+16) |
186 ENABLE << (SYNC_ON_RTC_CHANNEL+16) |
187 ENABLE << (SYNC_OFF_RTC_CHANNEL+16);
188 NRF_PPI->CHENCLR |= 1 << PPI_CHANNEL_USED_RTC;
189 NVIC_DisableIRQ (RTC0_IRQn);
191 TSSP_DETECT_RTC_USED->TASKS_CLEAR = 1;
192 (void) TSSP_DETECT_RTC_USED->TASKS_CLEAR;
193 TSSP_DETECT_RTC_USED->TASKS_STOP = 1;
198 is_pulse_detect_req =
true;
199 TSSP_DETECT_RTC_USED->TASKS_START = 1;
203 GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos|
204 GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos|
205 ((tssp_rx_pin << GPIOTE_CONFIG_PSEL_Pos)
206 & GPIOTE_CONFIG_PSEL_Msk);
208 hal_gpio_pin_write (tssp_en_pin, ENABLE);
210 TSSP_DETECT_EGU_USED->INTENSET |= ENABLE << EGU_CHANNEL_USED;
211 NRF_PPI->CHENSET |= 1 << PPI_CHANNEL_USED_EGU;
216 tssp_sync_ms = (sync_ms);
218 uint32_t rtc_counter;
219 rtc_counter = TSSP_DETECT_RTC_USED->COUNTER ;
220 TSSP_DETECT_RTC_USED->CC[SYNC_ON_RTC_CHANNEL] =
221 (rtc_counter + (tssp_sync_ms - HALF_TSSP_ENABLE_DURATION)) ;
222 (void) TSSP_DETECT_RTC_USED->CC[SYNC_ON_RTC_CHANNEL];
223 TSSP_DETECT_RTC_USED->INTENSET |= ENABLE << (SYNC_ON_RTC_CHANNEL+16);
224 TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_ON_RTC_CHANNEL] = 0;
226 TSSP_DETECT_RTC_USED->CC[SYNC_OFF_RTC_CHANNEL] = HALF_TSSP_ENABLE_DURATION;
227 (void) TSSP_DETECT_RTC_USED->CC[SYNC_OFF_RTC_CHANNEL];
228 TSSP_DETECT_RTC_USED->INTENSET |= ENABLE << (SYNC_OFF_RTC_CHANNEL+16);
229 TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_OFF_RTC_CHANNEL] = 0;
234 void tssp_detect_swi_Handler (
void)
236 void SWI0_IRQHandler ()
240 TSSP_DETECT_EGU_USED->EVENTS_TRIGGERED[EGU_CHANNEL_USED] = 0;
241 (void) TSSP_DETECT_EGU_USED->EVENTS_TRIGGERED[EGU_CHANNEL_USED];
243 NRF_PPI->CHENCLR |= 1 << PPI_CHANNEL_USED_EGU;
244 detect_handler ( TSSP_DETECT_RTC_USED->COUNTER );
248 void tssp_detect_rtc_Handler (
void)
250 void RTC0_IRQHandler (
void)
253 if(TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_ON_RTC_CHANNEL] == 1)
256 TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_ON_RTC_CHANNEL] = 0;
257 (void) TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_ON_RTC_CHANNEL];
259 hal_gpio_pin_write (tssp_en_pin, ENABLE);
260 TSSP_DETECT_RTC_USED->CC[SYNC_OFF_RTC_CHANNEL] = HALF_TSSP_ENABLE_DURATION;
263 if(TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_OFF_RTC_CHANNEL] == 1)
266 TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_OFF_RTC_CHANNEL] = 0;
267 (void) TSSP_DETECT_RTC_USED->EVENTS_COMPARE[SYNC_OFF_RTC_CHANNEL];
269 hal_gpio_pin_write (tssp_en_pin, DISABLE);
270 TSSP_DETECT_RTC_USED->CC[SYNC_ON_RTC_CHANNEL] = (tssp_sync_ms - HALF_TSSP_ENABLE_DURATION);
272 if(TSSP_DETECT_RTC_USED->EVENTS_COMPARE[WINDOW_RTC_CHANNEL] == 1)
275 TSSP_DETECT_RTC_USED->EVENTS_COMPARE[WINDOW_RTC_CHANNEL] = 0;
276 (void) TSSP_DETECT_RTC_USED->EVENTS_COMPARE[WINDOW_RTC_CHANNEL];
279 TSSP_DETECT_RTC_USED->TASKS_CLEAR = 1;
280 (void) TSSP_DETECT_RTC_USED->TASKS_CLEAR;
void tssp_detect_window_stop(void)
Function to stop IR missed window detection.
void(* tssp_missed_handler)(void)
void tssp_detect_pulse_detect()
Function to start module is pulse detecting mode.
#define TSSP_DETECT_TICKS_MS(ms)
#define GPIOTE_CHANNEL_USED
Preemption priority IRQ.
void(* tssp_detect_handler)(uint32_t ticks)
void tssp_detect_init(tssp_detect_config_t *tssp_detect_config)
Function to initialize IR detect sub-module.
void tssp_detect_window_sync(uint32_t sync_ms)
Function to Synchronize TSSP detector to IR transmitter which is being used.
Structure to store information required to use this module.
uint32_t window_duration_ticks
#define LFCLK_FREQ
Frequency of the low frequency clock is 32.768 kHz.
void tssp_detect_pulse_stop()
Function to stop IR pulse detection.
#define ROUNDED_DIV(A, B)
Rounded integer division where the result is the integer closest to the answer instead of flooring th...
void tssp_detect_window_detect()
Function to start IR pulse detection.