26#include "../AutoAnalogAudio.h"
27#include "driver/i2s.h"
28#include "driver/adc.h"
29#include "freertos/FreeRTOS.h"
30#include "freertos/task.h"
38 volatile bool dacTaskActive;
39 volatile bool dacTaskCreated;
41 uint16_t tmpADCBuffer16[MAX_BUFFER_SIZE];
42 volatile uint32_t lastAdcTime;
43 uint8_t *adcPtr = NULL;
52 dacTaskActive =
false;
53 dacTaskCreated =
false;
62 adcChannel = (adc1_channel_t)0;
64 for(
int i=0; i<MAX_BUFFER_SIZE; i++){
79void adcTask(
void *args){
81 if(*(uint32_t*)args > 0){
83 i2s_read(I2S_NUM_0, &tmpADCBuffer16, *(uint32_t*)args * 2, &bytesRead, 500 / portTICK_PERIOD_MS);
85 lastAdcTime = millis();
87 if(millis() - lastAdcTime > 150){
88 vTaskDelay( 5 / portTICK_PERIOD_MS);
96uint32_t dacTTimer = 0;
98void dacTask(
void *args){
101 if(*(uint8_t*)args == 1 && dacTaskActive ==
true){
105 vTaskDelay( 10 / portTICK_PERIOD_MS);
115 i2s_mode_t myMode = (i2s_mode_t)I2S_MODE_MASTER;
119 myMode = (i2s_mode_t)(myMode | I2S_MODE_RX | I2S_MODE_ADC_BUILT_IN);
122 myMode = (i2s_mode_t)(myMode | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN);
126 .mode = (i2s_mode_t)myMode,
127 .sample_rate = 16000,
128 .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
129 .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
130 .communication_format = I2S_COMM_FORMAT_I2S_LSB,
131 .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
133 .dma_buf_len = MAX_BUFFER_SIZE,
135 .tx_desc_auto_clear =
false,
138 i2s_driver_install(I2S_NUM_0, &i2s_cfg, 0, NULL);
142 i2s_set_adc_mode(ADC_UNIT_1, adcChannel);
143 adc1_config_channel_atten(adcChannel, ADC_ATTEN_DB_11);
144 i2s_adc_enable(I2S_NUM_0);
147 i2s_set_dac_mode(I2S_DAC_CHANNEL_BOTH_EN);
163 if(dacTaskCreated ==
false){
164 dacTaskCreated =
true;
167 dacTaskActive =
true;
168 xTaskCreate(dacTask,
"DAC Task",3062,&dacVar,tskIDLE_PRIORITY + 1,&
dacTaskHandle);
171 if(dacTaskCreated ==
true){
172 dacTaskCreated =
false;
173 dacTaskActive =
false;
177 if(dacVar == 1 && !withinTask){
180 while(dacVar != 3){ delay(3); }
198 uint8_t zeroBuff[MAX_BUFFER_SIZE];
199 memset(zeroBuff,0,MAX_BUFFER_SIZE);
201 uint16_t counter = 0;
202 for(uint16_t i=0; i<sample; i++){
207 size_t bytesWritten = 0;
208 size_t bytesWritten2 = 0;
210 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
211 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
212 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
214 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE-counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
215 i2s_write_expand(I2S_NUM_0,&tmpBuf[0],counter,8,16,&bytesWritten2, 500 / portTICK_PERIOD_MS);
224 uint8_t zeroBuff[MAX_BUFFER_SIZE];
225 memset(zeroBuff,0,MAX_BUFFER_SIZE);
227 uint16_t counter = 0;
228 for(uint8_t i=lastDacSample; i > 0; i--){
229 tmpBuf[counter++] = i;
231 size_t bytesWritten = 0;
233 i2s_write_expand(I2S_NUM_0,&tmpBuf[0],counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
234 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE-counter,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
235 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
236 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
237 i2s_write_expand(I2S_NUM_0,&zeroBuff[0],MAX_BUFFER_SIZE,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
247 sampleRate = sampRate;
253 i2s_set_clk(I2S_NUM_0, sampRate, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_MONO);
255 i2s_set_clk(I2S_NUM_0, sampRate/2, I2S_BITS_PER_SAMPLE_16BIT, I2S_CHANNEL_STEREO);
273 adcChannel = (adc1_channel_t)pinAx;
292 adcTaskCreated =
true;
293 xTaskCreate(adcTask,
"ADC Task",2048,&adcSamples,tskIDLE_PRIORITY + 1,NULL);
296 while(adcSamples > 0){ delayMicroseconds(100); };
298 uint16_t offset = (int)adcChannel * 0x1000 + 0xFFF;
299 for(uint32_t i=0; i<samples;i++){
300 tmpADCBuffer16[i] = offset - tmpADCBuffer16[i];
304 adcSamples = samples;
317 size_t bytesWritten = 0;
320 for(
int i=0; i<samples; i++){
343 if(dacEnabled ==
false){
348 i2s_write_expand(I2S_NUM_0,&
dacBuffer[0],samples,8,16,&bytesWritten, 500 / portTICK_PERIOD_MS);
349 lastDacSample =
dacBuffer[bytesWritten-1];
352 if(startInterrupts ==
true){
353 dacTaskActive =
true;
367void AutoAnalog::dacBufferStereo(uint8_t dacChannel){
375uint32_t AutoAnalog::frequencyToTimerCount(uint32_t frequency){
382void AutoAnalog::adcSetup(
void){
395void AutoAnalog::dacSetup(
void){
405 dacTaskActive =
false;
412 i2s_zero_dma_buffer(I2S_NUM_0);
429void AutoAnalog::tcSetup (uint32_t sampRate){
437void AutoAnalog::tc2Setup (uint32_t sampRate)
void adcInterrupts(bool enabled=true)
void setSampleRate(uint32_t sampRate=0, bool stereo=false)
void rampIn(uint8_t sample)
uint8_t adcBuffer[MAX_BUFFER_SIZE]
uint8_t dacBuffer[MAX_BUFFER_SIZE]
TaskHandle_t dacTaskHandle
void getADC(uint32_t samples=MAX_BUFFER_SIZE)
uint16_t adcBuffer16[MAX_BUFFER_SIZE]
void rampOut(uint8_t sample)
void disableDAC(bool withinTask=false)
uint16_t dacBuffer16[MAX_BUFFER_SIZE]
void begin(uint8_t enADC, uint8_t enDAC, uint8_t _useI2S=0)
void dacInterrupts(bool enabled=true, bool withinTask=false)
void enableAdcChannel(uint8_t pinAx)
void feedDAC(uint8_t dacChannel=0, uint32_t samples=MAX_BUFFER_SIZE, bool startInterrupts=false)
void disableAdcChannel(uint8_t pinAx)