Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F446 SAI SPDIF OUT
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Garmin
Есть ли тут кто-нибудь, кто работал с S/PDIF выходом в STM32F446?
Инициализирую, но не получаю на выходе сигнала. Только +3,3В.
Что делаю:
1) разрешаю тактирование SAI, DMA, и порта B
2) запускаю PLL_SAI
3) устанавливаю источник тактирования SAI
4) конфигурирую вывод порта как альтернативную функцию.
5) конфигурирую DMA
6) разрешаю прерывания DMA
7) разрешаю SAI.

В отладчике видны изменения регистров, видны регистры DMA и PLL, но на выходе сигнала нет.
Вот код инициализации:
CODE
/*******************************************************************************
* Инициализация блока 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.
Примеров в сети не нашёл.

Garmin
Всё заработало. Проблема была в разводке платы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.