Appiko
tssp_ir_tx.c
1 
19 #include "simple_pwm.h"
20 #include "tssp_ir_tx.h"
21 #include "hal_gpio.h"
22 #include "common_util.h"
23 #include "sys_config.h"
24 #include "nrf_util.h"
25 
26 #if ISR_MANAGER == 1
27 #include "isr_manager.h"
28 #endif
29 
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)
32 
33 #define MAX_COUNT_CHANNEL TIMER_CHANNEL_USED_TSSP_IR_TX_2_2
34 
35 
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
38 
39 #define TIMERS_CHANNEL_USED TIMER_CHANNEL_USED_TSSP_IR_TX_1_1
40 
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
45 
46 static uint32_t tx_en;
47 
48 static uint32_t tx_in;
49 
50 void tssp_ir_tx_init (uint32_t tssp_tx_en, uint32_t tssp_tx_in)
51 {
52  tx_en = tssp_tx_en;
53  tx_in = 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;
58 
59  //TODO Enable assertion
60  TIMER_ID_56KHZ->PRESCALER = TSSP_IR_TX_TIMER_FREQ_16MHz;
61 
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;
64 
65  TIMER_ID_56KHZ->CC[MAX_COUNT_CHANNEL] = 291;//291 IS FOR 56kHz @ 16MHz
66 
67  TIMER_ID_56KHZ->CC[TIMERS_CHANNEL_USED] = 29;
68  TIMER_ID_56KHZ->SHORTS = TIMER_SHORTS_COMPARE3_CLEAR_Enabled << TIMER_SHORTS_COMPARE3_CLEAR_Pos;
69 
70  TIMER_ID_56KHZ->EVENTS_COMPARE[MAX_COUNT_CHANNEL] = 0;
71 
72 
73  TIMER_ID_56KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
74 
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);
80 
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]);
83 
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]);
86 
87 
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;
92 
93 // TIMER_ID_1KHZ->SHORTS |= TIMER_SHORTS_COMPARE0_CLEAR_Enabled
94 // << TIMER_SHORTS_COMPARE0_CLEAR_Pos;
95 // TIMER_ID_1KHZ->SHORTS |= TIMER_SHORTS_COMPARE0_STOP_Enabled
96 // << TIMER_SHORTS_COMPARE0_STOP_Pos;
97 //
98 //
99 // NRF_GPIOTE->CONFIG[ON_TIMER_GPIOTE_CHANNEL] =
100 // (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos)
101 // | ((tssp_tx_en << GPIOTE_CONFIG_PSEL_Pos)& GPIOTE_CONFIG_PSEL_Msk)
102 // | (GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos)
103 // | (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos);
104 //
105 //
106 // NRF_PPI->CH[PPI_xxKHz_1].EEP = (uint32_t) &TIMER_ID_1KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED];
107 // NRF_PPI->CH[PPI_xxKHz_1].TEP = (uint32_t) &TIMER_ID_1KHZ->TASKS_SHUTDOWN;
108 //
109 // NRF_PPI->FORK[PPI_xxKHz_1].TEP = (uint32_t) &TIMER_ID_56KHZ->TASKS_SHUTDOWN;
110 //
111 // NRF_PPI->CH[PPI_xxKHz_2].EEP = (uint32_t) &TIMER_ID_1KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED];
112 // NRF_PPI->CH[PPI_xxKHz_2].TEP = (uint32_t) &(NRF_GPIOTE->TASKS_CLR[ON_TIMER_GPIOTE_CHANNEL]);
113 
114  NVIC_SetPriority (TIMER2_IRQn, APP_IRQ_PRIORITY_HIGH);
115  NVIC_EnableIRQ (TIMER2_IRQn);
116 }
117 #if ISR_MANAGER == 1
118 void tssp_ir_tx_timer1_Handler ()
119 #else
120 void TIMER2_IRQHandler ()
121 #endif
122 {
123  hal_gpio_pin_clear (tx_en);
124  hal_gpio_pin_clear (tx_in);
125 #if ISR_MANAGER == 0
126  TIMER_ID_56KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
127  TIMER_ID_1KHZ->EVENTS_COMPARE[TIMERS_CHANNEL_USED] = 0;
128 #endif
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;
133 }
134 
135 void tssp_ir_tx_timer2_Handler ()
136 {
137 
138 }
139 
140 void tssp_ir_tx_start (void)
141 {
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;
148 
149 // NRF_PPI->CHENSET |= 1 << PPI_xxKHz_1;
150 // NRF_PPI->CHENSET |= 1 << PPI_xxKHz_2;
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;
155 
156 }
157 
158 void tssp_ir_tx_stop (void)
159 {
160  TIMER_ID_1KHZ->TASKS_SHUTDOWN = 1;
161  hal_gpio_pin_clear (tx_en);
162 
163 // NRF_PPI->CHENCLR |= 1 << PPI_xxKHz_1;
164 // NRF_PPI->CHENCLR |= 1 << PPI_xxKHz_2;
165  NRF_PPI->CHENCLR |= 1 << PPI_56KHz_1;
166  NRF_PPI->CHENCLR |= 1 << PPI_56KHz_2;
167  TIMER_ID_56KHZ->TASKS_STOP = 1;
168 
169  TIMER_ID_56KHZ->TASKS_SHUTDOWN = 1;
170 }