Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Basic audio recorder for ARM Cortex-M0 and ICS43432 I2S microphone
* Basic I2S recorder
* Based on wjmb's Feather M0 Beehive LoRa code
* Minimum example for trying to reproduce problems when
* reading the ICS43432 using I2S without using TTN at all.
* License: GPL
#include <I2S.h> // .. part of "Adafruit SAMD Boards"
#define REDLED 13
#define SAMPLE_RATE 12500 // max freq detectable is half of this according to Nyquist
#define DATA_SIZE 1024 // needs to be a multiple of 64.
// I2S variables.
uint32_t I2Sbuffer[512];
volatile int I2Savailable = 0;
void onI2SReceive()
// This function will run at a frequency of (sampleRate / 64). At 3.125khz, this is every 20 ms
// so make sure this is called again within that time if a contiguous set of data is needed., 512);
I2Savailable = 1;
void get_audiosample(int16_t *sampledata)
while (!I2Savailable); // wait until data is available again.
int *values = (int *) I2Sbuffer;
for (int i=0; i<64; i++)
sampledata[i] = values[(2*i) + 1] >> 14;
I2Savailable = 0;
void get_audiodata()
if (!I2S.begin(I2S_PHILIPS_MODE, SAMPLE_RATE, 32)) {
Serial.println("Failed to initialize I2S!");
while (1); // do nothing
Serial.println("begin()");; // apparently this get things going.
delay(800); // For startup/softunmute, this seems a safe minimal amount of time (at 12500 Hz sample rate)
int16_t data[DATA_SIZE];
for (int j=0; j<DATA_SIZE/64; j++) get_audiosample(&data[j*64]); // collect data .. 64 values at the time.
//for (int j=0; j<DATA_SIZE; j++) Serial.println(data[j]);
Serial.println("Before end()");
I2S.end(); // TODO: this is where is hangs the second time this function was called !!!
Serial.println("After end()");
void blink(int speed)
digitalWrite(REDLED, HIGH);
digitalWrite(REDLED, LOW);
void setup()
delay(10000); // to allow me to set the serial console.
void loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.