Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

Использование I2S в качестве генератора частоты

Тема в разделе "SDK и создание собственных прошивок", создана пользователем vad7, 30 янв 2017.

  1. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    402
    Симпатии:
    48
    Пробую заставить I2S работать как генератор частоты. Готовой библиотеки не нашел.
    Собрал i2s.c на основе i2s_freertos.c (mp3_decoder) и ардуиновской core_esp8266_i2s.c.

    Запускаю i2sInit(153600, 0, 0xAAAAAAAA) - получаю сброс/эксепшн после "os_printf("1.4\n");" на WRITE_PERI_REG(SLC_INT_ENA, SLC_RX_EOF_INT_ENA).
    Если закомментить эту строку, то падает на следующим доступе к регистрам SLC.
    Чего ему не хватает то?
     

    Вложения:

    • i2s.c
      Размер файла:
      11 КБ
      Просмотров:
      0
    • i2s.h
      Размер файла:
      493 байт
      Просмотров:
      0
  2. Victor

    Victor Administrator Команда форума

    Сообщения:
    2.224
    Симпатии:
    389
  3. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    402
    Симпатии:
    48
    У меня даже это не работает: Настройка I2S, нужна помощь

    Падение на первой строчке. Я правда, вебсвалку использую, может какой инициализации не хватает или наоборот, что "подкручено"...

    Ps. Ага - ошибка в esp8266.h.
     
    Последнее редактирование: 5 фев 2017
  4. clinkme

    clinkme Новичок

    Сообщения:
    32
    Симпатии:
    3
    Вот простой код для IR-передатчика (частоты 36-40 кГц) на базе non-os SDK (любой версии).
    В качестве выхода использует пин I2SO_WS (GPIO2).

    Код (Text):
    1. void ICACHE_FLASH_ATTR ir_carrier_init(int khz) {
    2.     uint32_t bck, clkm;
    3.    
    4.     //Enable a 160MHz clock to i2s subsystem
    5.     rom_i2c_writeReg_Mask(i2c_bbpll, i2c_bbpll_hostid, i2c_bbpll_en_audio_clock_out,
    6.                             i2c_bbpll_en_audio_clock_out_msb, i2c_bbpll_en_audio_clock_out_lsb, 1);
    7.    
    8.     //Reset I2S (?)
    9.     CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);
    10.     SET_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);
    11.     CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);
    12.    
    13.     switch(khz) {
    14.         /* 160000000/bck/clkm/2/(bits+16) */
    15.         case 36: bck = 26; clkm = 5; break; //36199
    16.         case 37: bck = 32; clkm = 4; break; //36764          
    17.         case 40: bck = 59; clkm = 2; break; //39880
    18.         case 38: //break through
    19.         default: //bck = 62; clkm = 2;        //37950
    20.                  bck = 41; clkm = 3;     //38259
    21.     }
    22.        
    23.     //set i2s clk freq
    24.     WRITE_PERI_REG(I2SCONF, READ_PERI_REG(I2SCONF) & 0xf0000fff|
    25.                     ( (( bck & I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
    26.                     (( clkm & I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
    27.                     ((1 & I2S_BITS_MOD)<<I2S_BITS_MOD_S )  )  );
    28. }
    29.  
    30.  
    31.  
    32. /******************************************************************************
    33. * FunctionName : ir_carrier_ctl
    34. * Description  : control ir carrier
    35. * Parameters   : NONE
    36. * Returns      : NONE
    37. * Drive: GPIO2|I2SO_WS
    38. *******************************************************************************/
    39. void  ir_carrier_ctl(int val) {
    40.  
    41.     if(val) {
    42.         //Pin as I2SO_WS
    43.         PIN_FUNC_SELECT(IR_GPIO_OUT_MUX, FUNC_I2SO_WS);  
    44.         //Start i2s clock
    45.         //CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_TX_START);
    46.         SET_PERI_REG_MASK(I2SCONF, I2S_I2S_TX_START);
    47.     }
    48.     else {
    49.         //Pin as GPIO
    50.         PIN_FUNC_SELECT(IR_GPIO_OUT_MUX, FUNC_GPIO2);
    51.         //Set pin LOW
    52.         GPIO_OUTPUT_SET(GPIO_ID_PIN(IR_GPIO_OUT_NUM), 0);        
    53.         //Stop i2s clock
    54.         CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_TX_START);
    55.     }      
    56. }
    57.  
     
    vad7 нравится это.
  5. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    402
    Симпатии:
    48
    Прошил обычную esp12e вместо Nodemcu, узнал какой эксепшен.
    У меня почему-то падает на доступе к регистрам I2S:
    Fatal exception (28):
    epc1=0x40230bd7, epc2=0x00000000, epc3=0x00000000, excvaddr=0x02190000, depc=0x00000000

    LoadProhibitedCause (28) - A load referenced a page mapped with an
    attribute that does not permit loads [Region
    Protection Option or MMU Option]

    В этом месте:
    WRITE_PERI_REG(I2SCONF, (READ_PERI_REG(I2SCONF) & 0xf0000fff)|
    ( (( 63&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
    ((63&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
    ((1&I2S_BITS_MOD ) << I2S_BITS_MOD_S ) ) );

    /* I2SCONF:0x60000E08 */
    #define I2SCONF i2s_[2]
     
  6. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    402
    Симпатии:
    48
    На чистом SDK нормально работает.
    Видать вебсвалка не всю периферию нормально инициализирует...
     
  7. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    402
    Симпатии:
    48
    @clinkme, вот посмотрел на duty cycle - 53.85% на ноге I2SO_BCK. Что-то криво...
    У вас также?
     
  8. vad7

    vad7 Авторитетный участник сообщества

    Сообщения:
    402
    Симпатии:
    48
    У I2SO_WS стабильность получше, в основном 50%, треть периодов +-0.03%.
     

Поделиться этой страницей