@@ -8,61 +8,113 @@ Curie_I2S CurieI2S;
8
8
static uint32_t _i2s_dma_Rx_Buffer[DMA_BUFFER_SIZE];
9
9
static uint32_t _i2s_dma_Tx_Buffer[DMA_BUFFER_SIZE];
10
10
11
+ static struct i2s_ring_buffer _i2s_Rx_Buffer;
12
+ static struct i2s_ring_buffer _i2s_Tx_Buffer;
13
+
14
+ static struct i2s_ring_buffer *_i2s_Rx_BufferPtr = &_i2s_Rx_Buffer;
15
+ static struct i2s_ring_buffer *_i2s_Tx_BufferPtr = &_i2s_Tx_Buffer;
16
+
11
17
static void i2sInterruptHandler (void )
12
18
{
13
19
// TODO: Make interrupt handling more atomic
14
- noInterrupts ();
20
+ // noInterrupts();
21
+ // uint32_t fifoL = *I2S_TFIFO_STAT;
22
+
23
+ // tx FIFO almost empty
24
+ if (*I2S_STAT & 0x00000200 )
25
+ {
26
+ // Serial.println("tx almost empty");
27
+ // Serial.print("I2S_STAT: ");
28
+ // Serial.println(*I2S_STAT, HEX);
29
+ // Serial.print("I2S_TFIFO_STAT: ");
30
+ // Serial.println(fifoL, HEX);
31
+
32
+ // disable TFIFO_AEMPTY interrupt
33
+ // *I2S_CID_CTRL = *I2S_CID_CTRL & 0xFDFFFFFF;
34
+
35
+ // fill FIFO from buffer
36
+ if (_i2s_Tx_BufferPtr->head != _i2s_Tx_BufferPtr->tail )
37
+ {
38
+ int index = _i2s_Tx_BufferPtr->tail ;
39
+ int cnt = 0 ;
40
+ for (cnt = 0 ; (index != _i2s_Tx_BufferPtr->head ) && (cnt < 2 ); cnt++)
41
+ {
42
+ *I2S_DATA_REG = _i2s_Tx_BufferPtr->data [index ];
43
+ index = (index +1 )%I2S_BUFFER_SIZE;
44
+ }
45
+ _i2s_Tx_BufferPtr->tail = (_i2s_Tx_BufferPtr->tail + cnt)%I2S_BUFFER_SIZE;
46
+ }
15
47
48
+ // clear flags
49
+ *I2S_STAT = *I2S_CTRL & 0xFFFFF0FF ;
50
+
51
+ return ;
52
+ }
53
+
16
54
// tx FIFO full
17
55
if (*I2S_STAT & 0x00000400 )
18
56
{
19
57
// Serial.println("tx full");
20
-
58
+ // Serial.print("I2S_STAT: ");
59
+ // Serial.println(*I2S_STAT, HEX);
60
+ // Serial.print("I2S_TFIFO_STAT: ");
61
+ // Serial.println(fifoL, HEX);
21
62
// disable TFIFO_FULL interrupts
22
63
*I2S_CID_CTRL = *I2S_CID_CTRL & 0xFBFFFFFF ;
23
64
24
65
// start transmit data in FIFO
25
66
*I2S_CTRL = *I2S_CTRL | 0x02000000 ;
26
- delayTicks (3200 );
67
+ // delayTicks(3200);
27
68
28
69
// clear flags
29
- *I2S_STAT = *I2S_CTRL & 0xFFFFF3FF ;
70
+ *I2S_STAT = *I2S_CTRL & 0xFFFFF0FF ;
30
71
31
72
32
- // enable TFIFO_EMPTY interrupt
33
- *I2S_CID_CTRL = *I2S_CID_CTRL | 0x01000000 ;
73
+ // enable TFIFO_EMPTY and TFIFO_AEMPTY interrupt
74
+ *I2S_CID_CTRL = *I2S_CID_CTRL | 0x03000000 ;
34
75
35
76
return ;
36
77
}
37
78
79
+ // tx FIFO almost full
80
+ // if(*I2S_STAT & 0x00000200)
81
+ {
82
+ // fill up FIFO from buffer if available;
83
+ }
84
+
38
85
// tx FIFO empty
39
86
if (*I2S_STAT & 0x00000100 )
40
87
{
41
88
// Serial.println("tx empty");
42
-
89
+ // Serial.print("I2S_STAT: ");
90
+ // Serial.println(*I2S_STAT, HEX);
91
+ // Serial.print("I2S_TFIFO_STAT: ");
92
+ // Serial.println(fifoL, HEX);
43
93
// disable TFIFO_EMPTY interrupt
44
94
*I2S_CID_CTRL = *I2S_CID_CTRL & 0xFEFFFFFF ;
45
-
95
+
96
+ delayTicks (960 ); // allow enough time to send last frame
46
97
// stop transmission
47
98
*I2S_CTRL = *I2S_CTRL & 0xFDFFFFFF ;
48
99
49
100
// clear flags
50
- *I2S_STAT = *I2S_STAT & 0xFFFFFCFF ;
101
+ *I2S_STAT = *I2S_CTRL & 0xFFFFF0FF ;
51
102
52
103
// enable TFIFO_FULL interrupt
53
104
*I2S_CID_CTRL = *I2S_CID_CTRL | 0x04000000 ;
54
105
106
+
107
+ // Serial.print("CID_CTRL: ");
108
+ // Serial.println(*I2S_CID_CTRL, HEX);
109
+
55
110
return ;
56
111
}
57
112
58
- // tx FIFO almost empty
59
- {
60
- // fill up FIFO from buffer if available;
61
- }
113
+
62
114
63
115
// overrun and underrun
64
116
65
- interrupts ();
117
+ // interrupts();
66
118
}
67
119
68
120
Curie_I2S::Curie_I2S ()
@@ -164,6 +216,10 @@ void Curie_I2S::init()
164
216
i2s_ctrl |= 0x08B00100 ;
165
217
*I2S_CTRL = i2s_ctrl;
166
218
219
+ // set threshold for FIFOs
220
+ *I2S_TFIFO_CTRL |= 0x00030002 ;
221
+ *I2S_RFIFO_CTRL |= 0x00030002 ;
222
+
167
223
// enable interrupts
168
224
// ToDo: Use DMA instead of relying on interrupts
169
225
enableInterrupts ();
@@ -296,7 +352,7 @@ void Curie_I2S::enableInterrupts()
296
352
*INT_I2S_MASK = int_i2s_mask;
297
353
298
354
uint32_t i2s_cid_ctrl = *I2S_CID_CTRL;
299
- i2s_cid_ctrl |= 0x05008000 ;
355
+ i2s_cid_ctrl |= 0x0F008000 ;
300
356
*I2S_CID_CTRL = i2s_cid_ctrl;
301
357
302
358
interrupt_disable (IRQ_I2S_INTR);
@@ -321,9 +377,11 @@ void Curie_I2S::transmitFrame()
321
377
322
378
void Curie_I2S::pushData (uint32_t data)
323
379
{
324
- if (getTxFIFOLength () < 4 )
380
+ int i = (uint32_t )(_i2s_Tx_BufferPtr->head +1 ) % I2S_BUFFER_SIZE;
381
+ if (i != _i2s_Tx_BufferPtr->tail )
325
382
{
326
- *I2S_DATA_REG = data;
383
+ _i2s_Tx_BufferPtr->data [_i2s_Tx_BufferPtr->head ] = data;
384
+ _i2s_Tx_BufferPtr->head = i;
327
385
}
328
386
}
329
387
@@ -340,8 +398,8 @@ uint32_t Curie_I2S::pullData()
340
398
341
399
void Curie_I2S::pushDataFrame (uint32_t leftChData, uint32_t rightChData)
342
400
{
343
- int fifoLength = getTxFIFOLength ();
344
- if (!(fifoLength%2 ) && (fifoLength < 4 ))
401
+ // int fifoLength = getTxFIFOLength();
402
+ // if(!(fifoLength%2) && (fifoLength < 4))
345
403
{
346
404
pushData (leftChData);
347
405
pushData (rightChData);
0 commit comments