Страница 9 из 36 Первая ... 789101119 ... Последняя
Показано с 161 по 180 из 709

Тема: Дешевый USB transport (для саморазвития)?

  1. #1 Показать/скрыть первое сообщение.
    Завсегдатай
    Автор темы
    Аватар для antonluba
    Регистрация
    12.12.2014
    Адрес
    Сочи, Коломна
    Возраст
    47
    Сообщений
    1,101

    По умолчанию Дешевый USB transport (для саморазвития)?

    Идея такая: берется STM32F4xx. У него есть USB и I2S. Проц и USB тактируется от HSE - кварц на необходимое кол-во МГц+PLL. Через USB в асинхронном режиме выводится аудио поток.
    Для I2S вариантов тактирования два: от PLL с соответствующим снижением качества или от ЦАПа на специальный вход модуля I2S.
    Модуль I2S поддерживает форматы Philips, RJ, LJ, PCM, 16 или 32 бит до 96 192 кГц. (Вы это всё знаете, конечно).
    Теоретически, можно получить универсальный вывод (ввод тоже) I2S через USB (для многих, думаю, достаточного уровня).

    Лично у меня сложности следующие:
    1. Исходники асинхронного вывода (и ввода) по USB.
    2. Получение от хоста параметров потока и переключение частот.
    3. Аппаратная реализация работы двух генераторов на один вход.
    4. Внутренняя синхронизация между I2S и USB.
    Ну и еще мелочей всяких.

    Набросайте ссылок по теме, пожалуйста.

    P.S. Audio Widget я конечно, скачал, но, честно говоря, разобраться пока не смог.
    Последний раз редактировалось antonluba; 25.10.2015 в 21:47.

  2. #161
    Частый гость
    Регистрация
    28.03.2015
    Сообщений
    153

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Мне эта прога очень помогла разбираться с обратной связью. Она и писать значения в переменные умеет.

  3. #162
    Частый гость Аватар для ntechmen
    Регистрация
    03.03.2012
    Адрес
    Кемерово
    Сообщений
    249

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    после вызова usbd_init в main.c


    вызывается этот код в файле usbd_usr.c

    void USBD_USR_Init(void)
    {
    /* Setup SysTick Timer for 40 msec interrupts
    This interrupt is used to probe the joystick */
    if (SysTick_Config(SystemCoreClock / 24))
    {
    /* Capture error */
    while (1);
    }
    }

    а оно нам надо?

    ---------- Сообщение добавлено 18:48 ---------- Предыдущее сообщение было 18:43 ----------

    для чего используется пин PD1 как вход?

    вот этот вот участок кода

    //настройка выводов аудио данных
    //проходной вход для I2S
    gpio.GPIO_Pin = GPIO_Pin_1;
    gpio.GPIO_Mode = GPIO_Mode_IN;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &gpio);

    ---------- Сообщение добавлено 18:55 ---------- Предыдущее сообщение было 18:48 ----------

    есть генераторы 44.1584/49.152 по коду где-то прескалер надо задавать, места не подскажите?

  4. #163
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от ntechmen Посмотреть сообщение
    после вызова usbd_init в main.c


    вызывается этот код в файле usbd_usr.c

    void USBD_USR_Init(void)
    {
    /* Setup SysTick Timer for 40 msec interrupts
    This interrupt is used to probe the joystick */
    if (SysTick_Config(SystemCoreClock / 24))
    {
    /* Capture error */
    while (1);
    }
    }

    а оно нам надо?
    Так было в проекте, из которого я переделывал, оно не мешает.

    Цитата Сообщение от ntechmen Посмотреть сообщение
    для чего используется пин PD1 как вход?

    вот этот вот участок кода

    //настройка выводов аудио данных
    //проходной вход для I2S
    gpio.GPIO_Pin = GPIO_Pin_1;
    gpio.GPIO_Mode = GPIO_Mode_IN;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &gpio);
    У меня самодельная двухсторонняя печатная плата (кроме DISCOVERY) и завести MCLK на нужную ногу было проблематично, поэтому я соединил PC9 и PD1 под контроллером и подал сигнал с генератора на PD1, сконфигурировав его как вход, можете смело этот участок выкидывать.

    Цитата Сообщение от ntechmen Посмотреть сообщение
    есть генераторы 44.1584/49.152 по коду где-то прескалер надо задавать, места не подскажите?
    В usbd_audio_core.c в функции AUDIO_Req_SetCurrent() где идет выбор частоты в строках SPI3->I2SPR = 0x000х вместо 4 ставите 8, а вместо 2 - 4. Так же в usbd_audio_out_if.c
    в функции Init() в аналогичных строках делаете то же самое.

  5. #164
    Не хочу! Аватар для Alex
    Регистрация
    20.03.2003
    Адрес
    Worldwide
    Возраст
    62
    Сообщений
    38,801

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    поэтому я соединил PC9 и PD1 под контроллером и подал сигнал с генератора на PD1, сконфигурировав его как вход, можете смело этот участок выкидывать.
    Его можно в любом случае выкидывать, т.к. STM32 по сбросу ставит все (ну почти все) I/O на вход без пуллапов/пуллдаунов.
    Если проект Кубом генерировался, то там можно настроить чтобы все незанятые ноги переводились а аналоговый вход - это для того, чтобы если на какой-то ноге не 0 и не 1 а что-то между, то не было повышенного потребления тока. Но если там цифровой сигнал, то этого не нужно, он и так как цифровой вход по сбросу.
    "Замполит, чайку?"(с)"Охота за Красным Октябрем".
    "Да мне-то что, меняйтесь!"(с)анек.
    <-- http://altor1.narod.ru --> Вопросы - в личку, е-мейл, скайп.

  6. #165
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Я перестраховался.

  7. #166
    Частый гость Аватар для ntechmen
    Регистрация
    03.03.2012
    Адрес
    Кемерово
    Сообщений
    249

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    для чего tim7 используется?

  8. #167
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Я вроде в последнем выложенном проекте это закоментировал, а изначально это период замера напряжения аккумуляторной батареи портативного ЦАП (TIM10 тоже из этой оперы). Посмотрите в посту №150, там уже без этой приблуды.

  9. #168
    Частый гость Аватар для ntechmen
    Регистрация
    03.03.2012
    Адрес
    Кемерово
    Сообщений
    249

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Собрал, платку и код под 205 с минимальными переделками, добавил вывод I2S_MCK с проца, устройство определяется под win8.1 поток выводится,
    но нет сигнала I2S_WS,
    и вот такой момент заметил,
    I2S_CK так сказать "дрожит" на осцилографе (осциллограф не может захватить синхронизацию) после определения в windows и выводе потока на 44100 (второй ген не зацеплен),
    но если зайти в свойства устройства и принудительно выставить 44100 нажать тестировать, то частота на I2S_CK становится стабильной. 2.8 мгц.

  10. #169
    Частый гость
    Регистрация
    28.03.2015
    Сообщений
    153

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    В демке от ST написано чуть по-другому. В колбэке setup request сохраняем параметры и взводим флаг, что надо обработать.
    А сам запрос можно уже обрабатывать в колбэке usbd_audio_EP0_RxReady, используя сохраненный запрос и значения флагов, которые нужно обнулить после отработки запроса.
    Код:
    struct  usb_setup_req USB_SETUP_REQ2;
    
    
    /**
      * @brief  AUDIO_Req_SetCurrent
      *         Handles the SET_CUR Audio control request.
      * @param  pdev: instance
      * @param  req: setup class request
      * @retval status
      */
    static void AUDIO_Req_SetCurrent(void *pdev, USB_SETUP_REQ *req)
    {
      if (req->wLength)
      {
        /* Prepare the reception of the buffer over EP0 */
        USBD_CtlPrepareRx (pdev,
                           AudioCtl,
                           req->wLength);
    
    
        /* Set the global variables indicating current request and its length
        to the function usbd_audio_EP0_RxReady() which will process the request */
        AudioCtlCmd = AUDIO_REQ_SET_CUR;     /* Set the request value */
        AudioCtlLen = req->wLength;          /* Set the request data length */
        AudioCtlUnit = HIBYTE(req->wIndex);  /* Set the request target unit */
        USB_SETUP_REQ2=*req;
      }
    }
    
    
    static uint8_t  usbd_audio_EP0_RxReady (void  *pdev)
      {
        uint32_t temp;
      	/* Check if an AudioControl request has been issued */
        if (AudioCtlCmd == AUDIO_REQ_SET_CUR)
        {/* In this driver, to simplify code, only SET_CUR request is managed */
          /* Check for which addressed unit the AudioControl request has been issued */
        	AUDIO_Req_SetCurrent2(&USB_SETUP_REQ2);
      	/*if (AudioCtlUnit == AUDIO_OUT_STREAMING_CTRL)
          {// In this driver, to simplify code, only one unit is manage
            // Call the audio interface mute function
            AUDIO_OUT_fops.MuteCtl(AudioCtl[0]);
    
    
    
    
          }*/
        /* Reset the AudioCtlCmd variable to prevent re-entering this function */
        AudioCtlCmd = 0;
        AudioCtlLen = 0;
        }
    /*    if (AudioCtlCmd == AUDIO_REQ_GET_CUR)
          {
        	  temp=48000;
           AudioCtl[0]=(uint8_t)(temp&0xff);
           AudioCtl[1]=(uint8_t)((temp>>8)&0xff);
           AudioCtl[2]=(uint8_t)((temp>>16)&0xff);
          //Reset the AudioCtlCmd variable to prevent re-entering this function
          AudioCtlCmd = 0;
          AudioCtlLen = 0;
          }
    */
        return USBD_OK;
      }
    
    
    static void AUDIO_Req_SetCurrent2(USB_SETUP_REQ *req)
    { 
    	if (req->wLength)
    	{
    		/* Prepare the reception of the buffer over EP0 */
        	//USBD_CtlPrepareRx (pdev,\
                           	   AudioCtl,\
                           	   req->wLength);
        
        	if (HIBYTE(req->wValue) == SAMPLING_FREQ_MUTE_CONTROL)//если команда SAMPLING_FREQ_CONTROL или MUTE
        	{
        		if ((req->bmRequest & 0x0f) == ENDPOINT_REQUEST_TYPE)//если запрос к конечной точке
        		{
        			//считываем значение частоты
        			Sampling_freq = (*(uint32_t *)&AudioCtl[0]) & 0x00ffffff;
        			//управление внешними генераторами и выбор FB_RATE для разных частот
        			switch (Sampling_freq)
        			{
        				case 44100 :
        				{
        					FB_NOM = (44 << 14) + (1 << 14) / 10;
        					//SPI3->I2SPR = 0x0004;//коэффициент деления I2S = 4
        					 SetI2SMCLK(Sampling_freq);
        					GEN2_OFF;
        					GEN1_ON;
        				};break;
        				case 48000 :
        				{
        					FB_NOM = 48 << 14;
        					//SPI3->I2SPR = 0x0004;//коэффициент деления I2S = 4
        					SetI2SMCLK(Sampling_freq);
        					GEN1_OFF;
        					GEN2_ON;
        				};break;
        				case 88200 :
        				{
        					FB_NOM = (88 << 14) + (2 << 14) / 10;
        					//SPI3->I2SPR = 0x0002;//коэффициент деления I2S = 2
        					SetI2SMCLK(Sampling_freq);
        					GEN2_OFF;
        					GEN1_ON;
        				};break;
        				case 96000 :
        				{
        					FB_NOM = 96 << 14;
        					//SPI3->I2SPR = 0x0002;//коэффициент деления I2S = 2
        					SetI2SMCLK(Sampling_freq);
        					GEN1_OFF;
        					GEN2_ON;
        				};break;
        				case 192000 :
        				{
        					FB_NOM = 192 << 14;
        					//SPI3->I2SPR = 0x0002;//коэффициент деления I2S = 2
        					SetI2SMCLK(Sampling_freq);
        					GEN1_OFF;
        					GEN2_ON;
        				};break;
        			}
        			FB_RATE = FB_NOM;
        			delta_num = 0;
        			PlayStart = 0;
        			spk_buffer_in = 0;
        			spk_buffer_out = 0;
        			spk_index = 0;
        			delta_num = 0;
        			old_gap = AUDIO_BUFFER_SIZE;
        		}
        		else if (HIBYTE(req->wIndex) == AUDIO_OUT_STREAMING_CTRL)//иначе это команда MUTE
        		{
        			mute = AudioCtl[0];
    //    			if (mute) GPIO_SetBits(GPIOB,GPIO_Pin_4);
    //    			else GPIO_ResetBits(GPIOB,GPIO_Pin_4);
        		}
        	}
    	}
    }
    Криво, конечно, но работает.
    Последний раз редактировалось romanetz; 23.10.2016 в 13:53. Причина: Разбирался с запросами

  11. #170
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    ntechmen - ну, во первых, зачем вам выводить MCLK с контроллера, если он и так внешний - его же и используйте для тактирования ЦАП - это более правильно, к тому же для MCLK OUT используется большой делитель и с вашими генераторами не получить 88,2-96 :
    Нажмите на изображение для увеличения. 

Название:	STM32F205_i2s.jpg 
Просмотров:	204 
Размер:	216.8 Кб 
ID:	277024
    Еще раз посмотрите, какой вывод у вас используется для I2S_WS, т.к., например, в кубе изначально предлагают PA4 (наверное вы его и используете), а я сконфигурировал его на PA15.
    А насчет
    I2S_CK, то хост только дает команду на переключение частоты, а I2S_CK получается после деления I2S_CKIN и выводится блоком SPI3 мастером вне зависимости от windows до следующей смены частоты, так что никакого "дрожания" не должно быть.

    ---------- Сообщение добавлено 11:15 ---------- Предыдущее сообщение было 11:06 ----------

    romanetz о каких именно переменных идет речь? Я пока использовал для воспроизведения андроид-устройство, может с windows тоже полезут проблемы - сегодня попробую.

  12. #171
    Частый гость
    Регистрация
    28.03.2015
    Сообщений
    153

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    В системном логе, выводимом командой dmesg нет сообщений о несоответствии текущей частоты воспроизведения установленной? Просто драйвер выдает команду повторно, на второй раз она отрабатывала у меня.

  13. #172
    Частый гость Аватар для ntechmen
    Регистрация
    03.03.2012
    Адрес
    Кемерово
    Сообщений
    249

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от romanetz Посмотреть сообщение
    Еще один момент с выбором тактовой частоты, у меня почему-то порой работает только через раз. Вылечилось добавлением __attribute__((aligned(4))) ко всем причастным к этому действию переменным.
    Каким компилятором собираете?

    C WS пока не могу разобраться,
    вот инициализация GPIO

    //CODEC_I2S pins configuration: WS
    gpio.GPIO_Pin = GPIO_Pin_15 ;
    gpio.GPIO_Mode = GPIO_Mode_AF;
    gpio.GPIO_Speed = GPIO_Speed_100MHz;
    gpio.GPIO_OType = GPIO_OType_PP;
    gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &gpio);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_SPI3);

    вроде все правильно

  14. #173
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Просто проверьте, что на плате WS подключен к PA15, а не к PA4, а иначе в конфигурации вывода поменяйте 15 на 4.

  15. #174
    Частый гость
    Регистрация
    28.03.2015
    Сообщений
    153

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Arm-none-eabi-gcc

  16. #175
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от romanetz Посмотреть сообщение
    Вылечилось добавлением __attribute__((aligned(4))) ко всем причастным к этому действию переменным.
    Скорее всего выравнивание нужно только для Sampling_freq (ну, может быть еще FB_NOM и FB_RATE), вероятно какая то особенность gcc - получалась неправильная запись значения частоты и оператор switch() не видел совпадений, да и в хост при запросе отправлялось неправильное значение. К стати, возможно у вас без выравнивания FB_NOM и FB_RATE так же в них записывались неправильные значения и обратная связь работала странно.

  17. #176
    Частый гость Аватар для ntechmen
    Регистрация
    03.03.2012
    Адрес
    Кемерово
    Сообщений
    249

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от romanetz Посмотреть сообщение
    Arm-none-eabi-gcc
    у GCC могут быть приколы, с оптимизациями, у меня вот это код перестает вообще работать на оптимизации O1. работаю на TrueStudio 5.0 lite ломаной, toolchain на GCC.
    Так вот этот код с оптимизацией -O1 gcc версии 4.6.3 компилировать не хотел, выдавал ошибку. Оказалось bug в компиляторе который убрали только 8.3, пришлось новый gcc прикручивать.

    С WS так и не могу разобраться, почти все перепробовал , похоже какие-то траблы с I2s модулем, надо erra-ту на 205 процессор читать.

  18. #177
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Я вообще отключил оптимизацию, с ней были проблемы.

  19. #178
    Частый гость Аватар для ntechmen
    Регистрация
    03.03.2012
    Адрес
    Кемерово
    Сообщений
    249

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от vladsan75 Посмотреть сообщение
    Я вообще отключил оптимизацию, с ней были проблемы.
    Вот, вот где то есть проблемы в коде. Должно все отлично работать на оптимизированном коде. Похоже где-то с переполнением стека проблемы или оптимизатор с оптимизировал глобальные переменные,
    некоторые переменные надо объявлять через volatile или __IO.

  20. #179
    Частый гость
    Регистрация
    28.03.2015
    Сообщений
    153

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Обновил пост выше про установку частоты, смотрите.
    И с -Os оптимизацией работает, и без нее
    По другой ветке проекта (UAC2).
    Поток выводится в звуковое устройство, но звука пока нет. Проблема точно не в железе, надо дескрипторы править, видимо.
    Последний раз редактировалось romanetz; 23.10.2016 в 14:22.

  21. #180
    Частый гость Аватар для vladsan75
    Регистрация
    06.06.2010
    Адрес
    г.Саратов
    Возраст
    50
    Сообщений
    447

    По умолчанию Re: Дешевый USB transport (для саморазвития)?

    Цитата Сообщение от romanetz Посмотреть сообщение
    Обновил пост выше про установку частоты, смотрите.
    Возможно при использовании I2SPLL запрос обрабатывается долго и возможны сбои, но в моем случае с внешним клоком usbd_audio_EP0_RxReady - это просто дополнительный костыль, у меня все работает стабильно и без сбоев.
    ntechmen - насчет volatile вы правы, но у меня и так полно свободного места в памяти и скорости вполне хватает, поэтому оптимизация мне ни к чему.

    ---------- Сообщение добавлено 17:12 ---------- Предыдущее сообщение было 14:53 ----------

    Сейчас наблюдал в STM Studio работу обратной связи на андроид-смартфон : сначала gap со значения 6144 медленно, в течение 6-7 композиций, снижается до 4608, FB_RATE скачком изменяется с 722534 на 722470 ( т.е. на 64). Потом в течение одной композиции gap растет до 7680 и FB_RATE опять становится 722534 и следует опять долгое снижение gap до 4608, т.е. все идет строго по алгоритму. Во время паузы, когда нет пакетов OUT, gap хаотичной пилой изменяется в пределах 4608-7680, в общем, все работает как надо. Потом проверю в windows.

Страница 9 из 36 Первая ... 789101119 ... Последняя

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

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