forked from W4D/soundcube-firmware
Merge branch 'main' of https://code.w4d.dev/W4D/soundcube-firmware
This commit is contained in:
125
soundcube-i2s-test/soundcube-i2s-test.ino
Normal file
125
soundcube-i2s-test/soundcube-i2s-test.ino
Normal file
@ -0,0 +1,125 @@
|
||||
/*
|
||||
I2S bi-directional input and output buffered loopback example
|
||||
Released to the Public Domain by Cooper Dalrymple
|
||||
*/
|
||||
#include <Wire.h>
|
||||
#include <I2S.h>
|
||||
|
||||
I2S i2s(INPUT_PULLUP);
|
||||
|
||||
#define SIZE 256
|
||||
int16_t buffer[SIZE];
|
||||
|
||||
void cw(char first, char second){
|
||||
Wire1.beginTransmission(0x18);
|
||||
Wire1.write(first);
|
||||
Wire1.write(second);
|
||||
Wire1.endTransmission();
|
||||
delay(5);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
|
||||
delay(1000);
|
||||
|
||||
Wire1.setSDA(2);
|
||||
Wire1.setSCL(3);
|
||||
Wire1.begin();
|
||||
|
||||
delay(1000);
|
||||
|
||||
// GENERAL
|
||||
cw(0x00, 0x00);
|
||||
cw(0x01, 0x01);
|
||||
cw(0x1b, 0x10); // select I2S
|
||||
|
||||
// ADC
|
||||
cw(0x00, 0x00); // select page 0
|
||||
//cw(0x01, 0x01); // soft reset
|
||||
cw(0x12, 0x87); // NADC 7
|
||||
cw(0x13, 0x82); // MADC 2
|
||||
cw(0x14, 0x80); // OSR ADC 128
|
||||
cw(0x3d, 0x01); // ADC PRB_R1
|
||||
|
||||
cw(0x00, 0x01); // select page 1
|
||||
cw(0x01, 0x08); // disable crude AVdd
|
||||
cw(0x02, 0x01); // enable internal AVdd LDO
|
||||
cw(0x0a, 0x0B); // set input CM to 0.9V and LO to 1.65V
|
||||
cw(0x3d, 0x00); // ADC PTM_R4
|
||||
cw(0x34, 0x80); // route IN1L to LEFT_P with 20k input impedance
|
||||
cw(0x36, 0x80); // route CM to LEFT_M with 20k input impedance
|
||||
cw(0x37, 0x80); // route IN1R to RIGHT_P with 20k input impedance
|
||||
cw(0x39, 0x80); // route CM to RIGHT_M with 20k input impedance
|
||||
cw(0x3b, 0x0c); // unmute left MICPGA
|
||||
cw(0x3c, 0x0c); // unmute right MICPGA
|
||||
|
||||
cw(0x00, 0x00); // select page 0
|
||||
cw(0x51, 0xc0); // power up ADC
|
||||
cw(0x51, 0x00); // unmute ADC digital volume control
|
||||
|
||||
// DAC
|
||||
cw(0x00, 0x00); // select page 0
|
||||
//cw(0x01, 0x01); // software reset
|
||||
cw(0x0b, 0x82); // NDAC 2
|
||||
cw(0x0c, 0x87); // MDAC 7
|
||||
cw(0x0d, 0x00); // OSR DAC 128
|
||||
cw(0x0e, 0x80); // OSR DAC 128
|
||||
cw(0x1b, 0x10); // world length 20bits PTM_P4 (highest performance)
|
||||
cw(0x3c, 0x08); // PRB_P8
|
||||
|
||||
cw(0x00, 0x01); // select page 1
|
||||
//cw(0x01, 0x08); // disable internal crude avdd
|
||||
//cw(0x02, 0x01); // enable AVdd LDO
|
||||
cw(0x7b, 0x01); // set REF charging time to 40ms
|
||||
//cw(0x14, 0x25); // set HP soft stepping for anti pop
|
||||
//cw(0x0a, 0x0B); // set input CM to 0.9V and LO to 1.65V
|
||||
cw(0x0e, 0x08); // left DAC reconstruction filter routed to LOL
|
||||
cw(0x0f, 0x08); // right DAC reconstruction filter routed to LOR
|
||||
cw(0x03, 0x00); // DAC PTM_P3/4
|
||||
cw(0x04, 0x00); // DAC PTM_P3/4
|
||||
cw(0x12, 0x00); // LOL gain 0dB
|
||||
cw(0x13, 0x00); // LOR gain 0dB
|
||||
delay(1000);
|
||||
|
||||
cw(0x00, 0x00); // select page 0
|
||||
cw(0x3f, 0xd6); // power up and route left digital audio to left dac channel and right to right
|
||||
cw(0x40, 0x00); // unmute DAC digital volume
|
||||
|
||||
|
||||
pinMode(19, OUTPUT); // MCLK enable
|
||||
pinMode(20, OUTPUT); // CODEC reset
|
||||
|
||||
i2s.setSysClk(48000);
|
||||
|
||||
i2s.setDOUT(14);
|
||||
i2s.setDIN(15);
|
||||
i2s.setBCLK(16); // Note: LRCLK = BCLK + 1
|
||||
i2s.setMCLK(18);
|
||||
i2s.swapClocks();
|
||||
i2s.setBitsPerSample(16);
|
||||
i2s.setFrequency(48000);
|
||||
i2s.setMCLKmult(128); // 6144000Hz 6.144MHz
|
||||
|
||||
i2s.setBuffers(6, SIZE * sizeof(int16_t) / sizeof(uint32_t));
|
||||
|
||||
digitalWrite(19, HIGH); // enable MCLK
|
||||
digitalWrite(20, HIGH);
|
||||
i2s.begin();
|
||||
|
||||
size_t count, index;
|
||||
while (1) {
|
||||
count = i2s.read((uint8_t *)&buffer, SIZE * sizeof(int16_t)) * sizeof(uint32_t) / sizeof(int16_t);
|
||||
index = 0;
|
||||
while (index < count) {
|
||||
// Reduce volume by half
|
||||
buffer[index++] >>= 1; // right
|
||||
buffer[index++] >>= 1; // left
|
||||
}
|
||||
i2s.write((const uint8_t *)&buffer, count * sizeof(int16_t));
|
||||
}
|
||||
}
|
||||
|
||||
void loop() {
|
||||
/* Nothing here */
|
||||
}
|
||||
Reference in New Issue
Block a user