2019-12-15 04:14 PM
Hi
I cant seam to get the F7 to transmit the TDM output in the correct timing
I have SAI Block A1 as the Slave Mode RX and B1 as the SAI TDM Tx that is sync to Block A1
The Format is 8 x 32Bit Slots TDM Slave mode to a DSP Via DMA Circular buffer
What concerns me is the STM32F7 Data Out is lagging and as such although works , reduces the Timing Margins
/* SAI1 init function */
void MX_SAI1_Init(void)
{
hsai_BlockA1.Instance = SAI1_Block_A;
hsai_BlockA1.Init.Protocol = SAI_FREE_PROTOCOL;
hsai_BlockA1.Init.AudioMode = SAI_MODESLAVE_RX;
hsai_BlockA1.Init.DataSize = SAI_DATASIZE_24;
hsai_BlockA1.Init.FirstBit = SAI_FIRSTBIT_MSB;
hsai_BlockA1.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
hsai_BlockA1.Init.Synchro = SAI_ASYNCHRONOUS;
hsai_BlockA1.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;
hsai_BlockA1.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;
hsai_BlockA1.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
hsai_BlockA1.Init.MonoStereoMode = SAI_STEREOMODE;
hsai_BlockA1.Init.CompandingMode = SAI_NOCOMPANDING;
hsai_BlockA1.Init.TriState = SAI_OUTPUT_RELEASED;
hsai_BlockA1.FrameInit.FrameLength = 256;
hsai_BlockA1.FrameInit.ActiveFrameLength = 128;
hsai_BlockA1.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
hsai_BlockA1.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
hsai_BlockA1.FrameInit.FSOffset = SAI_FS_FIRSTBIT;
hsai_BlockA1.SlotInit.FirstBitOffset = 0;
hsai_BlockA1.SlotInit.SlotSize = SAI_SLOTSIZE_32B;
hsai_BlockA1.SlotInit.SlotNumber = 8;
hsai_BlockA1.SlotInit.SlotActive = 0x0000003F;
if (HAL_SAI_Init(&hsai_BlockA1) != HAL_OK)
{
Error_Handler();
}
hsai_BlockB1.Instance = SAI1_Block_B;
hsai_BlockB1.Init.Protocol = SAI_FREE_PROTOCOL;
hsai_BlockB1.Init.AudioMode = SAI_MODESLAVE_TX;
hsai_BlockB1.Init.DataSize = SAI_DATASIZE_24;
hsai_BlockB1.Init.FirstBit = SAI_FIRSTBIT_MSB;
hsai_BlockB1.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;
hsai_BlockB1.Init.Synchro = SAI_SYNCHRONOUS;
hsai_BlockB1.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLE;
hsai_BlockB1.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;
hsai_BlockB1.Init.SynchroExt = SAI_SYNCEXT_DISABLE;
hsai_BlockB1.Init.MonoStereoMode = SAI_STEREOMODE;
hsai_BlockB1.Init.CompandingMode = SAI_NOCOMPANDING;
hsai_BlockB1.Init.TriState = SAI_OUTPUT_NOTRELEASED;
hsai_BlockB1.FrameInit.FrameLength = 256;
hsai_BlockB1.FrameInit.ActiveFrameLength = 128;
hsai_BlockB1.FrameInit.FSDefinition = SAI_FS_STARTFRAME;
hsai_BlockB1.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;
hsai_BlockB1.FrameInit.FSOffset = SAI_FS_FIRSTBIT;
hsai_BlockB1.SlotInit.FirstBitOffset = 0;
hsai_BlockB1.SlotInit.SlotSize = SAI_SLOTSIZE_32B;
hsai_BlockB1.SlotInit.SlotNumber = 8;
hsai_BlockB1.SlotInit.SlotActive = 0x0000003F;
if (HAL_SAI_Init(&hsai_BlockB1) != HAL_OK)
{
Error_Handler();
}
}
Is this as good as it gets?
Thanks
2019-12-16 01:30 AM
> What concerns me is the STM32F7 Data Out is lagging and as such although works , reduces the Timing Margins
Are you talking about a Slave Transmitter?
I don't think it's a software issue; this should work as a normal shift register, regardless of internal clocks
What does the datasheet say with regard to clock-to-data setup time? Is your equipment good enough to capture waveforms with ns precision, at the decision level of the logic?
You can perhaps try to play with the slew rate setting of the data line in GPIO_OSPEEDR, too.
JW
2019-12-16 03:41 AM
Hi JW
I changed the Slew to High and It has made the Transmitter much closer to aligning with the FS
By Default it was set to Low.
Thanks for to heads up