Jump to content

    
Sign in to follow this  
Garmin

STM32F446 SAI SPDIF OUT

Recommended Posts

Есть ли тут кто-нибудь, кто работал с S/PDIF выходом в STM32F446?

Инициализирую, но не получаю на выходе сигнала. Только +3,3В.

Что делаю:

1) разрешаю тактирование SAI, DMA, и порта B

2) запускаю PLL_SAI

3) устанавливаю источник тактирования SAI

4) конфигурирую вывод порта как альтернативную функцию.

5) конфигурирую DMA

6) разрешаю прерывания DMA

7) разрешаю SAI.

 

В отладчике видны изменения регистров, видны регистры DMA и PLL, но на выходе сигнала нет.

Вот код инициализации:

/*******************************************************************************
* Инициализация блока SAI1_A как передатчика SPDIF
* Режимы 44,1кГц, 48кГц 16 бит
* Channel information не передаётся.
* Вход - двойной буфер b.audio_out_buf0, b.audio_out_buf1
* Используется DMA2 Stream3 Ch0
* Выход S/PDIF	- PC1
*******************************************************************************/
void SAI1_A_init (void)
{
// Для передачи используется DMA2 Stream3 ch0 double buffer mode
// Первое полуслово - левый канал
// останавливаем SAI1_A
SAI1_Block_A->CR1 &= ~SAI_xCR1_SAIEN;
while (SAI1_Block_A->CR1 & SAI_xCR1_SAIEN)
{ 
}	// подождём, пока остановится
SAI1_Block_A->CLRFR = SAI_xCLRFR_COVRUDR;	// стираем флаг overrun
SAI1_Block_A->CR2 |= SAI_xCR2_FFLUSH;		// стираем внутренний фифо
// остановили DMA
DMA2_Stream3->CR = 0; 
while (DMA2_Stream3->CR & DMA_SxCR_EN) 
{
}	// подождали остановки


switch (g.out_fs)
{
case 44:
	pll.pll_sai_mode = PLL_SAI_MODE_44;
	break;

case 48:
default:
	pll.pll_sai_mode = PLL_SAI_MODE_48;
	break;
}
pll_control (&pll);

DMA2_Stream3->PAR = (uint32_t) &SAI1_Block_A->DR;		// адрес приёмника в периферии
DMA2_Stream3->M0AR = (uint32_t) b.audio_out_buf0;		// адрес первой половины двойного буфера в памяти
DMA2_Stream3->M1AR = (uint32_t) b.audio_out_buf1;		// адрес второй половины двойного буфера в памяти
DMA2_Stream3->NDTR = (AUDIO_BUF_SIZE / 8);
   DMA2_Stream3->FCR = DMA_SxFCR_FEIE	* 0
				| DMA_SxFCR_FS_0	* 0
				| DMA_SxFCR_FS_1	* 0
				| DMA_SxFCR_FS_2	* 0
				| DMA_SxFCR_DMDIS	* 1	// разрешить FIFO
				| DMA_SxFCR_FTH_0	* 1	// 11: full FIFO
				| DMA_SxFCR_FTH_1	* 1;
DMA2_Stream3->CR = DMA_SxCR_CHSEL_0	* 0	// DMA2 Stream3 ch0 = SAI_A
				| DMA_SxCR_CHSEL_1	* 0
				| DMA_SxCR_CHSEL_2	* 0
				| DMA_SxCR_MBURST_0	* 0
				| DMA_SxCR_MBURST_1	* 0
				| DMA_SxCR_PBURST_0	* 0
				| DMA_SxCR_PBURST_1	* 0
				| DMA_SxCR_CT		* 0	// цель - буфер DMA2_Stream3->b.audio_out_buf0
				| DMA_SxCR_DBM		* 1	// режим двойного буфера
				| DMA_SxCR_PL_0		* 0	// приоритет потока 10: High
				| DMA_SxCR_PL_1		* 1
				| DMA_SxCR_PINCOS	* 0
				| DMA_SxCR_MSIZE_0	* 1	// размер данных
				| DMA_SxCR_MSIZE_1	* 0	//01: Half-word (16-bit)
				| DMA_SxCR_PSIZE_0	* 1	// размер данных
				| DMA_SxCR_PSIZE_1	* 0	//01: Half-word (16-bit)
				| DMA_SxCR_MINC		* 1	// память с инкрементом
				| DMA_SxCR_PINC		* 0	// периферия без инкремента
				| DMA_SxCR_CIRC		* 1	// кольцевой режим
				| DMA_SxCR_DIR_0	* 1	// 01: Memory-to-peripheral
				| DMA_SxCR_DIR_1	* 0	// 
				| DMA_SxCR_PFCTRL	* 0	// DMA управляет потоком
				| DMA_SxCR_TCIE		* 1	// прерывание по окончании передачи
				| DMA_SxCR_HTIE		* 0
				| DMA_SxCR_TEIE		* 0
				| DMA_SxCR_DMEIE	* 0;

DMA2->LIFCR = DMA_LIFCR_CTCIF3
				| DMA_LIFCR_CHTIF3
				| DMA_LIFCR_CTEIF3
				| DMA_LIFCR_CDMEIF3
				| DMA_LIFCR_CFEIF3;	// стёрли флаги
DMA2_Stream3->CR |= DMA_SxCR_EN;	// разрешаем работу DMA


// конфигурация SAI1_A
SAI1_Block_A->CR1 = SAI_xCR1_MODE_0	* 0	// <Bit 0 MODE[1:0] bits (Audio Block Mode)
				| SAI_xCR1_MODE_1	* 0	// <Bit 1 00: Master transmitter
				| SAI_xCR1_PRTCFG_0	* 1	// <Bit 0 PRTCFG[1:0] bits (Protocol Configuration) 
				| SAI_xCR1_PRTCFG_1	* 0	// Bit 1 01: SPDIF protocol
				| SAI_xCR1_DS_0		* 0	// Bit 0 S[1:0] bits (Data Size)
				| SAI_xCR1_DS_1		* 0	// Bit 1 100: 16 bits
				| SAI_xCR1_DS_2		* 1	// Bit 2 */
				| SAI_xCR1_LSBFIRST	* 0	// LSB First Configuration  */
				| SAI_xCR1_CKSTR	* 0	// ClocK STRobing edge      */
				| SAI_xCR1_SYNCEN_0	* 0	// Bit 0 SYNCEN[1:0](SYNChronization ENable)
				| SAI_xCR1_SYNCEN_1	* 0	// Bit 1 */
				| SAI_xCR1_MONO		* 0	// Mono mode                  */
				| SAI_xCR1_OUTDRIV	* 1	// Output Drive               */
				| SAI_xCR1_SAIEN	* 0	// Audio Block enable         */
				| SAI_xCR1_DMAEN	* 1	// DMA enable                 */
				| SAI_xCR1_NODIV	* 0	// No Divider Configuration   */
				| SAI_xCR1_MCKDIV_0	* 0	// Bit 0  MCKDIV[3:0] (Master ClocK Divider)
				| SAI_xCR1_MCKDIV_1	* 0	// Bit 1  */
				| SAI_xCR1_MCKDIV_2	* 0	// Bit 2  */
				| SAI_xCR1_MCKDIV_3	* 0;// Bit 3  */


//	SAI1_Block_A->FRCR = ;	// не используется при SPDIF протоколе
SAI1_Block_A->CR1 |= SAI_xCR1_SAIEN;
}

Где-то я не доглядел, не пойму.

 

На сайте ST ничего нет.

Куб не подозревает о режиме SPDIF у SAI.

Примеров в сети не нашёл.

 

 

Share this post


Link to post
Share on other sites

Что такое стерео 2.0 не понял...
А вот что напришите то и будет - на стерео взход и стерео выхолд 48 кГц 16 бит вполне зватит ресурсов.

image.png.38586cdca5e3a4af1bbd31cd31180864.png

Share this post


Link to post
Share on other sites
On 11/3/2020 at 9:43 PM, GenaSPB said:

А вот что напришите то и будет - на стерео взход и стерео выхолд

А есть где-то пример именно входа через USB?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this