Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-авг-22 05:55

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-10 15:28 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 60
Откуда: НИЯУ МИФИ
Приветствую.

Запускаю I2S аудио кодек TVL320AIC23B.
Ему нужен для настройки SPI, но на плате он подключен не к SPI, а к:
РА19(SSI1_TCLK) - он же SPI_CLOCK у кодека.
РА22(SSI1_RCLK) - он же SPI_DIN у кодека.
РА20(SSI1_TFS) - он же SPI_CS у кодека.

Вопрос. как это должно работать?
В доке на 1967bv034 не обнаружил описание SSI шины (хотя она вроде совместима с SPI).
Не обнаружил хала для ssi.

Нужно городить програмный SPI?
Нет ли случайно примеров кода? :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-10 18:13 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
SSI и SPI в данном случае разные штуки.

Выслал вам пример в котором использовался аудиокодек.
Вот только не уверен подойдет ли это к плате ВН34.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-10 18:16 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 60
Откуда: НИЯУ МИФИ
Спасибо!

BY_man писал(а):
Вот только не уверен подойдет ли это к плате ВН34.

Эх..


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-10 18:24 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
я старался найти как можно более старый проект. Всё это запускалось когда-то на ВН34,
но после появления ВН44, адаптировалось под новую плату. Менялась ли аудио часть или нет я уже не помню.
Напишите еще в техподдержку. Должны найти у кого-нибудь файлы для ВН34.
Там черт знает скока настроек :D


Последний раз редактировалось BY_man 2019-июн-10 18:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-10 18:24 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 60
Откуда: НИЯУ МИФИ
Я из хала для 044 добавил себе в проект (под 034) hal_audio.h/.c

Надеюсь заработает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-11 04:49 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 60
Откуда: НИЯУ МИФИ
Пока ничего не заработало, но заранее неясно как принимать данные с микрофона.
Кодек умеет и выдавать звук в оба канала и оцифровывать данные с микрофона.

Кодек настроил в режиме мастера. То есть после инициализации он сразу начинает генерировать I2S_BIT_CLOCK и присылать мне данные с микрофона.
Но как мне их считать?
В хале я вижу только функцию, чтобы отправить аудио:
Код:
  void HAL_AUDIO_StartDMA(uint32_t channel,
                                               AUDIO_type* const AudioX,
                                               void *pvDataBuf,
                                               uint16_t usSize,
                                               void* pvDmaIsrHandler);

То есть в неё я должен подать свои аудиоданные, которые i2s контроллер отправит в кодек по старту клока от него.

I2S полнодуплексный интерфейс. Значит одновременно с отправкой звука я "где-то" получаю данные с микрофона от кодека, но вот где? :?: :D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-11 06:48 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 60
Откуда: НИЯУ МИФИ
Полагаю, что просто надо включить прерывание по заполнению приёмного фифо i2s и там уже вычитывать данные в свой буфер?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-11 08:42 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
да, передающее фифо для динамиков, а приемное для микрофона:)
В регистре управления (номер 2) есть биты воспроизведения и записи.
Лучше для приема тоже приспособить канал ДМА и прерываться на какой-то кусок аудиоданных.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-13 04:37 
Не в сети

Зарегистрирован: 2019-апр-23 17:27
Сообщения: 60
Откуда: НИЯУ МИФИ
Настроил I2S так:
Код:
  // init I2S gpio
  HAL_GPIO_Init(LX_GPIO_PA,
                GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 | \
                GPIO_PIN_16 | GPIO_PIN_17 | GPIO_PIN_18,
                GPIO_PinMode_Alt);

  // clock I2S enable
  LX_CMU->CFG8.b.I2S0_EN = 0;

  // reset tx/rx FIFO state machine to start position
  LX_AUDIO0->SICR0.word = 0x00000000;
  LX_AUDIO0->SICR0.b.RST = 1;
  StupidDelayMs(10);
  LX_AUDIO0->SICR0.b.RST = 0;
  LX_AUDIO0->SIADR = 0;

  // stereo 16 bit out and 16 bit stereo in
  LX_AUDIO0->SICR0.b.MONO_DA = 0;
  LX_AUDIO0->SICR0.b.BIT8_DA = 0;
  LX_AUDIO0->SICR0.b.BIT8_AD = 0;
  LX_AUDIO0->SICR0.b.MONO_AD = 0;

  // allow tx and rx
  LX_AUDIO0->SICR2.b.REQLP = usReqlp;
  LX_AUDIO0->SICR2.b.ERPL = 1;
  LX_AUDIO0->SICR2.b.EREC = 1;

  // I2S transmitter
  LX_AUDIO0->I2S_T_CR.b.TEN = 1;
  LX_AUDIO0->I2S_T_CR.b.MODE = MODE_I2S;
  LX_AUDIO0->I2S_T_CR.b.SONY = STANDART_PHILLIPS;
  LX_AUDIO0->I2S_T_CR.b.MS = ROLE_SLAVE;
  LX_AUDIO0->I2S_T_CR.b.DSS = DATA_LEN_BIT - 1;
  LX_AUDIO0->I2S_T_CR.b.PNOS = 0;
  LX_AUDIO0->I2S_T_CR.b.SWHW = 0;
  if(DATA_LEN_BIT <= 16) {
    LX_AUDIO0->I2S_T_CR.b.PACKH = 1;
  } else {
    LX_AUDIO0->I2S_T_CR.b.PACKH = 0;
  }

  // I2S receiver
  LX_AUDIO0->I2S_R_CR.b.REN = 1;
  LX_AUDIO0->I2S_R_CR.b.MODE = MODE_I2S;
  LX_AUDIO0->I2S_R_CR.b.SONY = STANDART_PHILLIPS;
  LX_AUDIO0->I2S_R_CR.b.MS = ROLE_SLAVE;
  LX_AUDIO0->I2S_R_CR.b.DSS = DATA_LEN_BIT - 1;
  LX_AUDIO0->I2S_R_CR.b.PNOS = 0;
  LX_AUDIO0->I2S_R_CR.b.SWHW = 0;

А DMA вот так:
Код:
uint32_t *ptr = ( uint32_t* ) &audioTcbRx;
  HAL_DMA_Stop(9);
  *( ptr + 0 ) = ( uint32_t ) (адрес внешней памяти);
  *( ptr + 1 ) = ( usSize << 16 ) | 1;
  *( ptr + 2 ) = 0;
  *( ptr + 3 ) = TCB_NORMAL;
  *( ptr + 3 ) |=   ((uint32_t)pvDataBuf < 0x0C000000) ? TCB_INTMEM : TCB_EXTMEM;
HAL_DMA_RqstSet( ulChannel, dmaSSI0 );
HAL_Interrupt_SubscribeHandler(intDMA9, pvDmaIsrHandler);
HAL_Interrupt_Enable(intDMA9);
HAL_DMA_WriteDC( ulChannel, &audioTcbRx );


Регистра статуса канала DMA говорит, что канал "работает", а через некоторое время говорит, что "завершил работу".
Но прерываний нет по DMA.

Пробовал просто включить прерывания от интерфейса:
Код:
  HAL_Interrupt_SubscribeHandler(intSSI0, AudioDoneReceiveIrqHandler);
  HAL_Interrupt_Enable(intSSI0);

Но и они не генерятся.
Что это может означать? Неверная настрокай кодека?
Кодек отлично воспроизводит звук, но вот принять с микрофона что-то не могу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: АудиоКодек/SPI
СообщениеДобавлено: 2019-июн-13 09:27 
Не в сети

Зарегистрирован: 2014-авг-15 11:04
Сообщения: 199
Откуда: Миландр
Очень тяжело что-то сказать по коду HAL.
С прерываниями всё просто.
1. Смотрите , что в настройках DMA канала у вас установлен бит INT, разрешающий генерацию прерывания.
2. Убеждаетесь, что канал отработал без ошибок (по статусу).
3. В контроллере прерываний смотрите ILAT регистр и убеждаетесь, что импульс прерывания там защелкнулся.
4. Смотрите что в IMASK разрешено это прерывание.
5. В SQCTL должны быть разрешены глобальные прерывания (бит GIE).
6. Cмотрите SQSTAT и убеждаетесь, что процессор в это время не обрабатывает другое прерывание

Вот если бы Вы мне hex коды этих регистров напечатали, а не какой-то HAL, то тогда был бы предметный разговор :)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB