Skip to content

Instantly share code, notes, and snippets.

@amotl
Last active April 15, 2022 15:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save amotl/f0640bdab95453ae652ffd0c2f8fbd7f to your computer and use it in GitHub Desktop.
Save amotl/f0640bdab95453ae652ffd0c2f8fbd7f to your computer and use it in GitHub Desktop.
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> // https://www.arduino.cc/en/Reference/I2S .. 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.
I2S.read(I2Sbuffer, 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()");
I2S.read(); // 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()");
Serial.flush();
}
void blink(int speed)
{
digitalWrite(REDLED, HIGH);
delay(speed);
digitalWrite(REDLED, LOW);
delay(speed);
}
void setup()
{
I2S.onReceive(onI2SReceive);
pinMode(REDLED, OUTPUT);
delay(10000); // to allow me to set the serial console.
Serial.begin(9600);
Serial.println(F("Starting"));
}
void loop()
{
blink(50);
get_audiodata();
blink(500);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment