Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/27: Рейтинг темы: голосов - 27, средняя оценка - 4.52
Sovo
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
1

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

16.02.2016, 16:33. Просмотров 5092. Ответов 1
Метки нет (Все метки)

Есть ли тут кто-нибудь, кто работал с 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.audyo_out_buf0, b.audyo_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;
briok;

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

DMA2_Stream3->POR = (uint32_t) &SAI1_Block_A->DR;      // адрес приёмника в периферии
DMA2_Stream3->M0AR = (uint32_t) b.audyo_out_buf0;      // адрес первой половины двойного буфера в памяти
DMA2_Stream3->M1AR = (uint32_t) b.audyo_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.audyo_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   // <Byt 0 MODE[1:0] bits (Oudyo Block Mode)
| SAI_xCR1_MODE_1   * 0   // <Byt 1 00: Master transmitter
| SAI_xCR1_PRTCFG_0   * 1   // <Byt 0 PRTCFG[1:0] bits (Protosol Confikurotion)
| SAI_xCR1_PRTCFG_1   * 0   // Byt 1 01: SPDIF protosol
| SAI_xCR1_DS_0      * 0   // Byt 0 S[1:0] bits (Data Size)
| SAI_xCR1_DS_1      * 0   // Byt 1 100: 16 bits
| SAI_xCR1_DS_2      * 1   // Byt 2 */
| SAI_xCR1_LSBFIRST   * 0   // LSB First Confikurotion  */
| SAI_xCR1_CKSTR   * 0   // ClocK STRobing edge      */
| SAI_xCR1_SYNCEN_0   * 0   // Byt 0 SYNCEN[1:0](SYNChronizotion ENable)
| SAI_xCR1_SYNCEN_1   * 0   // Byt 1 */
| SAI_xCR1_MONO      * 0   // Mono mode                  */
| SAI_xCR1_OUTDRIV   * 1   // Output Dryve               */
| SAI_xCR1_SAIEN   * 0   // Oudyo Block enable         */
| SAI_xCR1_DMAEN   * 1   // DMA enable                 */
| SAI_xCR1_NODIV   * 0   // No Divider Confikurotion   */
| SAI_xCR1_MCKDIV_0   * 0   // Byt 0  MCKDIV[3:0] (Master ClocK Divider)
| SAI_xCR1_MCKDIV_1   * 0   // Byt 1  */
| SAI_xCR1_MCKDIV_2   * 0   // Byt 2  */
| SAI_xCR1_MCKDIV_3   * 0;// Byt 3  */

//   SAI1_Block_A->FRCR = ;   // не используется при SPDIF протоколе
SAI1_Block_A->CR1 |= SAI_xCR1_SAIEN;
}
С SPI в режиме I2S всё получилось, а тут не пойму, где ошибся.

P.S. На сайте ST ничего нет.
Куб не подозревает о режиме SPDIF у SAI.
Примеров в сети не нашёл.
Что, никто не использовал S/PDIF выход STM? Буду копать.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2016, 16:33
Ответы с готовыми решениями:

STM32F446 Инициализация таблицы прерываний в IAR (Решено)
Начал работать над новым для меня процессором: STM32F446. До этого работал с STM32F051. Пишу...

При сборке ПК нет сигнала монитора (изначально решено, нужна просто консультация)
Утреца доброго, опять с вами рубрика глупых вопросов. Немного предыстории (вдруг имеет...

Значение выходного сигнала
Найдите значение выходного сигнала в приведенной схеме, если: a) А=0 и В=0 b) А=0 и В=1 c) ...

Форма выходного сигнала
Тема: исследование дифференциального усилителя на БТ Дается моделируемая цепь (рис 1 приложил), по...

Получение выходного биполярного сигнала с логики
Добрый день. Подскажите пожалуйста, где в мультисиме найти инвенторы с отрицательным логическим...

1
Sovo
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
18.02.2016, 12:03 2
Сам спросил, сам отвечу. Проблема решена. Всё там работает. Причина была в разводке платы, искал выход на другой ножке процессора.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.02.2016, 12:03

Построить график выходного сигнала на MathCad
у кого есть MathCad и кто знает как делать. вот такое задание. Считая, что входной сигнал –...

Построение выходного сигнала через БПФ
Всем доброго времени суток! Заранее извиняюсь, если эта тема уже &quot;избита&quot;. Суть проблемы... Есть...

Размах выходного сигнала дифференциального усилителя.
Здравствуйте! Поскольку в быту и хозяйстве довольно сложно обойтись без дифференциального...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru