ESP32: Support I2S-driven ADC sampling
The ESP32 I2S peripheral supports an interesting feature: it can be used to push ADC samples into DMA memory. Currently the ESP32 I2S interface does not allow configuration of the peripheral in this way, though it would only require a little effort.
There is not much configuration available. Besides sample rate and number of bits (already included in the I2S module)
- which ADC peripheral to use
- which ADC channel to use
Proposal:
- create a class similar to the I2S class called
I2SADCfor the ESP32 port - leverage most of the existing code (
machine_i2s_init_helper) for initialization of this new class
Any thoughts? I really would like to see support for this and so will begin work on a PR asap.
esp32: Add I2S peripheral support.
Implementation of hardware I2S for the ESP32.
This appears to be the first I2S implementation for MicroPython. I've followed the proposed I2S machine API mostly, but did not follow it exactly. This is the current API / example code:
import machine
i2s = machine.I2S([0,] bclk=4, ws=15, data_out=2, data_in=22, [samplerate=48000,] [bitdepth=16])
buffer = ... # generate sine wave or something
while True:
i2s.write(buffer)
# also implemented
i2s.deinit()
i2s.init(...) # throws an error if initialized already
Not yet implemented, mostly due to lacking hardware:
- communication format, e.g. MSB/LSB.
- clock: the ESP32 has an APLL clock, but I'm not sure what it's purpose is
- callbacks (for now,
i2s.write()blocks if the buffer is full) - reading from the I2S bus
- not setting the
data_inpin (not sure if this is possible) - change parameters
- stop/start (without deinit) - by default it keeps looping existing data if the buffer isn't filled fast enough
- internal ADC
Which of these (if any) should be implemented before it can be merged?
Documentation: https://esp-idf.readthedocs.io/en/latest/api-reference/peripherals/i2s.html