@@ -35,7 +35,9 @@ I2SClass::I2SClass(uint8_t deviceIndex, uint8_t clockGenerator, uint8_t sdPin, u
35
35
_sckPin(sckPin),
36
36
_fsPin(fsPin),
37
37
38
+ _state(I2S_STATE_IDLE),
38
39
_dmaChannel(-1 ),
40
+ _bitsPerSample(0 ),
39
41
_dmaTransferInProgress(false ),
40
42
41
43
_onTransmit(NULL )
@@ -44,6 +46,10 @@ I2SClass::I2SClass(uint8_t deviceIndex, uint8_t clockGenerator, uint8_t sdPin, u
44
46
45
47
int I2SClass::begin (int mode, long sampleRate, int bitsPerSample)
46
48
{
49
+ if (_state != I2S_STATE_IDLE) {
50
+ return 1 ;
51
+ }
52
+
47
53
switch (mode) {
48
54
case I2S_PHILIPS_MODE:
49
55
break ;
@@ -56,6 +62,7 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample)
56
62
case 8 :
57
63
case 16 :
58
64
case 32 :
65
+ _bitsPerSample = bitsPerSample;
59
66
break ;
60
67
61
68
default :
@@ -92,18 +99,10 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample)
92
99
93
100
i2sd.setSlotAdjustedLeft (_deviceIndex);
94
101
i2sd.setClockUnit (_deviceIndex);
95
- i2sd.setTxMode (_deviceIndex);
96
102
97
103
pinPeripheral (_sdPin, PIO_COM);
98
104
99
105
i2sd.enable ();
100
- i2sd.enableClockUnit (_deviceIndex);
101
- i2sd.enableSerializer (_deviceIndex);
102
-
103
- DMA.incSrc (_dmaChannel);
104
- DMA.onTransferComplete (_dmaChannel, I2SClass::onDmaTransferComplete);
105
- DMA.setTriggerSource (_dmaChannel, i2sd.dmaTriggerSource (_deviceIndex));
106
- DMA.setTransferWidth (_dmaChannel, bitsPerSample);
107
106
108
107
_doubleBuffer.reset ();
109
108
@@ -116,6 +115,7 @@ void I2SClass::end()
116
115
DMA.freeChannel (_dmaChannel);
117
116
}
118
117
118
+ _state = I2S_STATE_IDLE;
119
119
_dmaTransferInProgress = false ;
120
120
121
121
i2sd.disableSerializer (_deviceIndex);
@@ -139,12 +139,26 @@ void I2SClass::end()
139
139
140
140
int I2SClass::available ()
141
141
{
142
- return 0 ;
142
+ if (_state != I2S_STATE_RECEIVER) {
143
+ enableReceiver ();
144
+ }
145
+
146
+ return (_bitsPerSample / 8 );
143
147
}
144
148
145
149
int I2SClass::read ()
146
150
{
147
- return 0 ;
151
+ if (_state != I2S_STATE_RECEIVER) {
152
+ enableReceiver ();
153
+ }
154
+
155
+ while (!i2sd.rxReady (_deviceIndex));
156
+
157
+ int sample = i2sd.readData (_deviceIndex);
158
+
159
+ i2sd.clearRxReady (_deviceIndex);
160
+
161
+ return sample;
148
162
}
149
163
150
164
int I2SClass::peek ()
@@ -168,6 +182,10 @@ size_t I2SClass::write(const uint8_t *buffer, size_t size)
168
182
169
183
size_t I2SClass::availableForWrite ()
170
184
{
185
+ if (_state != I2S_STATE_TRANSMITTER) {
186
+ enableTransmitter ();
187
+ }
188
+
171
189
uint8_t enableInterrupts = ((__get_PRIMASK () & 0x1 ) == 0 );
172
190
size_t space;
173
191
@@ -191,6 +209,10 @@ size_t I2SClass::write(int sample)
191
209
192
210
size_t I2SClass::write (int32_t sample)
193
211
{
212
+ if (_state != I2S_STATE_TRANSMITTER) {
213
+ enableTransmitter ();
214
+ }
215
+
194
216
while (!i2sd.txReady (_deviceIndex));
195
217
196
218
i2sd.writeData (_deviceIndex, sample);
@@ -202,6 +224,10 @@ size_t I2SClass::write(int32_t sample)
202
224
203
225
size_t I2SClass::write (const void *buffer, size_t size)
204
226
{
227
+ if (_state != I2S_STATE_TRANSMITTER) {
228
+ enableTransmitter ();
229
+ }
230
+
205
231
uint8_t enableInterrupts = ((__get_PRIMASK () & 0x1 ) == 0 );
206
232
size_t written;
207
233
@@ -231,7 +257,8 @@ void I2SClass::onTransmit(void(*function)(void))
231
257
_onTransmit = function;
232
258
}
233
259
234
- void I2SClass::enableClock (int divider) {
260
+ void I2SClass::enableClock (int divider)
261
+ {
235
262
while (GCLK->STATUS .bit .SYNCBUSY );
236
263
GCLK->GENDIV .bit .ID = _clockGenerator;
237
264
GCLK->GENDIV .bit .DIV = SystemCoreClock / divider;
@@ -250,7 +277,8 @@ void I2SClass::enableClock(int divider) {
250
277
while (GCLK->STATUS .bit .SYNCBUSY );
251
278
}
252
279
253
- void I2SClass::disableClock () {
280
+ void I2SClass::disableClock ()
281
+ {
254
282
while (GCLK->STATUS .bit .SYNCBUSY );
255
283
GCLK->GENCTRL .bit .ID = _clockGenerator;
256
284
GCLK->GENCTRL .bit .SRC = GCLK_GENCTRL_SRC_DFLL48M_Val;
@@ -265,6 +293,34 @@ void I2SClass::disableClock() {
265
293
while (GCLK->STATUS .bit .SYNCBUSY );
266
294
}
267
295
296
+ void I2SClass::enableTransmitter ()
297
+ {
298
+ i2sd.setTxMode (_deviceIndex);
299
+ i2sd.enableClockUnit (_deviceIndex);
300
+ i2sd.enableSerializer (_deviceIndex);
301
+
302
+ DMA.incSrc (_dmaChannel);
303
+ DMA.onTransferComplete (_dmaChannel, I2SClass::onDmaTransferComplete);
304
+ DMA.setTriggerSource (_dmaChannel, i2sd.dmaTriggerSource (_deviceIndex));
305
+ DMA.setTransferWidth (_dmaChannel, _bitsPerSample);
306
+
307
+ _state = I2S_STATE_TRANSMITTER;
308
+ }
309
+
310
+ void I2SClass::enableReceiver ()
311
+ {
312
+ i2sd.setRxMode (_deviceIndex);
313
+ i2sd.enableClockUnit (_deviceIndex);
314
+ i2sd.enableSerializer (_deviceIndex);
315
+
316
+ DMA.incSrc (_dmaChannel);
317
+ DMA.onTransferComplete (_dmaChannel, I2SClass::onDmaTransferComplete);
318
+ DMA.setTriggerSource (_dmaChannel, i2sd.dmaTriggerSource (_deviceIndex));
319
+ DMA.setTransferWidth (_dmaChannel, _bitsPerSample);
320
+
321
+ _state = I2S_STATE_RECEIVER;
322
+ }
323
+
268
324
void I2SClass::onTransferComplete (void )
269
325
{
270
326
if (_doubleBuffer.available ()) {
0 commit comments