30
30
bool AutoAnalog::adcReady;
31
31
uint32_t AutoAnalog::aSize;
32
32
uint8_t AutoAnalog::aCtr;
33
- uint16_t *AutoAnalog::buf0 ;
34
- uint16_t *AutoAnalog::buf1 ;
33
+ uint16_t *AutoAnalog::adcBuf0 ;
34
+ uint16_t *AutoAnalog::adcBuf1 ;
35
35
void (*AutoAnalog::_onReceive)(uint16_t *buf, uint32_t buf_len);
36
36
#endif
37
37
79
79
/* Public Functions */
80
80
/* ***************************************************************************/
81
81
82
- uint16_t adcBuf0[MAX_BUFFER_SIZE];
83
- uint16_t adcBuf1[MAX_BUFFER_SIZE];
84
82
uint8_t analogCounter = 0 ;
85
- uint32_t buf_size = MAX_BUFFER_SIZE;
86
83
uint16_t mycounter = 0 ;
87
84
// int16_t sine_table[] = { 0, 0, 23170, 23170, 32767, 32767, 23170, 23170, 0, 0, -23170, -23170, -32768, -32768, -23170, -23170};
88
85
@@ -97,12 +94,11 @@ AutoAnalog::AutoAnalog(){
97
94
dacBuffer[i] = 0 ;
98
95
}
99
96
100
- aSize = MAX_BUFFER_SIZE;// &buf_size;
101
- buf0 = &adcBuf0[0 ];
102
- buf1 = &adcBuf1[0 ];
97
+ aSize = MAX_BUFFER_SIZE;
103
98
aCtr = 0 ;
104
99
micOn = 0 ;
105
100
sampleCounter = 0 ;
101
+ maxBufferSize = 0 ;
106
102
I2S_PIN_MCK = 2 ;
107
103
I2S_PORT_MCK = 0 ;
108
104
I2S_PIN_SCK = 3 ;
@@ -111,16 +107,28 @@ AutoAnalog::AutoAnalog(){
111
107
I2S_PORT_LRCK = 0 ;
112
108
I2S_PIN_SDOUT = 5 ;
113
109
I2S_PORT_SDOUT = 0 ;
110
+ I2S_PIN_SDIN = 4 ;
111
+ I2S_PORT_SDIN = 0 ;
114
112
}
115
113
116
114
void AutoAnalog::begin (bool enADC, bool enDAC, uint8_t _useI2S){
117
115
116
+ maxBufferSize = maxBufferSize > 0 ? maxBufferSize : MAX_BUFFER_SIZE;
117
+ useI2S = _useI2S;
118
+
118
119
if (enADC){
120
+ adcBuf0 = reinterpret_cast <uint16_t *>(malloc (maxBufferSize * 2 ));
121
+ memset (adcBuf0,0 ,maxBufferSize * 2 );
122
+ adcBuf1 = reinterpret_cast <uint16_t *>(malloc (maxBufferSize * 2 ));
123
+ memset (adcBuf1,0 ,maxBufferSize * 2 );
119
124
adcSetup ();
120
125
}
121
126
122
127
if (enDAC){
123
- useI2S = _useI2S;
128
+ dacBuf0 = reinterpret_cast <uint16_t *>(malloc (maxBufferSize * 2 ));
129
+ memset (dacBuf0,0 ,maxBufferSize * 2 );
130
+ dacBuf1 = reinterpret_cast <uint16_t *>(malloc (maxBufferSize * 2 ));
131
+ memset (dacBuf1,0 ,maxBufferSize * 2 );
124
132
dacSetup ();
125
133
}
126
134
@@ -243,9 +251,37 @@ void AutoAnalog::disableAdcChannel(uint8_t pinAx){
243
251
/* ***************************************************************************/
244
252
245
253
void AutoAnalog::getADC (uint32_t samples){
246
- while (!adcReady){__WFE ();};
247
- aSize = samples;
248
- adcReady = false ;
254
+
255
+ if (useI2S == 2 || useI2S == 3 ){
256
+ while (NRF_I2S->EVENTS_RXPTRUPD == 0 ){}
257
+
258
+ uint8_t divider = 2 ;
259
+ if (adcBitsPerSample == 24 ){
260
+ for (uint32_t i=0 ; i<samples; i++){
261
+ adcBuffer16[i] = ((uint32_t )&adcBuf0[0 ]) >> 8 ;
262
+ }
263
+ }else
264
+ if (adcBitsPerSample == 16 ){
265
+ memcpy (adcBuffer16,adcBuf0,samples*2 );
266
+ }else
267
+ if (adcBitsPerSample == 8 ){
268
+ memcpy (adcBuffer, adcBuf0, samples);
269
+ divider = 4 ;
270
+ }
271
+ NRF_I2S->RXD .PTR = (uint32_t )&adcBuf0[0 ];
272
+
273
+
274
+
275
+ if (useI2S == 2 ){
276
+ NRF_I2S->RXTXD .MAXCNT = samples / divider;
277
+ }
278
+ NRF_I2S->EVENTS_RXPTRUPD = 0 ;
279
+
280
+ }else {
281
+ while (!adcReady){__WFE ();};
282
+ aSize = samples;
283
+ adcReady = false ;
284
+ }
249
285
}
250
286
251
287
/* ***************************************************************************/
@@ -254,8 +290,13 @@ bool whichBuf = 0;
254
290
255
291
void AutoAnalog::feedDAC (uint8_t dacChannel, uint32_t samples, bool startInterrupts){
256
292
257
- if (useI2S){
293
+ if (useI2S == 1 || useI2S == 3 ){
258
294
295
+ if (NRF_I2S->ENABLE == 0 ){
296
+ NRF_I2S->ENABLE = 1 ;
297
+ NRF_I2S->TASKS_START = 1 ;
298
+ }
299
+
259
300
while (NRF_I2S->EVENTS_TXPTRUPD == 0 ){}
260
301
if (dacBitsPerSample == 8 ){
261
302
if (whichBuf){
@@ -335,7 +376,47 @@ return 1;
335
376
/* ***************************************************************************/
336
377
337
378
void AutoAnalog::adcSetup (void ){
379
+
380
+ if (useI2S == 2 || useI2S == 3 ){
381
+
382
+ NRF_I2S->CONFIG .RXEN = (I2S_CONFIG_RXEN_RXEN_ENABLE << I2S_CONFIG_RXEN_RXEN_Pos);
383
+
384
+ // Enable MCK generator
385
+ NRF_I2S->CONFIG .MCKEN = (I2S_CONFIG_MCKEN_MCKEN_ENABLE << I2S_CONFIG_MCKEN_MCKEN_Pos);
386
+
387
+ // Master mode, 16Bit, left aligned
388
+ NRF_I2S->CONFIG .MODE = I2S_CONFIG_MODE_MODE_MASTER << I2S_CONFIG_MODE_MODE_Pos;
389
+
390
+ NRF_I2S->CONFIG .SWIDTH = I2S_CONFIG_SWIDTH_SWIDTH_16BIT << I2S_CONFIG_SWIDTH_SWIDTH_Pos;
391
+ NRF_I2S->CONFIG .MCKFREQ = I2S_CONFIG_MCKFREQ_MCKFREQ_32MDIV16 << I2S_CONFIG_MCKFREQ_MCKFREQ_Pos;
392
+ NRF_I2S->CONFIG .RATIO = I2S_CONFIG_RATIO_RATIO_128X << I2S_CONFIG_RATIO_RATIO_Pos;
393
+ NRF_I2S->CONFIG .ALIGN = I2S_CONFIG_ALIGN_ALIGN_LEFT << I2S_CONFIG_ALIGN_ALIGN_Pos;
394
+
395
+ // Format = I2S
396
+ NRF_I2S->CONFIG .FORMAT = I2S_CONFIG_FORMAT_FORMAT_I2S << I2S_CONFIG_FORMAT_FORMAT_Pos;
397
+
398
+ // Use stereo
399
+ NRF_I2S->CONFIG .CHANNELS = I2S_CONFIG_CHANNELS_CHANNELS_LEFT << I2S_CONFIG_CHANNELS_CHANNELS_Pos;
400
+
401
+ // Configure pins
402
+ NRF_I2S->PSEL .MCK = (I2S_PIN_MCK << I2S_PSEL_MCK_PIN_Pos) | (I2S_PSEL_MCK_CONNECT_Connected << I2S_PSEL_MCK_CONNECT_Pos) | (I2S_PORT_MCK << I2S_PSEL_MCK_PORT_Pos);
403
+ NRF_I2S->PSEL .SCK = (I2S_PIN_SCK << I2S_PSEL_SCK_PIN_Pos) | (I2S_PSEL_SCK_CONNECT_Connected << I2S_PSEL_SCK_CONNECT_Pos) | (I2S_PORT_SCK << I2S_PSEL_SCK_PORT_Pos);
404
+ NRF_I2S->PSEL .LRCK = (I2S_PIN_LRCK << I2S_PSEL_LRCK_PIN_Pos) | (I2S_PSEL_LRCK_CONNECT_Connected << I2S_PSEL_LRCK_CONNECT_Pos) | (I2S_PORT_LRCK << I2S_PSEL_LRCK_PORT_Pos);
405
+ NRF_I2S->PSEL .SDIN = (I2S_PIN_SDOUT << I2S_PSEL_SDIN_PIN_Pos) | (I2S_PSEL_SDIN_CONNECT_Connected << I2S_PSEL_SDIN_CONNECT_Pos) | (I2S_PORT_SDIN << I2S_PSEL_SDIN_PORT_Pos);
406
+
407
+
408
+
409
+ // Configure data pointer
410
+ NRF_I2S->RXD .PTR = (uint32_t )adcBuf0;
411
+ NRF_I2S->RXTXD .MAXCNT = 16 ;// / sizeof(uint32_t);
412
+
413
+ NRF_I2S->ENABLE = 1 ;
414
+ NRF_I2S->TASKS_START = 1 ;
338
415
416
+ }else {
417
+
418
+
419
+
339
420
340
421
set_callback (adcCallback);
341
422
dinPin = PIN_PDM_DIN;
@@ -440,6 +521,7 @@ void AutoAnalog::adcSetup(void){
440
521
nrf_pdm_task_trigger (myPDM,NRF_PDM_TASK_START);
441
522
442
523
#endif
524
+ } // USE_I2S
443
525
}
444
526
445
527
/* ***************************************************************************/
@@ -452,7 +534,7 @@ void AutoAnalog::adcInterrupts(bool enabled){
452
534
453
535
void AutoAnalog::dacSetup (void ){
454
536
455
- if (useI2S){
537
+ if (useI2S == 1 || useI2S == 3 ){
456
538
// Enable transmission
457
539
NRF_I2S->CONFIG .TXEN = (I2S_CONFIG_TXEN_TXEN_ENABLE << I2S_CONFIG_TXEN_TXEN_Pos);
458
540
@@ -477,7 +559,7 @@ void AutoAnalog::dacSetup(void){
477
559
NRF_I2S->PSEL .MCK = (I2S_PIN_MCK << I2S_PSEL_MCK_PIN_Pos) | (I2S_PSEL_MCK_CONNECT_Connected << I2S_PSEL_MCK_CONNECT_Pos) | (I2S_PORT_MCK << I2S_PSEL_MCK_PORT_Pos);
478
560
NRF_I2S->PSEL .SCK = (I2S_PIN_SCK << I2S_PSEL_SCK_PIN_Pos) | (I2S_PSEL_SCK_CONNECT_Connected << I2S_PSEL_SCK_CONNECT_Pos) | (I2S_PORT_SCK << I2S_PSEL_SCK_PORT_Pos);
479
561
NRF_I2S->PSEL .LRCK = (I2S_PIN_LRCK << I2S_PSEL_LRCK_PIN_Pos) | (I2S_PSEL_LRCK_CONNECT_Connected << I2S_PSEL_LRCK_CONNECT_Pos) | (I2S_PORT_LRCK << I2S_PSEL_LRCK_PORT_Pos);
480
- NRF_I2S->PSEL .SDOUT = (I2S_PIN_SDOUT << I2S_PSEL_SDOUT_PIN_Pos) | (I2S_PSEL_SDOUT_CONNECT_Connected << I2S_PSEL_LRCK_CONNECT_Pos ) | (I2S_PORT_SDOUT << I2S_PSEL_SDOUT_PORT_Pos);
562
+ NRF_I2S->PSEL .SDOUT = (I2S_PIN_SDOUT << I2S_PSEL_SDOUT_PIN_Pos) | (I2S_PSEL_SDOUT_CONNECT_Connected << I2S_PSEL_SDOUT_CONNECT_Pos ) | (I2S_PORT_SDOUT << I2S_PSEL_SDOUT_PORT_Pos);
481
563
482
564
483
565
// NRF_I2S->INTENSET = I2S_INTEN_TXPTRUPD_Enabled << I2S_INTEN_TXPTRUPD_Pos;
@@ -522,7 +604,7 @@ void AutoAnalog::dacSetup(void){
522
604
/* ***************************************************************************/
523
605
524
606
void AutoAnalog::disableDAC (bool withinTask){
525
- if (useI2S){
607
+ if (useI2S > 0 ){
526
608
NRF_I2S->TASKS_STOP = 1 ;
527
609
NRF_I2S->ENABLE = 0 ;
528
610
}else {
@@ -569,17 +651,17 @@ if (nrf_pdm_event_check(NRF_PDM_EVENT_STARTED)) {
569
651
// switch to fill
570
652
571
653
if (AutoAnalog::aCtr) {
572
- nrf_pdm_buffer_set ((uint32_t *)(AutoAnalog::buf0 ), AutoAnalog::aSize);
654
+ nrf_pdm_buffer_set ((uint32_t *)(AutoAnalog::adcBuf0 ), AutoAnalog::aSize);
573
655
if (AutoAnalog::_onReceive){
574
656
NVIC_DisableIRQ (PDM_IRQn);
575
- AutoAnalog::_onReceive (AutoAnalog::buf1 , AutoAnalog::aSize);
657
+ AutoAnalog::_onReceive (AutoAnalog::adcBuf1 , AutoAnalog::aSize);
576
658
NVIC_EnableIRQ (PDM_IRQn);
577
659
}
578
660
} else {
579
- nrf_pdm_buffer_set ((uint32_t *)(AutoAnalog::buf1 ), AutoAnalog::aSize);
661
+ nrf_pdm_buffer_set ((uint32_t *)(AutoAnalog::adcBuf1 ), AutoAnalog::aSize);
580
662
if (AutoAnalog::_onReceive){
581
663
NVIC_DisableIRQ (PDM_IRQn);
582
- AutoAnalog::_onReceive (AutoAnalog::buf0 , AutoAnalog::aSize);
664
+ AutoAnalog::_onReceive (AutoAnalog::adcBuf0 , AutoAnalog::aSize);
583
665
NVIC_EnableIRQ (PDM_IRQn);
584
666
}
585
667
}
@@ -607,17 +689,17 @@ if (nrf_pdm_event_check(myPDM,NRF_PDM_EVENT_STARTED)) {
607
689
// switch to fill
608
690
609
691
if (AutoAnalog::aCtr) {
610
- nrf_pdm_buffer_set (myPDM,(uint32_t *)(AutoAnalog::buf0 ), AutoAnalog::aSize);
692
+ nrf_pdm_buffer_set (myPDM,(uint32_t *)(AutoAnalog::adcBuf0 ), AutoAnalog::aSize);
611
693
if (AutoAnalog::_onReceive){
612
694
NVIC_DisableIRQ (PDM_IRQn);
613
- AutoAnalog::_onReceive (AutoAnalog::buf1 , AutoAnalog::aSize);
695
+ AutoAnalog::_onReceive (AutoAnalog::adcBuf1 , AutoAnalog::aSize);
614
696
NVIC_EnableIRQ (PDM_IRQn);
615
697
}
616
698
} else {
617
- nrf_pdm_buffer_set (myPDM,(uint32_t *)(AutoAnalog::buf1 ), AutoAnalog::aSize);
699
+ nrf_pdm_buffer_set (myPDM,(uint32_t *)(AutoAnalog::adcBuf1 ), AutoAnalog::aSize);
618
700
if (AutoAnalog::_onReceive){
619
701
NVIC_DisableIRQ (PDM_IRQn);
620
- AutoAnalog::_onReceive (AutoAnalog::buf0 , AutoAnalog::aSize);
702
+ AutoAnalog::_onReceive (AutoAnalog::adcBuf0 , AutoAnalog::aSize);
621
703
NVIC_EnableIRQ (PDM_IRQn);
622
704
}
623
705
}
0 commit comments