Hello, I'm running RT1024 on a custom board.
SAI1 is configured as an I2S master to control 1 PCM4104. This DAC is capable of driving 4 output channels, it drives 2 channels per logic state of LRCK:
when LRCK is high, CH1 reproduces whatever comes to DATA0 and CH3 reproduces whatever comes to DATA1.
I'm trying to play sounds taking the "evkmimxrt1024_sai_interrupt_transfer" example and changing SAI3 to SAI1 with the next configuration:
The routine is as follows:
-Initialize clocks
-Initialize SAI1
-Create SAI_TransferTxCreateHandle
STATE_EMITTING_RIGHT
-Turn on LED1
-Configure SAI as left justified, monoright and channel 1 (I leave this channel 1 as the example but don't fully understand why is this value), asynchronous mode, master.
-Configure the SAI_TransferTxSetConfig
-Set the BCK with SAI_TxSetBitClockRate
-Reproduces sound with SAI_TransferSendNonBlocking
-Turn off LED1
STATE_EMITTING_LEFT
-Turn on LED2 and LED3
-Configure SAI as left justified, monoleft and channel 1 (I leave this channel 1 as the example but don't fully understand why is this value), asynchronous mode, master.
-Configure the SAI_TransferTxSetConfig
-Set the BCK with SAI_TxSetBitClockRate
-Reproduces sound with SAI_TransferSendNonBlocking
-Turn off LED2 and LED3
Then repeats alternating playing sound between left and right.
Results:
So far, debugging with MCUxpresso I've been able to reproduce sounds through channel 1 (left) and channel 2 (right).
Issues:
1)This doesn't work all the time, if I try to toggle both LED2 and LED3, the program reproduces 10 times the sound on the left and 9 times on the right and then completely freezes. If I remove writing1&writing0 to LED2 or LED3, the program has no freezing, it alternates reproducing sounds left&right without problem.
1.1) In order to reproduce sounds, I need to run the program through MCUXpresso debugging mode. If I run the program without it, volume goes very low and it only reproduces sound through monoLeft. This doesn't make any sense to me. I'm using the same code I tested on another custom board with the same RT1024 and the same audio DAC, but using SAI3 instead of SAI1
2)I see the audio data coming out from TX_DATA0 but not from TX_DATA1. How could I get data to come out from TX_DATA1 pin too?
I've attached the main programming code files for further detail.
Please, any help would be appreciated!!
Thanks!!
Thanks @mayliu1 !!
I've checked your previous answer as the solution as now data comes out through TX_DATA1. Also, I'll create a new case to troubleshoot the actual control of the data as suggested
Thanks again!!
Hi @DigitalBrain ,
Thanks for your update information.
Sorry I don't know the corresponding relationship between audio jack1, audiojack2 ,jack3 with your SAI interface.
But I can tell you that SAI_GetClassicI2SConfig, SAI_GetLeftJustifiedConfig, SAI_GetRightJustifiedConfig all can support 2 slot.
Please modify your code, set sai_mono_stereo_t as kSAI_Stereo.
I also suggest you can refer to this link.
https://www.nxp.com/docs/en/application-note/AN12090.pdf
If you still have question, Please create a new case, I will do my best to help you.
BR
mayliu
Hello @mayliu1
Thanks for your reply!!
Utilizing kSAI_Channel#Mask got me to transmit data through TX_DATA1, however I'm wondering how is it possible to control which data is sent to each of the TX_DATAX.
For example, is it necessary to reconfigure all each time I want to transmit through audio jack1, audiojack2 audiojack3?
Right now, I need to run all of this routine each time I want to transmit through a jack:
I think DEMO_SAI_CHANNEL depend on your needs, what I show you is just a demo.
You can also set saiChannelMask, this param can also set multiple SAI channel.
function -> SAI_TransferTxSetConfig will call SAI_TxSetConfig
In SAI_TxSetConfig function , saiChannelMask set TCR3 register.
BR
mayliu
Hello, @mayliu1
Thanks for your input!
Could you please show me the value you set for DEMO_SAI_CHANNEL?
If I do the following:
#define DEMO_SAI_CHANNEL (0) //Now it doesn't matter as 3 is being hardcoded
SAI_TxSetChannelFIFOMask(DEMO_SAI,5);
SAI_GetLeftJustifiedConfig(&saiConfig, DEMO_AUDIO_BIT_WIDTH, kSAI_MonoRight,3);
The register sets to 3, seems like the value that matters is the sent on SAI_GetLeftJustifiedConfig
Also, how is it possible to select the data to transfer through TX_DATA0 and TX_DATA1 ?
Thanks!
Thanks for your update information.
I did a validation on my side, I can set TCE as 0x03, Please refer to what I did.
1: First , I think you should set your SAI TX DATA1 .
Please note that the GPIO TX DATA1 is not real connect, your code should be based on your customed board. The modified configurations I made are just for giving you a demonstration. Please develop your code strictly base on your customed board.
2: Second, you need call SAI_TxSetChannelFIFOMask(DEMO_SAI, 0x03) in your project
I import SDK demo "evkmimxrt1020_sai_interrupt_transfer" , and use MIMXRT1020-EVK board .
Wish it helps you.
If you still have question about it, please kindly let me know.
If you have other question, Please create a new case, Thanks.
BR
mayliu
Furthermore, even placing the value directly to 0x3 gets 0x1 as result
void SAI_TxSetChannelFIFOMask(I2S_Type *base, uint8_t mask)
{
base->TCR3 &= ~I2S_TCR3_TCE_MASK;
base->TCR3 |= I2S_TCR3_TCE(0x3);
}
Hello, @mayliu1
That's true. I've set it to 3:
SAI_TxSetChannelFIFOMask(SAI1,3);
but after executing the function, the register gets set to 0x1 instead of 0x3.
For some reason, I'm not being able to set it to 0x3
Hi, @DigitalBrain
Thanks for your update information.
I notice that your TCE is 1, I don't think it is a right value.
TCE should be 0x03(0b0011) if you want both channel1 and channel 2 working.
Please double check your config function.
BR
mayliu
Hello, @mayliu1
Thanks for your reply. These are the values:
TCE is set to 0x1.
Maybe I need to use a different function to transmit through TX_DATA1?
Currently I'm using:
sai_handle_t txHandle = {0};
sai_transfer_t xfer;
SAI_TransferSendNonBlocking(SAI1, &txHandle, &xfer);
I understood this function would send the same data at the same time through all the enabled TX_DATA channels. Is it correct?
Thanks!!
Hi @DigitalBrain ,
Thanks for your reply.
Could you check your SAI1 TCR3 register value.
You can check MCUXpresso IDE -> Peripherals -> SAI1 -> TCR3->TCE
Wish it helps you.
If you still have question about it, please kindly let me know.
BR
mayliu
Hello @mayliu1
initialization is as follows:
SAI_Init(DEMO_SAI);
SAI_TransferTxCreateHandle(DEMO_SAI, &txHandle, callback, NULL);
SAI_TxSetChannelFIFOMask(DEMO_SAI,3);
I thought that adding the last line would be enough to transmit through TX_DATA1 but it wasn't. What am I missing?
Thanks!!
Hi @DigitalBrain ,
Thank you for your interest in the NXP MIMXRT product, I would like to provide service for you.
Question:
1)This doesn't work all the time, if I try to toggle both LED2 and LED3, the program reproduces 10 times the sound on the left and 9 times on the right and then completely freezes. If I remove writing1&writing0 to LED2 or LED3, the program has no freezing, it alternates reproducing sounds left&right without problem.
Answer:
I have download your code, but there are no LED1,LED2,LED3 definition.
when the project freezing, Please check Register, Fault, Peripherals->SAI status.
You can also read SAI status in your code project.
Question:
1.1) In order to reproduce sounds, I need to run the program through MCUXpresso debugging mode. If I run the program without it, volume goes very low and it only reproduces sound through monoLeft. This doesn't make any sense to me. I'm using the same code I tested on another custom board with the same RT1024 and the same audio DAC, but using SAI3 instead of SAI1
Answer:
If the volume changed, I suggest you double check Audio format.
Question:
2)I see the audio data coming out from TX_DATA0 but not from TX_DATA1. How could I get data to come out from TX_DATA1 pin too?
Answer: If you want to use TX_DATA0 and TX_DATA1 of SAI1 , please refer to the content of Section 34.5.1.7 "Transmit Configuration 3 (TCR3)" in the MIMXRT1024RM. You should set the Transmit Enable (TCE) bit in Transmit Configuration 3 (TCR3) when initializing the SAI1.
Wish it helps you.
If you still have question about it, please kindly let me know.
BR
mayliu