i2s: Fix buffer size off by one error The FIFO ring buffer cursors were not incrementing and creating an illusion of a false LIFO queue because the mask and size were off. Additionally, to ease debugging, this replaces the square wave of the original test data with a more deterministic, and somewhat shorter sine wave that was programmatically generated without aliasing. Change-Id: I118cc73bca6d467b967f702465c5f3a758ff4d07
diff --git a/shodan_infrastructure/MatchaI2S.cs b/shodan_infrastructure/MatchaI2S.cs index d6fc044..5ef67e2 100644 --- a/shodan_infrastructure/MatchaI2S.cs +++ b/shodan_infrastructure/MatchaI2S.cs
@@ -93,9 +93,22 @@ } } + public override string ToString() + { + string result = "["; + + for (uint i = 0; i < FIFO_SIZE; i++) { + result += (i == cursor_r) ? "r" : " "; + result += (i == cursor_w) ? "w" : " "; + result += String.Format("{0:X8} ", fifo[i]); + } + + return result + "]"; + } + public uint Count { get { lock(synclock) { return count; } } } - const uint FIFO_SIZE = 63; + const uint FIFO_SIZE = 64; const uint FIFO_MASK = FIFO_SIZE - 1; private uint cursor_r = 0; @@ -245,7 +258,8 @@ } rxBuffer.Write(sample); - this.Log(LogLevel.Noisy, "Added sample. Level: {0}", rxBuffer.Count); + this.Log(LogLevel.Noisy, "Added sample ({1:X}). Level: {0}", rxBuffer.Count, sample); + this.Log(LogLevel.Noisy, rxBuffer.ToString()); if (rxBuffer.Count >= mappedRxTriggerLevel) { @@ -316,7 +330,7 @@ this.Log(LogLevel.Noisy, "RX Watermark cleared"); } RxOverflowIRQ.Set(false); - this.Log(LogLevel.Noisy, "Removed sample. Level: {0}", rxBuffer.Count); + this.Log(LogLevel.Noisy, "Removed sample ({1:X}). Level: {0}", rxBuffer.Count, sample); return sample; }); @@ -330,7 +344,7 @@ this.Log(LogLevel.Noisy, "TX Watermark cleared"); } TxEmptyIRQ.Set(false); - this.Log(LogLevel.Noisy, "Added sample. Level: {0}", txBuffer.Count); + this.Log(LogLevel.Noisy, "Added sample ({1:X}). Level: {0}", txBuffer.Count, val); }); Registers.FifoControl.Define32(this) @@ -405,6 +419,10 @@ public GPIO TxEmptyIRQ { get; } public GPIO RxOverflowIRQ { get; } + public string DumpFifos() { + return rxBuffer.ToString(); + } + private enum Events { TxWatermarkIRQ = 0, // raised if the xmit FIFO is below the high watermark
diff --git a/shodan_infrastructure/test.raw b/shodan_infrastructure/test.raw index d868cec..653f9a0 100644 --- a/shodan_infrastructure/test.raw +++ b/shodan_infrastructure/test.raw Binary files differ