Skip to content

Commit 488ca06

Browse files
committed
working continous mode
1 parent 16f4d12 commit 488ca06

File tree

1 file changed

+110
-36
lines changed

1 file changed

+110
-36
lines changed

cores/esp32/esp32-hal-rmt.c

+110-36
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
#define MAX_CHANNELS 8
1414
#define MAX_DATA_PER_CHANNEL 64
15-
#define MAX_DATA_PER_ITTERATION 20
15+
#define MAX_DATA_PER_ITTERATION 40
1616
#define _ABS(a) (a>0?a:-a)
1717
#define _LIMIT(a,b) (a>b?b:a)
1818
#define __INT_TX_END (1)
@@ -31,6 +31,7 @@ typedef enum {
3131
e_txthr_intr = 2,
3232
e_rx_intr = 4,
3333
e_end_trans = 8,
34+
e_set_conti = 0x10,
3435

3536
} intr_mode_t;
3637

@@ -54,6 +55,8 @@ static rmt_obj_t g_rmt_objects[MAX_CHANNELS] = {
5455
};
5556

5657
static intr_handle_t intr_handle;
58+
static int state = 0;
59+
5760

5861
static bool periph_enabled = false;
5962

@@ -138,18 +141,18 @@ bool rmtSendQueued(rmt_obj_t* rmt, uint32_t* data, size_t size)
138141
RMT.int_clr.val |= _INT_TX_END(channel);
139142
digitalWrite(2, 0);
140143
#endif
141-
144+
state = 0;
142145
int half_tx_nr = MAX_DATA_PER_ITTERATION/2;
143146
RMT.tx_lim_ch[channel].limit = half_tx_nr;
144147
rmt->remaining_to_send = size - MAX_DATA_PER_ITTERATION;
145148
rmt->remaining_ptr = data + MAX_DATA_PER_ITTERATION;
146-
rmt->intr_mode = e_tx_intr | e_txthr_intr;
147-
// RMT.conf_ch[channel].conf1.apb_mem_rst = 1;
148-
// RMT.conf_ch[channel].conf1.apb_mem_rst = 0;
149-
// RMT.conf_ch[channel].conf1.mem_rd_rst = 1;
150-
// RMT.conf_ch[channel].conf1.mem_rd_rst = 0;
151-
// RMT.conf_ch[channel].conf1.mem_wr_rst = 1;
152-
// RMT.conf_ch[channel].conf1.mem_wr_rst = 0;
149+
rmt->intr_mode = e_tx_intr | e_txthr_intr | e_set_conti;
150+
RMT.conf_ch[channel].conf1.apb_mem_rst = 1;
151+
RMT.conf_ch[channel].conf1.apb_mem_rst = 0;
152+
RMT.conf_ch[channel].conf1.mem_rd_rst = 1;
153+
RMT.conf_ch[channel].conf1.mem_rd_rst = 0;
154+
RMT.conf_ch[channel].conf1.mem_wr_rst = 1;
155+
RMT.conf_ch[channel].conf1.mem_wr_rst = 0;
153156
RMTMEM.chan[channel].data32[MAX_DATA_PER_ITTERATION].val = 0;
154157
fake_transaction = 1;
155158
// RMT.conf_ch[channel].conf1.mem_wr_rst = 1;
@@ -310,6 +313,9 @@ rmt_obj_t* rmtInit(int pin, bool tx_not_rx, int entries, int period)
310313
return NULL;
311314
}
312315
rmt = _rmtAllocate(pin, i, buffers);
316+
if (!intr_handle) {
317+
esp_intr_alloc(ETS_RMT_INTR_SOURCE, (int)ESP_INTR_FLAG_IRAM, _rmt_isr, NULL, &intr_handle);
318+
}
313319

314320
size_t channel = i;
315321
rmt->pin = pin;
@@ -367,7 +373,6 @@ static void _initPin(int pin, int channel, bool tx_not_rx)
367373
}
368374
}
369375

370-
static int state = 0;
371376

372377
static void IRAM_ATTR _rmt_isr(void* arg)
373378
{
@@ -387,6 +392,8 @@ static void IRAM_ATTR _rmt_isr(void* arg)
387392
if (intr_val&_INT_ERROR(ch)) {
388393

389394
// digitalWrite(4, 1);
395+
digitalWrite(2, 1);
396+
390397
ets_printf("Error!\n");
391398

392399

@@ -410,14 +417,26 @@ static void IRAM_ATTR _rmt_isr(void* arg)
410417
} else
411418
#endif
412419
{
413-
digitalWrite(2, 1);
414-
ets_printf("Tx_End!\n");
415-
if (RMT.conf_ch[ch].conf1.tx_conti_mode) {
420+
// digitalWrite(2, 1);
421+
// ets_printf("Tx_End!\n");
422+
if (g_rmt_objects[ch].intr_mode&e_end_trans) {
423+
ets_printf("Tx_End marked !\n");
416424
RMT.conf_ch[ch].conf1.tx_conti_mode = 0;
417-
} else {
418-
RMT.int_ena.val &= ~_INT_TX_END(ch);
419-
RMT.int_ena.val &= ~_INT_THR_EVNT(ch);
425+
g_rmt_objects[ch].intr_mode = e_no_intr;
426+
427+
} else if (g_rmt_objects[ch].intr_mode == e_no_intr) {
428+
ets_printf("Tx completed !\n");
429+
RMT.int_ena.val &= ~_INT_TX_END(ch);
430+
RMT.int_ena.val &= ~_INT_THR_EVNT(ch);
420431
}
432+
// RMT.conf_ch[ch].conf1.tx_conti_mode = 0;
433+
434+
// if (RMT.conf_ch[ch].conf1.tx_conti_mode) {
435+
// RMT.conf_ch[ch].conf1.tx_conti_mode = 0;
436+
// } else {
437+
// RMT.int_ena.val &= ~_INT_TX_END(ch);
438+
// RMT.int_ena.val &= ~_INT_THR_EVNT(ch);
439+
// }
421440

422441
}
423442

@@ -487,13 +506,23 @@ static void IRAM_ATTR _rmt_isr(void* arg)
487506
// RMT.conf_ch[ch].conf1.mem_rd_rst = 0;
488507
// RMTMEM.chan[ch].data32[25].val = 0;
489508
// RMTMEM.chan[ch].data32[0].val = 0;
490-
if (fake_transaction == 1) {
491509

510+
// if (fake_transaction == 1) {
511+
512+
// RMT.conf_ch[ch].conf1.tx_conti_mode = 1;
513+
// fake_transaction = 2;
514+
// }
515+
if (g_rmt_objects[ch].intr_mode&e_set_conti) {
492516
RMT.conf_ch[ch].conf1.tx_conti_mode = 1;
493-
fake_transaction = 2;
517+
g_rmt_objects[ch].intr_mode &= ~e_set_conti;
494518
}
495519

496520

521+
// if (!RMT.conf_ch[ch].conf1.tx_conti_mode) {
522+
// RMT.conf_ch[ch].conf1.tx_conti_mode = 1;
523+
// }
524+
525+
497526
RMT.int_clr.val |= _INT_THR_EVNT(ch);
498527

499528
uint32_t* data = g_rmt_objects[ch].remaining_ptr;
@@ -510,42 +539,87 @@ static void IRAM_ATTR _rmt_isr(void* arg)
510539
int i;
511540
if (remaining_size > half_tx_nr) {
512541
if (!state) {
542+
// ets_printf("first\n");
513543
RMTMEM.chan[ch].data32[0].val = data[0] - 1;
514544
for (i = 1; i < half_tx_nr; i++) {
515545
RMTMEM.chan[ch].data32[i].val = data[i];
516546
}
517547
} else {
518-
for (i = 0; i < MAX_DATA_PER_ITTERATION; i++) {
548+
// ets_printf("second\n");
549+
for (i = 0; i < half_tx_nr; i++) {
519550
RMTMEM.chan[ch].data32[half_tx_nr+i].val = data[i];
520551
}
521552
}
522553
g_rmt_objects[ch].remaining_to_send -= half_tx_nr;
554+
g_rmt_objects[ch].remaining_ptr += half_tx_nr;
523555
state ^= 1;
524556
} else {
525-
RMTMEM.chan[ch].data32[0].val = data[0] - 1;
526-
for (i = 1; i < MAX_DATA_PER_ITTERATION; i++) {
527-
if (i < half_tx_nr) {
557+
// ets_printf("last chunk...");
558+
if (!state) {
559+
// ets_printf("first\n");
560+
RMTMEM.chan[ch].data32[0].val = data[0] - 1;
561+
for (i = 1; i < half_tx_nr; i++) {
528562
if (i < remaining_size) {
529563
RMTMEM.chan[ch].data32[i].val = data[i];
530564
} else {
531565
RMTMEM.chan[ch].data32[i].val = 0x000F000F;
532566
}
533-
} else {
534-
// RMTMEM.chan[ch].data32[i].val = data[i%4];
535567
}
536-
}
537-
// RMTMEM.chan[ch].data32[half_tx_nr].val = 0x000F000F;
538-
RMTMEM.chan[ch].data32[MAX_DATA_PER_ITTERATION].val = 0;
539-
g_rmt_objects[ch].remaining_ptr = NULL;
540-
}
568+
// RMTMEM.chan[ch].data32[i].val = 0;
569+
} else {
570+
// ets_printf("second\n");
571+
for (i = 0; i < half_tx_nr; i++) {
572+
if (i < remaining_size) {
573+
RMTMEM.chan[ch].data32[half_tx_nr+i].val = data[i];
574+
} else {
575+
RMTMEM.chan[ch].data32[half_tx_nr+i].val = 0x000F000F;
576+
}
577+
}
578+
// RMTMEM.chan[ch].data32[i].val = 0;
579+
}
580+
state ^= 1;
581+
RMTMEM.chan[ch].data32[MAX_DATA_PER_ITTERATION].val = 0;
582+
g_rmt_objects[ch].remaining_ptr = NULL;
583+
584+
// for (i = 1; i < MAX_DATA_PER_ITTERATION; i++) {
585+
// if (i < half_tx_nr) {
586+
// if (i < remaining_size) {
587+
// RMTMEM.chan[ch].data32[i].val = data[i];
588+
// } else {
589+
// RMTMEM.chan[ch].data32[i].val = 0x000F000F;
590+
// }
591+
// } else {
592+
// // RMTMEM.chan[ch].data32[i].val = data[i%4];
593+
// }
594+
}
595+
// RMTMEM.chan[ch].data32[half_tx_nr].val = 0x000F000F;
596+
} else {
597+
if ((!(g_rmt_objects[ch].intr_mode&e_end_trans)) && (g_rmt_objects[ch].intr_mode != e_no_intr)) {
598+
// ets_printf("tail (empty)");
599+
int half_tx_nr = MAX_DATA_PER_ITTERATION/2;
600+
int i;
601+
if (!state) {
602+
// ets_printf("...first\n");
603+
for (i = 0; i < half_tx_nr; i++) {
604+
RMTMEM.chan[ch].data32[i].val = 0x000F000F;
605+
}
606+
RMTMEM.chan[ch].data32[i].val = 0;
541607

542-
// RMT.conf_ch[ch].conf1.tx_conti_mode = 0;
543-
} else {
544-
// ets_printf("Finish\n");
545-
int half_tx_nr = MAX_DATA_PER_ITTERATION/2;
546-
int i;
547-
for (i = half_tx_nr; i < MAX_DATA_PER_ITTERATION; i++) {
548-
RMTMEM.chan[ch].data32[i].val = 0x000F000F;
608+
} else {
609+
// ets_printf("...second\n");
610+
for (i = 0; i < half_tx_nr; i++) {
611+
RMTMEM.chan[ch].data32[half_tx_nr+i].val = 0x000F000F;
612+
}
613+
RMTMEM.chan[ch].data32[i].val = 0;
614+
}
615+
// int half_tx_nr = MAX_DATA_PER_ITTERATION/2;
616+
// int i;
617+
// for (i = half_tx_nr; i < MAX_DATA_PER_ITTERATION; i++) {
618+
// RMTMEM.chan[ch].data32[i].val = 0x000F000F;
619+
// }
620+
g_rmt_objects[ch].intr_mode |= e_end_trans;
621+
} else {
622+
// ets_printf("do_nothing\n");
549623
}
550624
#if 0
551625
int half_tx_nr = MAX_DATA_PER_ITTERATION/2;

0 commit comments

Comments
 (0)