Skip to content

Commit 0305051

Browse files
committed
writing works consistently
1 parent 26ff2d9 commit 0305051

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

libraries/I2S/src/I2S.cpp

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ I2SClass::I2SClass(SERCOM *p_sercom, uint8_t uc_index, uint8_t uc_pinSD, uint8_t
1414

1515
int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock)
1616
{
17+
switch (mode) {
18+
case I2S_PHILIPS_MODE:
19+
break;
20+
21+
case I2S_RIGHT_JUSTIFIED_MODE:
22+
case I2S_LEFT_JUSTIFIED_MODE:
23+
case I2S_DSP_MODE:
24+
default:
25+
Serial.println("invalid mode");
26+
return 1;
27+
}
28+
1729
switch (bitsPerSample) {
1830
case 8:
1931
case 16:
@@ -22,38 +34,36 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
2234
break;
2335

2436
default:
37+
Serial.println("invalid bits per sample");
2538
return 1;
2639
}
2740

41+
while(_i2s->SYNCBUSY.bit.SWRST);
42+
_i2s->CTRLA.bit.SWRST = 1;
43+
2844
PM->APBCMASK.reg |= PM_APBCMASK_I2S;
2945

3046
while (GCLK->STATUS.bit.SYNCBUSY);
31-
3247
GCLK->GENDIV.bit.ID = GCLK_CLKCTRL_GEN_GCLK3_Val;
3348
GCLK->GENDIV.bit.DIV = SystemCoreClock / (sampleRate * 2 * bitsPerSample);
3449

35-
Serial.println(GCLK->GENDIV.bit.DIV);
36-
3750
while (GCLK->STATUS.bit.SYNCBUSY);
38-
3951
GCLK->GENCTRL.bit.ID = GCLK_CLKCTRL_GEN_GCLK3_Val;
4052
GCLK->GENCTRL.bit.SRC = GCLK_GENCTRL_SRC_DFLL48M_Val;
4153
GCLK->GENCTRL.bit.IDC = 1;
4254
GCLK->GENCTRL.bit.GENEN = 1;
4355

4456
while (GCLK->STATUS.bit.SYNCBUSY);
45-
4657
GCLK->CLKCTRL.bit.ID = (_uc_index == 0) ? I2S_GCLK_ID_0 : I2S_GCLK_ID_1;
4758
GCLK->CLKCTRL.bit.GEN = GCLK_CLKCTRL_GEN_GCLK3_Val;
4859
GCLK->CLKCTRL.bit.CLKEN = 1;
4960

5061
while (GCLK->STATUS.bit.SYNCBUSY);
5162

5263
while(_i2s->SYNCBUSY.bit.ENABLE);
53-
5464
_i2s->CTRLA.bit.ENABLE = 0;
5565

56-
// TODO: change these based on mode
66+
// TODO: change these based on mode and drive clock
5767
_i2s->CLKCTRL[_uc_index].bit.MCKOUTINV = 0;
5868
_i2s->CLKCTRL[_uc_index].bit.SCKOUTINV = 0;
5969
_i2s->CLKCTRL[_uc_index].bit.FSOUTINV = 0;
@@ -103,8 +113,8 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
103113
_i2s->SERCTRL[_uc_index].bit.SLOTDIS7 = 0;
104114
_i2s->SERCTRL[_uc_index].bit.BITREV = I2S_SERCTRL_BITREV_MSBIT_Val;
105115
_i2s->SERCTRL[_uc_index].bit.WORDADJ = I2S_SERCTRL_WORDADJ_RIGHT_Val;
106-
_i2s->SERCTRL[_uc_index].bit.SLOTADJ = I2S_SERCTRL_SLOTADJ_RIGHT_Val;
107-
_i2s->SERCTRL[_uc_index].bit.TXSAME = I2S_SERCTRL_TXSAME_SAME_Val; //I2S_SERCTRL_TXSAME_ZERO_Val;
116+
_i2s->SERCTRL[_uc_index].bit.SLOTADJ = I2S_SERCTRL_SLOTADJ_LEFT_Val;
117+
_i2s->SERCTRL[_uc_index].bit.TXSAME = I2S_SERCTRL_TXSAME_ZERO_Val; // I2S_SERCTRL_TXSAME_SAME_Val
108118
_i2s->SERCTRL[_uc_index].bit.CLKSEL = (_uc_index == 0) ? I2S_SERCTRL_CLKSEL_CLK0_Val : I2S_SERCTRL_CLKSEL_CLK1_Val;
109119
_i2s->SERCTRL[_uc_index].bit.SERMODE = I2S_SERCTRL_SERMODE_TX_Val;
110120
_i2s->SERCTRL[_uc_index].bit.TXDEFAULT = I2S_SERCTRL_TXDEFAULT_ZERO_Val;
@@ -132,24 +142,19 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
132142
pinPeripheral(_uc_sd, PIO_COM);
133143

134144
while(_i2s->SYNCBUSY.bit.ENABLE);
135-
136145
_i2s->CTRLA.bit.ENABLE = 1;
137146

138147
if (_uc_index == 0) {
139148
while(_i2s->SYNCBUSY.bit.CKEN0);
140-
141149
_i2s->CTRLA.bit.CKEN0 = 1;
142150

143151
while(_i2s->SYNCBUSY.bit.SEREN0);
144-
145152
_i2s->CTRLA.bit.SEREN0 = 1;
146153
} else {
147-
while(_i2s->SYNCBUSY.bit.SEREN0);
148-
154+
while(_i2s->SYNCBUSY.bit.CKEN1);
149155
_i2s->CTRLA.bit.CKEN1 = 1;
150156

151157
while(_i2s->SYNCBUSY.bit.SEREN1);
152-
153158
_i2s->CTRLA.bit.SEREN1 = 1;
154159
}
155160

@@ -183,14 +188,10 @@ void I2SClass::flush()
183188
size_t I2SClass::write(uint8_t data)
184189
{
185190
if (_uc_index == 0) {
186-
_i2s->INTFLAG.bit.TXUR0 = 1;
187-
188-
while (_i2s->INTFLAG.bit.TXRDY0);
191+
while (!_i2s->INTFLAG.bit.TXRDY0);
189192
while (_i2s->SYNCBUSY.bit.DATA0);
190193
} else {
191-
_i2s->INTFLAG.bit.TXUR1 = 1;
192-
193-
while (_i2s->INTFLAG.bit.TXRDY1);
194+
while (!_i2s->INTFLAG.bit.TXRDY1);
194195
while (_i2s->SYNCBUSY.bit.DATA1);
195196
}
196197

libraries/I2S/src/I2S.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class I2SClass : public Stream
4141
void onTransmit(void(*)(void));
4242

4343
private:
44-
I2s *_i2s = I2S;
44+
volatile I2s *_i2s = I2S;
4545

4646
SERCOM *_p_sercom;
4747
uint8_t _uc_index;

0 commit comments

Comments
 (0)