@@ -14,6 +14,18 @@ I2SClass::I2SClass(SERCOM *p_sercom, uint8_t uc_index, uint8_t uc_pinSD, uint8_t
14
14
15
15
int I2SClass::begin (int mode, long sampleRate, int bitsPerSample, int driveClock)
16
16
{
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
+
17
29
switch (bitsPerSample) {
18
30
case 8 :
19
31
case 16 :
@@ -22,38 +34,36 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
22
34
break ;
23
35
24
36
default :
37
+ Serial.println (" invalid bits per sample" );
25
38
return 1 ;
26
39
}
27
40
41
+ while (_i2s->SYNCBUSY .bit .SWRST );
42
+ _i2s->CTRLA .bit .SWRST = 1 ;
43
+
28
44
PM->APBCMASK .reg |= PM_APBCMASK_I2S;
29
45
30
46
while (GCLK->STATUS .bit .SYNCBUSY );
31
-
32
47
GCLK->GENDIV .bit .ID = GCLK_CLKCTRL_GEN_GCLK3_Val;
33
48
GCLK->GENDIV .bit .DIV = SystemCoreClock / (sampleRate * 2 * bitsPerSample);
34
49
35
- Serial.println (GCLK->GENDIV .bit .DIV );
36
-
37
50
while (GCLK->STATUS .bit .SYNCBUSY );
38
-
39
51
GCLK->GENCTRL .bit .ID = GCLK_CLKCTRL_GEN_GCLK3_Val;
40
52
GCLK->GENCTRL .bit .SRC = GCLK_GENCTRL_SRC_DFLL48M_Val;
41
53
GCLK->GENCTRL .bit .IDC = 1 ;
42
54
GCLK->GENCTRL .bit .GENEN = 1 ;
43
55
44
56
while (GCLK->STATUS .bit .SYNCBUSY );
45
-
46
57
GCLK->CLKCTRL .bit .ID = (_uc_index == 0 ) ? I2S_GCLK_ID_0 : I2S_GCLK_ID_1;
47
58
GCLK->CLKCTRL .bit .GEN = GCLK_CLKCTRL_GEN_GCLK3_Val;
48
59
GCLK->CLKCTRL .bit .CLKEN = 1 ;
49
60
50
61
while (GCLK->STATUS .bit .SYNCBUSY );
51
62
52
63
while (_i2s->SYNCBUSY .bit .ENABLE );
53
-
54
64
_i2s->CTRLA .bit .ENABLE = 0 ;
55
65
56
- // TODO: change these based on mode
66
+ // TODO: change these based on mode and drive clock
57
67
_i2s->CLKCTRL [_uc_index].bit .MCKOUTINV = 0 ;
58
68
_i2s->CLKCTRL [_uc_index].bit .SCKOUTINV = 0 ;
59
69
_i2s->CLKCTRL [_uc_index].bit .FSOUTINV = 0 ;
@@ -103,8 +113,8 @@ int I2SClass::begin(int mode, long sampleRate, int bitsPerSample, int driveClock
103
113
_i2s->SERCTRL [_uc_index].bit .SLOTDIS7 = 0 ;
104
114
_i2s->SERCTRL [_uc_index].bit .BITREV = I2S_SERCTRL_BITREV_MSBIT_Val;
105
115
_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
108
118
_i2s->SERCTRL [_uc_index].bit .CLKSEL = (_uc_index == 0 ) ? I2S_SERCTRL_CLKSEL_CLK0_Val : I2S_SERCTRL_CLKSEL_CLK1_Val;
109
119
_i2s->SERCTRL [_uc_index].bit .SERMODE = I2S_SERCTRL_SERMODE_TX_Val;
110
120
_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
132
142
pinPeripheral (_uc_sd, PIO_COM);
133
143
134
144
while (_i2s->SYNCBUSY .bit .ENABLE );
135
-
136
145
_i2s->CTRLA .bit .ENABLE = 1 ;
137
146
138
147
if (_uc_index == 0 ) {
139
148
while (_i2s->SYNCBUSY .bit .CKEN0 );
140
-
141
149
_i2s->CTRLA .bit .CKEN0 = 1 ;
142
150
143
151
while (_i2s->SYNCBUSY .bit .SEREN0 );
144
-
145
152
_i2s->CTRLA .bit .SEREN0 = 1 ;
146
153
} else {
147
- while (_i2s->SYNCBUSY .bit .SEREN0 );
148
-
154
+ while (_i2s->SYNCBUSY .bit .CKEN1 );
149
155
_i2s->CTRLA .bit .CKEN1 = 1 ;
150
156
151
157
while (_i2s->SYNCBUSY .bit .SEREN1 );
152
-
153
158
_i2s->CTRLA .bit .SEREN1 = 1 ;
154
159
}
155
160
@@ -183,14 +188,10 @@ void I2SClass::flush()
183
188
size_t I2SClass::write (uint8_t data)
184
189
{
185
190
if (_uc_index == 0 ) {
186
- _i2s->INTFLAG .bit .TXUR0 = 1 ;
187
-
188
- while (_i2s->INTFLAG .bit .TXRDY0 );
191
+ while (!_i2s->INTFLAG .bit .TXRDY0 );
189
192
while (_i2s->SYNCBUSY .bit .DATA0 );
190
193
} else {
191
- _i2s->INTFLAG .bit .TXUR1 = 1 ;
192
-
193
- while (_i2s->INTFLAG .bit .TXRDY1 );
194
+ while (!_i2s->INTFLAG .bit .TXRDY1 );
194
195
while (_i2s->SYNCBUSY .bit .DATA1 );
195
196
}
196
197
0 commit comments