Skip to content

Commit 36fd799

Browse files
committed
add I2S slave mode support
1 parent 6b39bdf commit 36fd799

File tree

3 files changed

+41
-2
lines changed

3 files changed

+41
-2
lines changed

libraries/I2S/src/I2S.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ I2SClass::I2SClass(uint8_t deviceIndex, uint8_t clockGenerator, uint8_t sdPin, u
4646
}
4747

4848
int I2SClass::begin(int mode, long sampleRate, int bitsPerSample)
49+
{
50+
return begin(mode, sampleRate, bitsPerSample, true);
51+
}
52+
53+
int I2SClass::begin(int mode, int bitsPerSample)
54+
{
55+
return begin(mode, 0, bitsPerSample, false);
56+
}
57+
58+
int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, bool driveClock)
4959
{
5060
if (_state != I2S_STATE_IDLE) {
5161
return 1;
@@ -88,7 +98,15 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample)
8898

8999
_beginCount++;
90100

91-
enableClock(sampleRate * 2 * bitsPerSample);
101+
if (driveClock) {
102+
enableClock(sampleRate * 2 * bitsPerSample);
103+
104+
i2sd.setSerialClockSelectMasterClockDiv(_deviceIndex);
105+
i2sd.setFrameSyncSelectSerialClockDiv(_deviceIndex);
106+
} else {
107+
i2sd.setSerialClockSelectPin(_deviceIndex);
108+
i2sd.setFrameSyncSelectPin(_deviceIndex);
109+
}
92110

93111
i2sd.disable();
94112
i2sd.set1BitDelay(_deviceIndex);
@@ -99,7 +117,9 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample)
99117
pinPeripheral(_fsPin, PIO_COM);
100118

101119
i2sd.setSlotAdjustedLeft(_deviceIndex);
102-
i2sd.setClockUnit(_deviceIndex);
120+
if (driveClock) {
121+
i2sd.setClockUnit(_deviceIndex);
122+
}
103123

104124
pinPeripheral(_sdPin, PIO_COM);
105125

libraries/I2S/src/I2S.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class I2SClass : public Stream
3333
I2SClass(uint8_t deviceIndex, uint8_t clockGenerator, uint8_t sdPin, uint8_t sckPin, uint8_t fsPin);
3434

3535
int begin(int mode, long sampleRate, int bitsPerSample);
36+
int begin(int mode, int bitsPerSample);
3637
void end();
3738

3839
// from Stream
@@ -57,6 +58,8 @@ class I2SClass : public Stream
5758
void onReceive(void(*)(void));
5859

5960
private:
61+
int begin(int mode, long sampleRate, int bitsPerSample, bool driveClock);
62+
6063
void enableClock(int divider);
6164
void disableClock();
6265

libraries/I2S/src/utility/SAMD21_I2SDevice.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,22 @@ class I2SDevice_SAMD21G18x {
4747
return (index == 0) ? I2S_GCLK_ID_0 : I2S_GCLK_ID_1;
4848
}
4949

50+
inline void setSerialClockSelectMasterClockDiv(int index) {
51+
i2s.CLKCTRL[index].bit.SCKSEL = I2S_CLKCTRL_SCKSEL_MCKDIV_Val;
52+
}
53+
54+
inline void setSerialClockSelectPin(int index) {
55+
i2s.CLKCTRL[index].bit.SCKSEL = I2S_CLKCTRL_SCKSEL_SCKPIN_Val;
56+
}
57+
58+
inline void setFrameSyncSelectSerialClockDiv(int index) {
59+
i2s.CLKCTRL[index].bit.FSSEL = I2S_CLKCTRL_FSSEL_SCKDIV_Val;
60+
}
61+
62+
inline void setFrameSyncSelectPin(int index) {
63+
i2s.CLKCTRL[index].bit.FSSEL = I2S_CLKCTRL_FSSEL_FSPIN_Val;
64+
}
65+
5066
inline void set1BitDelay(int index) {
5167
i2s.CLKCTRL[index].bit.BITDELAY = I2S_CLKCTRL_BITDELAY_I2S_Val;
5268
}

0 commit comments

Comments
 (0)