Adding I2S BFF code.
This commit is contained in:
parent
9caf603693
commit
ca7e16fcd8
8 changed files with 4570 additions and 0 deletions
|
|
@ -0,0 +1,72 @@
|
|||
// SPDX-FileCopyrightText: 2023 Ladyada for Adafruit Industries
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
/*
|
||||
This example plays a 'raw' PCM file from memory to I2S
|
||||
*/
|
||||
|
||||
#include <I2S.h>
|
||||
|
||||
#include "startup.h" // audio file in flash
|
||||
|
||||
// Create the I2S port using a PIO state machine
|
||||
I2S i2s(OUTPUT);
|
||||
|
||||
// GPIO pin numbers
|
||||
#define pBCLK A2 // QT Py BFF default BITCLOCK
|
||||
#define pWS A1 // QT Py BFF default LRCLOCK
|
||||
#define pDOUT A0 // QT Py BFF default DATA
|
||||
|
||||
#define USERBUTTON 21 // QT Py RP2040 built in button
|
||||
|
||||
// variable shared between cores
|
||||
volatile bool playaudio = false;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
//while (!Serial) delay(10);
|
||||
Serial.println("I2S playback demo");
|
||||
|
||||
pinMode(USERBUTTON, INPUT_PULLUP);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
// on button press tell the other core to play audio clip!
|
||||
if (!digitalRead(USERBUTTON)) {
|
||||
playaudio = true;
|
||||
} else {
|
||||
playaudio = false;
|
||||
}
|
||||
}
|
||||
|
||||
void setup1() {
|
||||
i2s.setBCLK(pBCLK);
|
||||
i2s.setDATA(pDOUT);
|
||||
i2s.setBitsPerSample(16);
|
||||
}
|
||||
|
||||
void loop1() {
|
||||
// the main loop will tell us when it wants us to play!
|
||||
if (playaudio) {
|
||||
play_i2s(startupAudioData, sizeof(startupAudioData), startupSampleRate);
|
||||
}
|
||||
}
|
||||
|
||||
void play_i2s(const uint8_t *data, uint32_t len, uint32_t rate) {
|
||||
// start I2S at the sample rate with 16-bits per sample
|
||||
if (!i2s.begin(rate)) {
|
||||
Serial.println("Failed to initialize I2S!");
|
||||
delay(500);
|
||||
i2s.end();
|
||||
return;
|
||||
}
|
||||
|
||||
for(uint32_t i=0; i<len; i++) {
|
||||
uint16_t sample = (uint16_t)data[i] << 6; // our data is 10 bit but we want 16 bit so we add some gain
|
||||
// write the same sample twice, once for left and once for the right channel
|
||||
i2s.write(sample);
|
||||
i2s.write(sample);
|
||||
}
|
||||
i2s.end();
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,74 @@
|
|||
// SPDX-FileCopyrightText: 2016 Sandeep Mistry
|
||||
// SPDX-FileCopyrightText: 2022 Earle F. Philhower, III
|
||||
// SPDX-FileCopyrightText: 2023 Ladyada for Adafruit Industries
|
||||
//
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
/*
|
||||
This example generates a square wave based tone at a specified frequency
|
||||
and sample rate. Then outputs the data using the I2S interface to a
|
||||
MAX08357 I2S Amp Breakout board.
|
||||
|
||||
created 17 November 2016
|
||||
by Sandeep Mistry
|
||||
modified for RP2040 by Earle F. Philhower, III <earlephilhower@yahoo.com>
|
||||
|
||||
|
||||
bool setBCLK(pin_size_t pin);
|
||||
- This assigns two adjacent pins - the pin after this one (one greater)
|
||||
is the WS (word select) signal, which toggles before the sample for
|
||||
each channel is sent
|
||||
|
||||
bool setDATA(pin_size_t pin);
|
||||
- Sets the DOUT pin, can be any valid GPIO pin
|
||||
*/
|
||||
|
||||
#include <I2S.h>
|
||||
|
||||
// Create the I2S port using a PIO state machine
|
||||
I2S i2s(OUTPUT);
|
||||
|
||||
// GPIO pin numbers
|
||||
#define pBCLK A2 // QT Py BFF default BITCLOCK
|
||||
#define pWS A1 // QT Py BFF default LRCLOCK
|
||||
#define pDOUT A0 // QT Py BFF default DATA
|
||||
|
||||
const int frequency = 440; // frequency of square wave in Hz
|
||||
const int amplitude = 500; // amplitude of square wave
|
||||
const int sampleRate = 16000; // 16 KHz is a good quality
|
||||
|
||||
const int halfWavelength = (sampleRate / frequency); // half wavelength of square wave
|
||||
|
||||
int16_t sample = amplitude; // current sample value
|
||||
int count = 0;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
while (!Serial) delay(10);
|
||||
Serial.println("I2S simple tone");
|
||||
|
||||
i2s.setBCLK(pBCLK);
|
||||
i2s.setDATA(pDOUT);
|
||||
i2s.setBitsPerSample(16);
|
||||
|
||||
// start I2S at the sample rate with 16-bits per sample
|
||||
if (!i2s.begin(sampleRate)) {
|
||||
Serial.println("Failed to initialize I2S!");
|
||||
while (1); // do nothing
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (count % halfWavelength == 0) {
|
||||
// invert the sample every half wavelength count multiple to generate square wave
|
||||
sample = -1 * sample;
|
||||
}
|
||||
|
||||
// write the same sample twice, once for left and once for the right channel
|
||||
i2s.write(sample);
|
||||
i2s.write(sample);
|
||||
|
||||
// increment the counter for the next sample
|
||||
count++;
|
||||
}
|
||||
28
Adafruit_I2S_BFF/CircuitPython/Tone/code.py
Normal file
28
Adafruit_I2S_BFF/CircuitPython/Tone/code.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries
|
||||
# SPDX-License-Identifier: MIT
|
||||
"""
|
||||
CircuitPython I2S Tone playback example.
|
||||
"""
|
||||
import time
|
||||
import array
|
||||
import math
|
||||
import audiocore
|
||||
import board
|
||||
import audiobusio
|
||||
|
||||
TONE_VOLUME = 0.1 # Increase this to increase the volume of the tone.
|
||||
FREQUENCY = 440 # Set this to the Hz of the tone you want to generate.
|
||||
|
||||
audio = audiobusio.I2SOut(board.A2, board.A1, board.A0)
|
||||
|
||||
length = 8000 // FREQUENCY
|
||||
sine_wave = array.array("h", [0] * length)
|
||||
for i in range(length):
|
||||
sine_wave[i] = int((math.sin(math.pi * 2 * i / length)) * TONE_VOLUME * (2 ** 15 - 1))
|
||||
sine_wave_sample = audiocore.RawSample(sine_wave)
|
||||
|
||||
while True:
|
||||
audio.play(sine_wave_sample, loop=True)
|
||||
time.sleep(1)
|
||||
audio.stop()
|
||||
time.sleep(1)
|
||||
BIN
Adafruit_I2S_BFF/CircuitPython/WAV/booploop.wav
Normal file
BIN
Adafruit_I2S_BFF/CircuitPython/WAV/booploop.wav
Normal file
Binary file not shown.
22
Adafruit_I2S_BFF/CircuitPython/WAV/code.py
Normal file
22
Adafruit_I2S_BFF/CircuitPython/WAV/code.py
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
# SPDX-FileCopyrightText: 2023 Kattni Rembor for Adafruit Industries
|
||||
# SPDX-License-Identifier: MIT
|
||||
"""
|
||||
CircuitPython I2S WAV file playback.
|
||||
"""
|
||||
import audiocore
|
||||
import board
|
||||
import audiobusio
|
||||
|
||||
LOOP = False # Update to True loop WAV playback. False plays once.
|
||||
|
||||
audio = audiobusio.I2SOut(board.A2, board.A1, board.A0)
|
||||
|
||||
with open("chikken.wav", "rb") as wave_file:
|
||||
wav = audiocore.WaveFile(wave_file)
|
||||
|
||||
print("Playing wav file!")
|
||||
audio.play(wav, loop=LOOP)
|
||||
while audio.playing:
|
||||
pass
|
||||
|
||||
print("Done!")
|
||||
Loading…
Reference in a new issue