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_proc
willcall i2s_tx_master_write_samples
with sample_cnt = (16 - 3) = 13.Second,
i2s_tx_master_write_samples
will updatesample_cnt
to be 0, so the loop will exit.Upon receiving FIFO interrupt,
i2s_tx_master_tx_ISR_proc
will calli2s_tx_master_write_samples
again withsample_cnt = 13
.i2s_tx_master_write_samples
will updatesample_cnt
to be 13 - 7 (20 requested - 13 sent the previous round) = 6i2s_tx_master_write_samples
will find thatdev->xfr_len == *size
, so it will incrementsys_cnt
and call application callback.i2s_tx_master_tx_ISR_proc
will iterate one more time becausesample_cnt
didn't reach zero yet.Now, the condition
if (dev->sys_cnt == dev->usr_cnt)
will be true, so the interrupt will be masked.