STM32F446 SAI SPDIF out. Нет выходного сигнала.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение GARMIN »

Есть ли тут кто-нибудь, кто работал с S/PDIF выходом в STM32F446?
Инициализирую, но не получаю на выходе сигнала. Только +3,3В.
Что делаю:
1) разрешаю тактирование SAI, DMA, и порта C
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;
}
Где-то я не доглядел, не пойму.
Последний раз редактировалось GARMIN Чт фев 18, 2016 06:51:58, всего редактировалось 1 раз.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение dosikus »

DS не смотрел пока, но как на счет таблицы AF для пинов?
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение GARMIN »

PC1 - AF6, SAI1_SD_A, всё в порядке. Рядом пины I2S, там всё работает.
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение dosikus »

GARMIN, что-то я Refence manual на него найти не могу...

ЗЫ. Удалось по косвенным ссылкам из даташита набрести на RM390...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение dosikus »

Конечно может и фигня, но меня вот что смущает- и буфер и приемник объявлены как 16бит а в RM
Bits 7:5 DS[2:0]: Data size.
These bits are set and cleared by software. These bits are ignored when the SPDIF protocols are
selected (bit PRTCFG[1:0]), because the frame and the data size are fixed in such case. When the
companding mode is selected through COMP[1:0] bits, DS[1:0] are ignored since the data size is
fixed to 8 bits by the algorithm
.
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение GARMIN »

Это была упрощённая инициализация DMA, взятая из соседнего блока. Сегодня я переделал на полный вариант:
Спойлер

Код: Выделить всё

	DMA2_Stream3->PAR = (uint32_t) &SAI1_Block_A->DR;		// адрес приёмника в периферии
	DMA2_Stream3->M0AR = (uint32_t) b.audio_aes_buf0;		// адрес первой половины двойного буфера в памяти
	DMA2_Stream3->M1AR = (uint32_t) b.audio_aes_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
[b]					| DMA_SxCR_MSIZE_0	* 0	// размер данных в памяти
					| DMA_SxCR_MSIZE_1	* 1	// 10: word (32-bit)
					| DMA_SxCR_PSIZE_0	* 0	// размер данных в периферии
					| DMA_SxCR_PSIZE_1	* 1	// 10: word (32-bit)
[/b]					| 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
и в буфер записал правильные данные:

Код: Выделить всё

		for (i = 0; i < 128; i++)
		{
			b.audio_aes_buf0[i] = (uint32_t)b.audio_out_buf0[i] << 8;
		}
Но это не помогло.
Штудировал тактирование AES, остальные режимы AES, RCC по RM0390, пока не нашёл источник проблемы.
Частота тактирования порта не влияет на альтернативные функции, значит не в самом порту дело.

P.S. Где скачать последнюю версию RM0390? У меня ревизия от 17-Mar-2015. Может у меня старый даташит, как это было с распиновкой STM8S?
Последний раз редактировалось GARMIN Чт фев 18, 2016 09:05:40, всего редактировалось 1 раз.
Реклама
Аватара пользователя
dosikus
Друг Кота
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение dosikus »

А без DMA попробовать? Или в Keil в дебаггере вручную потыкать?
Под рукой нет, могу только гадать...
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала.

Сообщение GARMIN »

Вечером попробую без DMA.
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: STM32F446 SAI SPDIF out. Нет выходного сигнала. (решено)

Сообщение GARMIN »

Решено.
Результат исследований: Сначала нашёл SPDIF на выводе B2, а потом и на выводе C1.
Причина - изменение топологии платы (для удобства трассировки по другому разведён тестовый разъём), а бумажная схема была без правок. Я искал SPDIF на другом выводе процессора. ССЗБ.
Результат: теперь знаю даташит до корки.
Благодарю за поддержку, буду тестировать дальше.
Ответить

Вернуться в «ARM»