Dear Sirs,
I have two sketches to generate sine waves (included bellow).
The first one writes directly to the DAC, the other one uses I2S and the internal converter of the ESP32.
With Arduino IDE and the ESP32 Feather board and the ESP32 board-Manager version 2.0.0
Both sketches work perfectly.
If I update the ESP32 board-Manager to version 2.0.4, I can now work with the Adafruit ESP32 Feather V2.
The Sketch that writes directly to the DAC 2 works perfectly on both the Adafruit ESP32 Feather and the Adafruit ESP32 Feather V2.
But the sketch with I2S, compiles without problems but does NOT work on either the Adafruit ESP32 Feather or Adafruit ESP32 Feather V2. Pin 26 remains at 0v without generating the expected signal.
Thanks in advance for your support
/*
- Firsy SKETCH Writing directly in the DAC
- Tested on Adafruit ESP32 Feather V2 y Adafruit ESP32 Feather 11-09-2022
*/
#define Num_Samples 112
int i = 0;
// Sin wave
static byte WaveFormTable[Num_Samples] =
{
0x80, 0x83, 0x87, 0x8A, 0x8E, 0x91, 0x95, 0x98, 0x9B, 0x9E, 0xA2, 0xA5, 0xA7, 0xAA, 0xAD, 0xAF,
0xB2, 0xB4, 0xB6, 0xB8, 0xB9, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF, 0xBF, 0xBF, 0xC0, 0xBF, 0xBF, 0xBF,
0xBE, 0xBD, 0xBC, 0xBB, 0xB9, 0xB8, 0xB6, 0xB4, 0xB2, 0xAF, 0xAD, 0xAA, 0xA7, 0xA5, 0xA2, 0x9E,
0x9B, 0x98, 0x95, 0x91, 0x8E, 0x8A, 0x87, 0x83, 0x80, 0x7C, 0x78, 0x75, 0x71, 0x6E, 0x6A, 0x67,
0x64, 0x61, 0x5D, 0x5A, 0x58, 0x55, 0x52, 0x50, 0x4D, 0x4B, 0x49, 0x47, 0x46, 0x44, 0x43, 0x42,
0x41, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x41, 0x42, 0x43, 0x44, 0x46, 0x47, 0x49, 0x4B,
0x4D, 0x50, 0x52, 0x55, 0x58, 0x5A, 0x5D, 0x61, 0x64, 0x67, 0x6A, 0x6E, 0x71, 0x75, 0x78, 0x7C
};
void setup()
{
}
void loop()
{
byte wave_type = 0; // Sine
dacWrite(26, WaveFormTable[i]); //25 ou 26
i++;
if (i >= Num_Samples)
i = 0;
}
==============================================================================
/*
- Second SKETCH
- This is an example to write DAC at high frequency using the I2S peripheral
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "soc/rtc_io_reg.h"
#include "soc/rtc_cntl_reg.h"
#include "soc/sens_reg.h"
#include "soc/rtc.h"
#include <Arduino.h>
#include <driver/i2s.h>
#include <driver/dac.h> // libreria necesaria para definir DAC_CHANNEL_1 no es necesaria para DMA DAC
#include "freertos/queue.h"
#define I2S_SAMPLE_RATE 426595
#define Num_Samples 256
int i = 0;
static byte WaveFormTable[Num_Samples] =
// Sin wave con 256 samples.
{
0x80, 0x83, 0x86, 0x89, 0x8C, 0x8F, 0x92, 0x95, 0x98, 0x9B, 0x9E, 0xA1, 0xA4, 0xA7, 0xAA, 0xAD, 0xB0, 0xB3, 0xB6, 0xB9,
0xBB, 0xBE, 0xC1, 0xC3, 0xC6, 0xC9, 0xCB, 0xCE, 0xD0, 0xD2, 0xD5, 0xD7, 0xD9, 0xDB, 0xDE, 0xE0, 0xE2, 0xE4, 0xE6, 0xE7,
0xE9, 0xEB, 0xEC, 0xEE, 0xF0, 0xF1, 0xF2, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFB, 0xFB, 0xFC, 0xFD, 0xFD, 0xFE,
0xFE, 0xFE, 0xFE, 0xFE, 0xFF, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFD, 0xFD, 0xFC, 0xFB, 0xFB, 0xFA, 0xF9, 0xF8, 0xF7, 0xF6,
0xF5, 0xF4, 0xF2, 0xF1, 0xF0, 0xEE, 0xEC, 0xEB, 0xE9, 0xE7, 0xE6, 0xE4, 0xE2, 0xE0, 0xDE, 0xDB, 0xD9, 0xD7, 0xD5, 0xD2,
0xD0, 0xCE, 0xCB, 0xC9, 0xC6, 0xC3, 0xC1, 0xBE, 0xBB, 0xB9, 0xB6, 0xB3, 0xB0, 0xAD, 0xAA, 0xA7, 0xA4, 0xA1, 0x9E, 0x9B,
0x98, 0x95, 0x92, 0x8F, 0x8C, 0x89, 0x86, 0x83, 0x80, 0x7C, 0x79, 0x76, 0x73, 0x70, 0x6D, 0x6A, 0x67, 0x64, 0x61, 0x5E, 0x5B,
0x58, 0x55, 0x52, 0x4F, 0x4C, 0x49, 0x46, 0x44, 0x41, 0x3E, 0x3C, 0x39, 0x36, 0x34, 0x31, 0x2F, 0x2D, 0x2A, 0x28, 0x26, 0x24,
0x21, 0x1F, 0x1D, 0x1B, 0x19, 0x18, 0x16, 0x14, 0x13, 0x11, 0xF, 0xE, 0xD, 0xB, 0xA, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x4, 0x3,
0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x3, 0x4, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB,
0xD, 0xE, 0xF, 0x11, 0x13, 0x14, 0x16, 0x18, 0x19, 0x1B, 0x1D, 0x1F, 0x21, 0x24, 0x26, 0x28, 0x2A, 0x2D, 0x2F, 0x31, 0x34,
0x36, 0x39, 0x3C, 0x3E, 0x41, 0x44, 0x46, 0x49, 0x4C, 0x4F, 0x52, 0x55, 0x58, 0x5B, 0x5E, 0x61, 0x64, 0x67, 0x6A, 0x6D,
0x70, 0x73, 0x76, 0x79, 0x7C
};
void i2sInit()
{
i2s_config_t i2s_config = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN),
.sample_rate = I2S_SAMPLE_RATE, // The format of the signal using ADC_BUILT_IN
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, // is fixed at 12bit, stereo, MSB
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, // I2S_CHANNEL_FMT_ONLY_LEFT I2S_CHANNEL_FMT_RIGHT_LEFT ****************************************
.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_STAND_I2S | 0x01),
.intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,
.dma_buf_count = 8,
.dma_buf_len = 64,
.use_apll = false,
.tx_desc_auto_clear = false,
.fixed_mclk = 0
};
i2s_driver_install(I2S_NUM_0, &i2s_config, 0, NULL); //install and start i2s driver
i2s_set_pin(I2S_NUM_0,NULL); // for internal DAC
i2s_set_dac_mode(I2S_DAC_CHANNEL_DISABLE); // disable ambos canales este si funciona
//i2s_set_dac_mode(I2S_DAC_CHANNEL_RIGHT_EN); // DAC_1 RIGHT es el DAC_1
i2s_set_dac_mode(I2S_DAC_CHANNEL_LEFT_EN); // de esta forma tengo solo salida en el DAC_2
}
void setup() {
// Initialize the I2S peripheral
i2sInit();
}
void loop() {
// i2s bytes-written variable
size_t bytesOut;
// output the buffer
while( true )
{
i2s_write( I2S_NUM_0, WaveFormTable, Num_Samples, &bytesOut, portMAX_DELAY );
}
}