Автор Тема: SAI протокол (Serial Audio Interface) stm32f429  (Прочитано 12297 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
SAI протокол (Serial Audio Interface) stm32f429
« : Сентябрь 20, 2020, 07:34:03 pm »
SAI протокол (Serial Audio Interface)
Это навороченный i2s
В моем процессоре он есть. И его надо стартануть.
У меня есть проблема в понимании.

Вот настройки sai в CubeMX
И формат данный и формат слота.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #1 : Сентябрь 20, 2020, 07:56:55 pm »
Идет поток данных (пока один канал) но квадратура (в левый и правый каналы)  так считать размер одного замера =32 бита , то есть фактически амплитуды 32битного  АЦП (для простоты понимания). Поток непрерывный.
Что такое FRAME LENGTH? (это вопрос) Он должен совпадать с дампом памяти который я выделил в процессоре, точнее не так...это минимальная длина массива в процессоре, которое должно быть выделено? либо кратно этой цифре.
В Кубе там размер стоит (FRAME LENGTH )от 8 ло 256 бит или от 256 байт и выше за один сэмпл.
Если брать 48000Гц поток то это 20мкСек на один сэмпл. У меня в одной банке 1024 сэмплов ...итого  около 20мСек на один прием.   За 20мСек нужно посчитать смеситель, АРУ, ФИР фильтр, там еще что-то. Круто блин.

Я запутался  в трех соснах. Какой длины должна быть передача(FRAME LENGTH)? И это стерео? 
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #2 : Сентябрь 20, 2020, 08:19:52 pm »
Разобрался.

Все очень просто и логично.
В данном процессоре 8 каналов для звука, можно по SAI гнать. Это 4 канала на левый и 4 канала на правый (слотов). И если размерность амплитуды 32бита, то как раз на общих 8 слотов будет в длину 256 бит или 32 байта за одно передачу. И это все в бесконечном потоке.

Или у меня: 32+32 бита квадратура =64бита FRAME LENGTH.
Или ДМА скушает 8байт за один прием. за 20мкСек. длина буфера получается при 1024 замеров ацп =8192байта.   
« Последнее редактирование: Сентябрь 20, 2020, 08:22:14 pm от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #3 : Сентябрь 20, 2020, 09:24:33 pm »
Пока не могу стартануть на передачу...
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #4 : Сентябрь 20, 2020, 10:21:53 pm »
   HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);
    HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0, 0);
    HAL_SAI_TxCpltCallback(&hsai_BlockA1);
    __HAL_SAI_ENABLE(&hsai_BlockA1);

    HAL_SAI_IRQHandler(&hsai_BlockA1);
    if (HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t *) saiTxBank, 4 * FRAME_SIZE) != HAL_OK) Error_Handler();

Хрен его знает как ТХ запустить через ДМА и чтоб еще прерывание сработало об окончанию.
« Последнее редактирование: Сентябрь 20, 2020, 10:25:25 pm от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн GenaSPB

  • Jr. Member
  • **
  • Сообщений: 74
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #5 : Сентябрь 21, 2020, 12:08:04 am »
Если тактовые сигналы на соответствующий канал а или б приходят, он начнет запрвшивать у dma. Еажется там был бит в слове состояния, который состояние ws показывал? Или то у spi/i2s было... не помню.

Оффлайн GenaSPB

  • Jr. Member
  • **
  • Сообщений: 74
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #6 : Сентябрь 21, 2020, 12:09:24 am »
Прервания от sai при нормальной работе вам и не потребуются.

Оффлайн GenaSPB

  • Jr. Member
  • **
  • Сообщений: 74
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #7 : Сентябрь 21, 2020, 12:10:43 am »
Предполагаю что не приходят. На ws и bclk есть сигналы?

Оффлайн GenaSPB

  • Jr. Member
  • **
  • Сообщений: 74
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #8 : Сентябрь 21, 2020, 12:14:09 am »
Хоть один активный слот в конфигурации стоит?

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #9 : Сентябрь 21, 2020, 06:53:50 am »
Я пытаюсь передать блок в воздух. Не один провод не подключен.

ПЕрвая передача проходит (вроде, нечем смотреть)

    if (hsai_BlockA1.State == HAL_SAI_STATE_READY)
        if (HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t *) saiTxBank, 4*FRAME_SIZE) != HAL_OK) Error_Handler();
 
и после выполнения - тишина, ни прерывание ни callback не срабатывают. 
проверяю состояние =HAL_SAI_STATE_BUSY_TX постоянно.

Может в воздух нельзя передавать?
« Последнее редактирование: Сентябрь 21, 2020, 07:13:32 am от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #10 : Сентябрь 21, 2020, 07:12:28 am »
Вот настройки saiA и DMA
« Последнее редактирование: Сентябрь 21, 2020, 07:18:35 am от ra0ahc »
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #11 : Сентябрь 21, 2020, 11:10:20 am »
SAI TX - нет  cr123

перед вызовом функции ТХ  hsai_BlockA1.State=READY дает....ну готов значит sai к TX
Дальше:
        if (HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t *) saiTxBank, 4 ) != HAL_OK) Error_Handler();

дает HAL_OK. Значит функция работает корректно.


HAL_StatusTypeDef HAL_SAI_Transmit_DMA(SAI_HandleTypeDef *hsai, uint8_t *pData, uint16_t Size)
{
  if((pData == NULL) || (Size == 0))
  {
    return  HAL_ERROR;
  }

  if(hsai->State == HAL_SAI_STATE_READY)
  {
    /* Process Locked */
    __HAL_LOCK(hsai);

    hsai->pBuffPtr = pData;
    hsai->XferSize = Size;
    hsai->XferCount = Size;
    hsai->ErrorCode = HAL_SAI_ERROR_NONE;
    hsai->State = HAL_SAI_STATE_BUSY_TX;

    /* Set the SAI Tx DMA Half transfer complete callback */
    hsai->hdmatx->XferHalfCpltCallback = SAI_DMATxHalfCplt;

    /* Set the SAI TxDMA transfer complete callback */
    hsai->hdmatx->XferCpltCallback = SAI_DMATxCplt;

    /* Set the DMA error callback */
    hsai->hdmatx->XferErrorCallback = SAI_DMAError;

    /* Set the DMA Tx abort callback */
    hsai->hdmatx->XferAbortCallback = NULL;

    /* Enable the Tx DMA Stream */
    if(HAL_DMA_Start_IT(hsai->hdmatx, (uint32_t)hsai->pBuffPtr, (uint32_t)&hsai->Instance->DR, hsai->XferSize) != HAL_OK)
    {
      __HAL_UNLOCK(hsai);
      return  HAL_ERROR;
    }

    /* Check if the SAI is already enabled */
    if((hsai->Instance->CR1 & SAI_xCR1_SAIEN) == RESET)
    {
      /* Enable SAI peripheral */
      __HAL_SAI_ENABLE(hsai);
    }

    /* Enable the interrupts for error handling */
    __HAL_SAI_ENABLE_IT(hsai, SAI_InterruptFlag(hsai, SAI_MODE_DMA));

    /* Enable SAI Tx DMA Request */
    hsai->Instance->CR1 |= SAI_xCR1_DMAEN;

    /* Process Unlocked */
    __HAL_UNLOCK(hsai);

    return HAL_OK;
  }
  else
  {
    return HAL_BUSY;
  }
}



самая основная функция "красная" и она тоже дает = HAL_OK.
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #12 : Сентябрь 21, 2020, 11:14:05 am »
Но после выполнения HAL_SAI_Transmit_DMA, статус становится hsai_BlockA1.State =BUSY
И так и остается в таком положении...
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #13 : Сентябрь 21, 2020, 11:43:47 am »
И  HAL_SAI_Transmit просто даже эта команда вылетает с ошибкой по таймауту , без всяких ДМА.

Я явно делаю что-то не то. no88 
Да да, я знаю, у меня ничего не получится )))

Оффлайн ra0ahc

  • Hero Member
  • *****
  • Сообщений: 4872
  • Сергей, RD6AH
Re: SAI протокол (Serial Audio Interface) stm32f429
« Ответ #14 : Сентябрь 21, 2020, 02:21:53 pm »
HAL_SAI_Transmit_DMA
Работает, исправил настройки слотов. 

С приемом номер не прошел.
Хочу через А канал передавать, по каналу В принимать. ВСе синхро выводы у них соединены, только ДАТА надо кинуть проводком (которого нет)


Настройки канала А (ТХ)
« Последнее редактирование: Сентябрь 21, 2020, 02:24:46 pm от ra0ahc »
Да да, я знаю, у меня ничего не получится )))