@@ -14,6 +14,18 @@ I2SClass::I2SClass(SERCOM *p_sercom, uint8_t uc_index, uint8_t uc_pinSD, uint8_t
1414
1515int 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()
183188size_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
0 commit comments