IP/Subsystem: Fix the I2S Tx interrupt masking issue if the requested… #140
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
If requested data length isn't integer multiple of (FIFO - THRE), the interrupt of I2S will be masked.
Let's assume FIFO = 16, THRE = 3, and requested data length is 20 bytes.
First,
i2s_tx_master_tx_ISR_procwillcall i2s_tx_master_write_sampleswith sample_cnt = (16 - 3) = 13.Second,
i2s_tx_master_write_sampleswill updatesample_cntto be 0, so the loop will exit.Upon receiving FIFO interrupt,
i2s_tx_master_tx_ISR_procwill calli2s_tx_master_write_samplesagain withsample_cnt = 13.i2s_tx_master_write_sampleswill updatesample_cntto be 13 - 7 (20 requested - 13 sent the previous round) = 6i2s_tx_master_write_sampleswill find thatdev->xfr_len == *size, so it will incrementsys_cntand call application callback.i2s_tx_master_tx_ISR_procwill iterate one more time becausesample_cntdidn't reach zero yet.Now, the condition
if (dev->sys_cnt == dev->usr_cnt)will be true, so the interrupt will be masked.