Connections for I2S echo sample

I was facing some buffer issues while setting up I2S, so I decided to flash and test out the i2s echo sample provided in the sample programs in the SDK. I changed the DT_NODELABEL to use i2s0 for both I2S_RX_NODE and I2S_TX_NODE. I also added debug print statements to print out the values captured by the mic as follows:

while (k_sem_take(&toggle_transfer, K_NO_WAIT) != 0) {
			void *mem_block;
			uint32_t block_size;
			int ret;

			ret = i2s_read(i2s_dev_rx, &mem_block, &block_size);
			if (ret < 0) {
				printk("Failed to read data: %d\n", ret);
				break;
			} else if(ret == 0) {
				// printk("Successfully read data (%d)...\n", block_size);
			}
			
			int16_t *sample_data = (int16_t *)mem_block;
			for (int i = 0; i < block_size / BYTES_PER_SAMPLE; ++i) {
				printk("Sample %d: %d\n", i, sample_data[i]);
			}

			process_block_data(mem_block, SAMPLES_PER_BLOCK);

			ret = i2s_write(i2s_dev_tx, mem_block, block_size);
			if (ret < 0) {
				printk("Failed to write data: %d\n", ret);
				break;
			} else if(ret == 0) {
				// printk("Successfully wrote data (%d)\n\n", block_size);
			}
		}

(There are no build or flash errors in this code)

This helps me make sure that the mic is being interfaced properly as it prints -1 whenever some pin connections are wrong, otherwise it will print corresponding values captured by mic. So I believe I have interfaced the microphone properly. However, I'm facing issues interfacing the speaker now as I cannot hear anything from the speaker and it seems the data is being sent properly as there are no errors.

Here are the pin connections I made:

Mic: INMP441 MEMS MIC

SD: P0.15 (DOUT)

L/R: GND

WS: P0.16 (FSYNC)

SCK: P0.14 (BCLK)

Speaker: I2S MAX98357 Amp

DIN: P0.13 (DIN)

LRC: P0.16 (FSYNC)

BCLK: P0.14 (BCLK)

SD: NC

GAIN: GND

End result which Im planning to achieve: Receive audio from USB or BLE over I2S and play it to the speakers. I tried implementing a tone generator for the i2s_write function as well but that didn't work either.

Parents Reply Children
  • If you have a logic analysator at hand, could you verify that the output on the I2s matches what your observing?

    No, thats what I said in my previous replies. I'll quote it below for your reference too...

    I tried recording the signal with the help of an digital oscillator. This is what I got:

    The DIN, BCLK and LRC pins have 1.3 MHz signal, and DOUT has 460-470 KHz signal. I tried changing the frequency of the sine wave that is being generated but that didn't change anything

    The I2S code just doesn't work as intended.

  • Noted. Then the next item for you to verify is where the signal stops, i.e between DK and amp or from amp to speaker or if any of the cables are not working. The thing to verify after this is if you're able to get any other basic I2S implementations/samples up and running.

    Could you also share any .dts and overlay files?

    Kind regards,
    Andreas

Related