12
12
13
13
#define MAX_CHANNELS 8
14
14
#define MAX_DATA_PER_CHANNEL 64
15
- #define MAX_DATA_PER_ITTERATION 20
15
+ #define MAX_DATA_PER_ITTERATION 40
16
16
#define _ABS (a ) (a>0?a:-a)
17
17
#define _LIMIT (a ,b ) (a>b?b:a)
18
18
#define __INT_TX_END (1)
@@ -31,6 +31,7 @@ typedef enum {
31
31
e_txthr_intr = 2 ,
32
32
e_rx_intr = 4 ,
33
33
e_end_trans = 8 ,
34
+ e_set_conti = 0x10 ,
34
35
35
36
} intr_mode_t ;
36
37
@@ -54,6 +55,8 @@ static rmt_obj_t g_rmt_objects[MAX_CHANNELS] = {
54
55
};
55
56
56
57
static intr_handle_t intr_handle ;
58
+ static int state = 0 ;
59
+
57
60
58
61
static bool periph_enabled = false;
59
62
@@ -138,18 +141,18 @@ bool rmtSendQueued(rmt_obj_t* rmt, uint32_t* data, size_t size)
138
141
RMT .int_clr .val |= _INT_TX_END (channel );
139
142
digitalWrite (2 , 0 );
140
143
#endif
141
-
144
+ state = 0 ;
142
145
int half_tx_nr = MAX_DATA_PER_ITTERATION /2 ;
143
146
RMT .tx_lim_ch [channel ].limit = half_tx_nr ;
144
147
rmt -> remaining_to_send = size - MAX_DATA_PER_ITTERATION ;
145
148
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 ;
153
156
RMTMEM .chan [channel ].data32 [MAX_DATA_PER_ITTERATION ].val = 0 ;
154
157
fake_transaction = 1 ;
155
158
// 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)
310
313
return NULL ;
311
314
}
312
315
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
+ }
313
319
314
320
size_t channel = i ;
315
321
rmt -> pin = pin ;
@@ -367,7 +373,6 @@ static void _initPin(int pin, int channel, bool tx_not_rx)
367
373
}
368
374
}
369
375
370
- static int state = 0 ;
371
376
372
377
static void IRAM_ATTR _rmt_isr (void * arg )
373
378
{
@@ -387,6 +392,8 @@ static void IRAM_ATTR _rmt_isr(void* arg)
387
392
if (intr_val & _INT_ERROR (ch )) {
388
393
389
394
// digitalWrite(4, 1);
395
+ digitalWrite (2 , 1 );
396
+
390
397
ets_printf ("Error!\n" );
391
398
392
399
@@ -410,14 +417,26 @@ static void IRAM_ATTR _rmt_isr(void* arg)
410
417
} else
411
418
#endif
412
419
{
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" );
416
424
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 );
420
431
}
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
+ // }
421
440
422
441
}
423
442
@@ -487,13 +506,23 @@ static void IRAM_ATTR _rmt_isr(void* arg)
487
506
// RMT.conf_ch[ch].conf1.mem_rd_rst = 0;
488
507
// RMTMEM.chan[ch].data32[25].val = 0;
489
508
// RMTMEM.chan[ch].data32[0].val = 0;
490
- if (fake_transaction == 1 ) {
491
509
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 ) {
492
516
RMT .conf_ch [ch ].conf1 .tx_conti_mode = 1 ;
493
- fake_transaction = 2 ;
517
+ g_rmt_objects [ ch ]. intr_mode &= ~ e_set_conti ;
494
518
}
495
519
496
520
521
+ // if (!RMT.conf_ch[ch].conf1.tx_conti_mode) {
522
+ // RMT.conf_ch[ch].conf1.tx_conti_mode = 1;
523
+ // }
524
+
525
+
497
526
RMT .int_clr .val |= _INT_THR_EVNT (ch );
498
527
499
528
uint32_t * data = g_rmt_objects [ch ].remaining_ptr ;
@@ -510,42 +539,87 @@ static void IRAM_ATTR _rmt_isr(void* arg)
510
539
int i ;
511
540
if (remaining_size > half_tx_nr ) {
512
541
if (!state ) {
542
+ // ets_printf("first\n");
513
543
RMTMEM .chan [ch ].data32 [0 ].val = data [0 ] - 1 ;
514
544
for (i = 1 ; i < half_tx_nr ; i ++ ) {
515
545
RMTMEM .chan [ch ].data32 [i ].val = data [i ];
516
546
}
517
547
} 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 ++ ) {
519
550
RMTMEM .chan [ch ].data32 [half_tx_nr + i ].val = data [i ];
520
551
}
521
552
}
522
553
g_rmt_objects [ch ].remaining_to_send -= half_tx_nr ;
554
+ g_rmt_objects [ch ].remaining_ptr += half_tx_nr ;
523
555
state ^= 1 ;
524
556
} 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 ++ ) {
528
562
if (i < remaining_size ) {
529
563
RMTMEM .chan [ch ].data32 [i ].val = data [i ];
530
564
} else {
531
565
RMTMEM .chan [ch ].data32 [i ].val = 0x000F000F ;
532
566
}
533
- } else {
534
- // RMTMEM.chan[ch].data32[i].val = data[i%4];
535
567
}
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 ;
541
607
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");
549
623
}
550
624
#if 0
551
625
int half_tx_nr = MAX_DATA_PER_ITTERATION /2 ;
0 commit comments