Generating tone via SAI with imx8 as slave

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Generating tone via SAI with imx8 as slave

244 Views
abtom87
Contributor I

I am configuring the SAI pins and enabling external clock like so:

	IOMUXC_SetPinMux(IOMUXC_SAI3_TXFS_SAI3_TX_SYNC, 0U);
	IOMUXC_SetPinMux(IOMUXC_SAI3_TXC_SAI3_TX_BCLK, 0U);
	IOMUXC_SetPinMux(IOMUXC_SAI3_TXD_SAI3_TX_DATA0, 0U);
	IOMUXC_SetPinMux(IOMUXC_SAI3_MCLK_SAI3_MCLK, 0U);

	// Set Pin Config
	IOMUXC_SetPinConfig(IOMUXC_SAI3_TXFS_SAI3_TX_SYNC, value);
	IOMUXC_SetPinConfig(IOMUXC_SAI3_TXC_SAI3_TX_BCLK, value);
	IOMUXC_SetPinConfig(IOMUXC_SAI3_TXD_SAI3_TX_DATA0, value);
	IOMUXC_SetPinConfig(IOMUXC_SAI3_MCLK_SAI3_MCLK, value);

	// Enable extern MCLK
	IOMUXC_GPR->GPR[2] |= IOMUXC_GPR_GPR2_GPR_SAI3_EXT_MCLK_EN(1);

 

Then i create the transfer Tx handle which contains the SAI Tx callback like so:

	SAI_Init(SAI_I2S);
	SAI_TransferTxCreateHandle(SAI_I2S, &saiHandle, sai_tx_callback, saiBuffer);
	saiHandle.bitWidth = 32U;
	saiHandle.channel = 0;
	saiHandle.channelMask = SAI_CHANNEL_MASK;
	saiHandle.channelNums = 2;
	saiHandle.endChannel = 1;

 

I configure the imx as slave

	sai_fifo_t fifo;
	sai_fifo_packing_t packing;
	packing = kSAI_FifoPacking8bit;
	SAI_TxSetFIFOPacking(SAI_I2S, packing);

	sai_transceiver_t config;
	SAI_GetClassicI2SConfig(&config, SAI_BIT_WIDTH, SAI_MONO_STEREO, SAI_CHANNEL_MASK);
	config.fifo = fifo;
	config.masterSlave = kSAI_Slave;
	config.syncMode = kSAI_ModeAsync;
	config.bitClock.bclkSource = kSAI_BclkSourceMclkOption1;
	SAI_TxSetConfig(SAI_I2S, &config);

 

Do a fifo reset before preparing my data and sending the data using 

 

SAI_TxSoftwareReset(SAI_I2S, kSAI_ResetTypeSoftware);
 
	// Prepare transfer
	sai_transfer_t xfer =
	{
		.data = (uint8_t *)saiBuffer,
		.dataSize = sizeof(uint32_t) * SAI_BUFFER_SIZE,
	};

	if ((ret = SAI_TransferSendNonBlocking(SAI_I2S, &saiHandle, &xfer)) == kStatus_Success)
	{
	}
	else 
	{
		//Do some debugging
	}

 

The weird part is, the interrupt fires, the callback is called and I am printing out the TFR and TDR registers which all show 0x00. What am i doing wrong here? Is EDMA the only way or something else? Any help or pointers would be appreciated!

 

Tags (2)
0 Kudos
Reply
2 Replies

200 Views
Manuel_Salas
NXP TechSupport
NXP TechSupport

Hello @abtom87 

I hope you are doing very well.

 

Before to start looking for any code issue, could you please measure the MCLK signal?

I would like to be sure there is the signal in the PAD.

 

Best regards,

Salas.

186 Views
abtom87
Contributor I

Yes I measured the clock. There is signal. The interrupt wouldnt be fired otherwise or?

0 Kudos
Reply
%3CLINGO-SUB%20id%3D%22lingo-sub-2199988%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3EGenerating%20tone%20via%20SAI%20with%20imx8%20as%20slave%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2199988%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EI%20am%20configuring%20the%20SAI%20pins%20and%20enabling%20external%20clock%20like%20so%3A%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E%09IOMUXC_SetPinMux(IOMUXC_SAI3_TXFS_SAI3_TX_SYNC%2C%200U)%3B%0A%09IOMUXC_SetPinMux(IOMUXC_SAI3_TXC_SAI3_TX_BCLK%2C%200U)%3B%0A%09IOMUXC_SetPinMux(IOMUXC_SAI3_TXD_SAI3_TX_DATA0%2C%200U)%3B%0A%09IOMUXC_SetPinMux(IOMUXC_SAI3_MCLK_SAI3_MCLK%2C%200U)%3B%0A%0A%09%2F%2F%20Set%20Pin%20Config%0A%09IOMUXC_SetPinConfig(IOMUXC_SAI3_TXFS_SAI3_TX_SYNC%2C%20value)%3B%0A%09IOMUXC_SetPinConfig(IOMUXC_SAI3_TXC_SAI3_TX_BCLK%2C%20value)%3B%0A%09IOMUXC_SetPinConfig(IOMUXC_SAI3_TXD_SAI3_TX_DATA0%2C%20value)%3B%0A%09IOMUXC_SetPinConfig(IOMUXC_SAI3_MCLK_SAI3_MCLK%2C%20value)%3B%0A%0A%09%2F%2F%20Enable%20extern%20MCLK%0A%09IOMUXC_GPR-%26gt%3BGPR%5B2%5D%20%7C%3D%20IOMUXC_GPR_GPR2_GPR_SAI3_EXT_MCLK_EN(1)%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CP%3EThen%20i%20create%20the%20transfer%20Tx%20handle%20which%20contains%20the%20SAI%20Tx%20callback%20like%20so%3A%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E%09SAI_Init(SAI_I2S)%3B%0A%09SAI_TransferTxCreateHandle(SAI_I2S%2C%20%26amp%3BsaiHandle%2C%20sai_tx_callback%2C%20saiBuffer)%3B%0A%09saiHandle.bitWidth%20%3D%2032U%3B%0A%09saiHandle.channel%20%3D%200%3B%0A%09saiHandle.channelMask%20%3D%20SAI_CHANNEL_MASK%3B%0A%09saiHandle.channelNums%20%3D%202%3B%0A%09saiHandle.endChannel%20%3D%201%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CP%3EI%20configure%20the%20imx%20as%20slave%3C%2FP%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E%09sai_fifo_t%20fifo%3B%0A%09sai_fifo_packing_t%20packing%3B%0A%09packing%20%3D%20kSAI_FifoPacking8bit%3B%0A%09SAI_TxSetFIFOPacking(SAI_I2S%2C%20packing)%3B%0A%0A%09sai_transceiver_t%20config%3B%0A%09SAI_GetClassicI2SConfig(%26amp%3Bconfig%2C%20SAI_BIT_WIDTH%2C%20SAI_MONO_STEREO%2C%20SAI_CHANNEL_MASK)%3B%0A%09config.fifo%20%3D%20fifo%3B%0A%09config.masterSlave%20%3D%20kSAI_Slave%3B%0A%09config.syncMode%20%3D%20kSAI_ModeAsync%3B%0A%09config.bitClock.bclkSource%20%3D%20kSAI_BclkSourceMclkOption1%3B%0A%09SAI_TxSetConfig(SAI_I2S%2C%20%26amp%3Bconfig)%3B%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CP%3EDo%20a%20fifo%20reset%20before%20preparing%20my%20data%20and%20sending%20the%20data%20using%26nbsp%3B%3C%2FP%3E%3CBR%20%2F%3E%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3ESAI_TxSoftwareReset(SAI_I2S%2C%20kSAI_ResetTypeSoftware)%3B%0A%20%0A%09%2F%2F%20Prepare%20transfer%0A%09sai_transfer_t%20xfer%20%3D%0A%09%7B%0A%09%09.data%20%3D%20(uint8_t%20*)saiBuffer%2C%0A%09%09.dataSize%20%3D%20sizeof(uint32_t)%20*%20SAI_BUFFER_SIZE%2C%0A%09%7D%3B%0A%0A%09if%20((ret%20%3D%20SAI_TransferSendNonBlocking(SAI_I2S%2C%20%26amp%3BsaiHandle%2C%20%26amp%3Bxfer))%20%3D%3D%20kStatus_Success)%0A%09%7B%0A%09%7D%0A%09else%20%0A%09%7B%0A%09%09%2F%2FDo%20some%20debugging%0A%09%7D%3C%2FCODE%3E%3C%2FPRE%3E%3CBR%20%2F%3E%3CP%3EThe%20weird%20part%20is%2C%20the%20interrupt%20fires%2C%20the%20callback%20is%20called%20and%20I%20am%20printing%20out%20the%20TFR%20and%20TDR%20registers%20which%20all%20show%200x00.%20What%20am%20i%20doing%20wrong%20here%3F%20Is%20EDMA%20the%20only%20way%20or%20something%20else%3F%20Any%20help%20or%20pointers%20would%20be%20appreciated!%3C%2FP%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2200648%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Generating%20tone%20via%20SAI%20with%20imx8%20as%20slave%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2200648%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EYes%20I%20measured%20the%20clock.%20There%20is%20signal.%20The%20interrupt%20wouldnt%20be%20fired%20otherwise%20or%3F%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2200444%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20Generating%20tone%20via%20SAI%20with%20imx8%20as%20slave%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2200444%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3EHello%26nbsp%3B%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F256537%22%20target%3D%22_blank%22%3E%40abtom87%3C%2FA%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EI%20hope%20you%20are%20doing%20very%20well.%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3EBefore%20to%20start%20looking%20for%20any%20code%20issue%2C%20could%20you%20please%20measure%20the%26nbsp%3BMCLK%20signal%3F%3C%2FP%3E%0A%3CP%3EI%20would%20like%20to%20be%20sure%20there%20is%20the%20signal%20in%20the%20PAD.%3C%2FP%3E%0A%3CBR%20%2F%3E%0A%3CP%3EBest%20regards%2C%3C%2FP%3E%0A%3CP%3ESalas.%3C%2FP%3E%3C%2FLINGO-BODY%3E