19 #include "simple_pwm.h" 20 #include "tssp_ir_tx.h" 22 #include "common_util.h" 23 #include "sys_config.h" 27 #include "isr_manager.h" 30 #define TIMER_ID_1KHZ CONCAT_2(NRF_TIMER, TIMER_USED_TSSP_IR_TX_1) 31 #define TIMER_ID_56KHZ CONCAT_2(NRF_TIMER, TIMER_USED_TSSP_IR_TX_2) 33 #define MAX_COUNT_CHANNEL TIMER_CHANNEL_USED_TSSP_IR_TX_2_2 36 #define ON_TIMER_GPIOTE_CHANNEL GPIOTE_CH_USED_TSSP_IR_TX_1 37 #define TIMER_56KHZ_GPIOTE_CHANNEL GPIOTE_CH_USED_TSSP_IR_TX_2 39 #define TIMERS_CHANNEL_USED TIMER_CHANNEL_USED_TSSP_IR_TX_1_1 41 #define PPI_56KHz_1 PPI_CH_USED_TSSP_IR_TX_1 42 #define PPI_56KHz_2 PPI_CH_USED_TSSP_IR_TX_2 43 #define PPI_xxKHz_1 PPI_CH_USED_TSSP_IR_TX_3 44 #define PPI_xxKHz_2 PPI_CH_USED_TSSP_IR_TX_4 46 static uint32_t tx_en;
48 static uint32_t tx_in;
50 void tssp_ir_tx_init (uint32_t tssp_tx_en, uint32_t tssp_tx_in)
54 hal_gpio_cfg_output (tx_en,0);
55 hal_gpio_cfg_output (tssp_tx_in,0);
56 TIMER_ID_56KHZ->TASKS_STOP = 1;
57 TIMER_ID_56KHZ->TASKS_CLEAR = 1;
60 TIMER_ID_56KHZ->PRESCALER = TSSP_IR_TX_TIMER_FREQ_16MHz;
62 TIMER_ID_56KHZ->BITMODE = TIMER_BITMODE_BITMODE_16Bit << TIMER_BITMODE_BITMODE_Pos;
63 TIMER_ID_56KHZ->MODE = TIMER_MODE_MODE_Timer << TIMER_MODE_MODE_Pos;
65 TIMER_ID_56KHZ->CC[MAX_COUNT_CHANNEL] = 291;
67 TIMER_ID_56KHZ->CC[TIMERS_CHANNEL_USED] = 29;
68 TIMER_ID_56KHZ->SHORTS = TIMER_SHORTS_COMPARE3_CLEAR_Enabled << TIMER_SHORTS_COMPARE3_CLEAR_Pos;
70 TIMER_ID_56KHZ->EVENTS_COMPARE[MAX_COUNT_CHANNEL] = 0;
73 TIMER_ID_56KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
75 NRF_GPIOTE->CONFIG[TIMER_56KHZ_GPIOTE_CHANNEL] =
76 (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos)
77 | (tssp_tx_in << GPIOTE_CONFIG_PSEL_Pos)
78 | (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos)
79 | (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos);
81 NRF_PPI->CH[PPI_56KHz_1].EEP = (uint32_t) &(TIMER_ID_56KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED]);
82 NRF_PPI->CH[PPI_56KHz_1].TEP = (uint32_t) &(NRF_GPIOTE->TASKS_CLR[TIMER_56KHZ_GPIOTE_CHANNEL]);
84 NRF_PPI->CH[PPI_56KHz_2].EEP = (uint32_t) &(TIMER_ID_56KHZ->EVENTS_COMPARE[MAX_COUNT_CHANNEL]);
85 NRF_PPI->CH[PPI_56KHz_2].TEP = (uint32_t) &(NRF_GPIOTE->TASKS_SET[TIMER_56KHZ_GPIOTE_CHANNEL]);
88 TIMER_ID_1KHZ->MODE = TIMER_MODE_MODE_Timer;
89 TIMER_ID_1KHZ->PRESCALER = TSSP_IR_TX_TIMER_FREQ_16MHz;
90 TIMER_ID_1KHZ->BITMODE = TIMER_BITMODE_BITMODE_32Bit;
91 TIMER_ID_1KHZ->CC[TIMERS_CHANNEL_USED] = 16000 * TSSP_IR_TX_ON_TIME_MS;
114 NVIC_SetPriority (TIMER2_IRQn, APP_IRQ_PRIORITY_HIGH);
115 NVIC_EnableIRQ (TIMER2_IRQn);
118 void tssp_ir_tx_timer1_Handler ()
120 void TIMER2_IRQHandler ()
123 hal_gpio_pin_clear (tx_en);
124 hal_gpio_pin_clear (tx_in);
126 TIMER_ID_56KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
127 TIMER_ID_1KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
129 TIMER_ID_1KHZ->TASKS_CLEAR = 1;
130 TIMER_ID_1KHZ->TASKS_STOP = 1;
131 TIMER_ID_1KHZ->TASKS_SHUTDOWN = 1;
132 TIMER_ID_56KHZ->TASKS_SHUTDOWN = 1;
135 void tssp_ir_tx_timer2_Handler ()
140 void tssp_ir_tx_start (
void)
142 hal_gpio_pin_set (tx_en);
143 TIMER_ID_56KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
144 TIMER_ID_1KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
145 NRF_GPIOTE->TASKS_SET[ON_TIMER_GPIOTE_CHANNEL] = 1;
146 TIMER_ID_1KHZ->INTENSET |= TIMER_INTENSET_COMPARE0_Msk;
147 TIMER_ID_1KHZ->TASKS_CLEAR = 1;
151 NRF_PPI->CHENSET |= 1 << PPI_56KHz_1;
152 NRF_PPI->CHENSET |= 1 << PPI_56KHz_2;
153 TIMER_ID_56KHZ->TASKS_START = 1;
154 TIMER_ID_1KHZ->TASKS_START = 1;
158 void tssp_ir_tx_stop (
void)
160 TIMER_ID_1KHZ->TASKS_SHUTDOWN = 1;
161 hal_gpio_pin_clear (tx_en);
165 NRF_PPI->CHENCLR |= 1 << PPI_56KHz_1;
166 NRF_PPI->CHENCLR |= 1 << PPI_56KHz_2;
167 TIMER_ID_56KHZ->TASKS_STOP = 1;
169 TIMER_ID_56KHZ->TASKS_SHUTDOWN = 1;