diff --git a/rp2040-USB-I2S-speaker/rp2040-USB-I2S-speaker.ino b/rp2040-USB-I2S-speaker/rp2040-USB-I2S-speaker.ino new file mode 100644 index 0000000000000000000000000000000000000000..b8e4cfdb7639d18f3cf0a102b0b89bcf6b2f72a9 --- /dev/null +++ b/rp2040-USB-I2S-speaker/rp2040-USB-I2S-speaker.ino @@ -0,0 +1,51 @@ +#include <Adafruit_TinyUSB.h> +#include <I2S.h> + +#define I2S_CLK 1 +#define I2S_FRAME (I2S_CLK+1) +#define I2S_DATA 4 +#define SAMPLE_RATE 44100 +#define SAMPLE_BITS 16 + +Adafruit_USBD_Audio usb; + +I2S i2s(OUTPUT); + +size_t writeCB(const uint8_t* data, size_t len, Adafruit_USBD_Audio& ref) { + int16_t* data16 = (int16_t*)data; + + size_t n_written = i2s.write(data, len); + + // returns the amount written (and convert to bytes) + return n_written * 2 * sizeof(int16_t); +} + +void setup() { + // init USB + if (!TinyUSBDevice.isInitialized()) { + TinyUSBDevice.begin(0); + } + + Serial.begin(115200); + + // reconfigure USB + usb.setWriteCallback(writeCB); + usb.begin(SAMPLE_RATE, 2, SAMPLE_BITS); + if (TinyUSBDevice.mounted()) { + TinyUSBDevice.detach(); + delay(10); + TinyUSBDevice.attach(); + } + + // start I2S + i2s.setBCLK(I2S_CLK); + i2s.setDATA(I2S_DATA); + i2s.setBitsPerSample(SAMPLE_BITS); + i2s.begin(SAMPLE_RATE); +} + +void loop() { + #ifdef TINYUSB_NEED_POLLING_TASK + TinyUSBDevice.task(); + #endif +}