Jump to content

    

VS1053 и запись звука

Пытаюсь сделать запись с микрофона на SD карточку. В ДШ на VS1053 приведен код инициализации ADPCM энкодера, запускаю - работает, звук с микрофона начинает идти в наушники...

 

Но в ДШ еще сказано, что необходимо применить патч, патч применяю, но его надо запустить и тут начинаются приколы: в ДШ про запуск патча ничего вообще не сказано, а в примере плеера от VLSI идет запуск огг/ворбис патча...

 

  vs_write(VS_AICTRL0, 16000U); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL1, 0); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL2, 4096U); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL3, 0); delay_ms(10); while(!DREQ);
  LoadUserCode();
  vs_write(VS_AIADDR, 0x0034); while(!DREQ);
  
  vs_write(VS_MODE, 0x1804); delay_ms(10); while(!DREQ);

 

Кароче путанница, если кто делал - помогите пожалуйста...

Share this post


Link to post
Share on other sites
Пытаюсь сделать запись с микрофона на SD карточку. В ДШ на VS1053 приведен код инициализации ADPCM энкодера, запускаю - работает, звук с микрофона начинает идти в наушники...

 

Но в ДШ еще сказано, что необходимо применить патч, патч применяю, но его надо запустить и тут начинаются приколы: в ДШ про запуск патча ничего вообще не сказано, а в примере плеера от VLSI идет запуск огг/ворбис патча...

 

  vs_write(VS_AICTRL0, 16000U); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL1, 0); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL2, 4096U); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL3, 0); delay_ms(10); while(!DREQ);
  LoadUserCode();
  vs_write(VS_AIADDR, 0x0034); while(!DREQ);
  
  vs_write(VS_MODE, 0x1804); delay_ms(10); while(!DREQ);

 

Кароче путанница, если кто делал - помогите пожалуйста...

 

вам очень повезло, я решал эту же задачу.

все упаковано в приложенный архив:

"ADPCM\readme.txt" - краткое описание на русском

"ADPCM\vs1053_freertos.c" - работающий пример на С

"ADPCM\vorbis53b.plg" - сам патч

"ADPCM\vs1053b-patches110.zip" - пример от производителя VS1053

"ADPCM\vs1053_01.pdf" - манул по теме

ADPCM_2009_Sep_22_12_37_01_.rar

Share this post


Link to post
Share on other sites

Faradey спасибо огромное! по поводу огг-ворбис - у меня патч ворбиса во флеш уже не влезет (atmega32), поэтому думаю сделать просто ADPCM. Как я понимаю, для ADPCM нужен только загрузить в VS1053 маленький патчик, но! в ДШ ничего не сказано, что я должен записывать в SCI_AIADDR после загрузки этого патчика.

 

Выдержка из ДШ:

 

WriteVS10xxRegister(SCI_AICTRL0, 16000U);
WriteVS10xxRegister(SCI_AICTRL1, 0);
WriteVS10xxRegister(SCI_AICTRL2, 4096U);
WriteVS10xxRegister(SCI_AICTRL3, 0);
WriteVS10xxRegister(SCI_MODE, ReadVS10xxRegister(SCI_MODE) | SM_RESET | SM_ADPCM | SM_LINE1);
WriteVS10xxPatch(); /* Only for VS1053b */

Edited by Ivan Kuznetzov

Share this post


Link to post
Share on other sites
Faradey спасибо огромное! по поводу огг-ворбис - у меня патч ворбиса во флеш уже не влезет (atmega32), поэтому думаю сделать просто ADPCM. Как я понимаю, для ADPCM нужен только загрузить в VS1053 маленький патчик, но! в ДШ ничего не сказано, что я должен записывать в SCI_AIADDR после загрузки этого патчика.

 

Выдержка из ДШ:

 

WriteVS10xxRegister(SCI_AICTRL0, 16000U);
WriteVS10xxRegister(SCI_AICTRL1, 0);
WriteVS10xxRegister(SCI_AICTRL2, 4096U);
WriteVS10xxRegister(SCI_AICTRL3, 0);
WriteVS10xxRegister(SCI_MODE, ReadVS10xxRegister(SCI_MODE) | SM_RESET | SM_ADPCM | SM_LINE1);
WriteVS10xxPatch(); /* Only for VS1053b */

 

Не могу понять вашу проблему, прочитайте внимательно файл "readme.txt" из архива, там всё описано по шагам.

либо обратить внимание на файл с примером "vs1053_freertos.c"

вот интересующая вас часть от-туда:

    _VS1053_SetCS( p->platform );
    _VS1053_SetRESET( p->platform );
    _VS1053_Delay_ms( 10 );
    _VS1053_ResetDCS( p->platform );
    _VS1053_ResetRESET( p->platform );
    _VS1053_ResetCS( p->platform );
    _VS1053_WaitDREQ( p->platform );

    VS1053_SetupHighSpeedSPI( p );

    // Run plugin
    VS1053_LoadUserCode( p, vs1053_decode_patch, ARRSIZEOF( vs1053_decode_patch ) );

    // Set AICTRL registers
    VS1053_WriteRegister( p, VS1053_SCI_AICTRL0, sample_rate );
    VS1053_WriteRegister( p, VS1053_SCI_AICTRL1, rec_gain );
    VS1053_WriteRegister( p, VS1053_SCI_AICTRL2, max_autogain );
    VS1053_WriteRegister( p, VS1053_SCI_AICTRL3, 0x0002 );  // 2 = left channel, 3 = right channel

    VS1053_WriteRegister( p, VS1053_SCI_MODE, 
                          VS1053_ReadRegister( p, VS1053_SCI_MODE )
                          | VS1053_SM_ADPCM );  // VS1053_SM_RESET
    
    VS1053_WriteRegister( p, VS1053_SCI_AIADDR , 0x300 );

Share this post


Link to post
Share on other sites
Не могу понять вашу проблему

 

там для ogg все описано. а мне необходио просто wav записывать? зачем мне ogg/vorbis патч грузить?

Share this post


Link to post
Share on other sites
там для ogg все описано. а мне необходио просто wav записывать? зачем мне ogg/vorbis патч грузить?

 

?

:01: что то я совсем ничего не понимаю. Попробую еще раз разобраться:

 

Итак:

1. вам надо оцифровать в формате ADPCM.

2. записать в wav-файл

 

В моём примере:

1. ф-ция оцифровки в ADPCM формат VS1053_ADPCM_RecordData(...)

2. ф-ция-поток для FreeRTOS в которой как раз сохраняетс в wav-файл под FatFS

 

------

а, вот по поводу

что я должен записывать в SCI_AIADDR после загрузки этого патчика.

я вам уже отвечал, пожалуйста ещё раз

  VS1053_WriteRegister( p, VS1053_SCI_AIADDR , 0x300 );

 

З.Ы. видно что моем примере грузится не ogg патч, а ADPCM патч:

/**
* патч для корректной записи ADPCM
*/
static const unsigned short vs1053_decode_patch[] = {
#include "vorbis53b.plg"
};

// чтение данных с кодека
void VS1053_ADPCM_RecordData( VS1053Type *p, CIR_BUF *pcb, 
                              u16 sample_rate, u16 rec_gain, u16 max_autogain )
{
...
    // Run plugin
    VS1053_LoadUserCode( p, vs1053_decode_patch, ARRSIZEOF( vs1053_decode_patch ) );
...
}

Share this post


Link to post
Share on other sites

в общем накидал исходник - из микрофона звук прёт, автогейн работает, но на карту не пишет, где грабли так и не понял, если после f_open ничего сразу не записать, то файл вообще не создается, как будто конфликт SD карты с VS1053. если записать какую-нибудь дребедень, то файл создастся, но из массива в него ничего не пишется, видимо из-за тогоже конфликта.

исходник прилагаю, , пожалуйста, помогите найти грабли... :unsure:

 

/** \file record.c ADPCM Recording */
#include "main.h"
#include "mmc.h"
#include "ff.h"
#include "dataflash.h"
#include "vs1001.h"

unsigned char dataBufPtr[256];
extern FATFS fatfs;

#ifndef SKIP_PLUGIN_VARNAME
#define PLUGIN_SIZE 605
__flash const unsigned short plugin[605] = { // Compressed plugin 
#endif
  0x0007, 0x0001, 0x8300, 0x0006, 0x01f2, 0xb080, 0x0024, 0x0007, //    0 
  0x9257, 0x3f00, 0x0024, 0x0030, 0x0297, 0x3f00, 0x0024, 0x0006, //    8 
  0x0017, 0x3f10, 0x0024, 0x3f00, 0x0024, 0x0000, 0xf6d7, 0xf400, //   10 
  0x55c0, 0x0000, 0x0817, 0xf400, 0x57c0, 0x0000, 0x004d, 0x000a, //   18 
  0x708f, 0x0000, 0xc44e, 0x280f, 0xe100, 0x0006, 0x2016, 0x0000, //   20 
  0x028d, 0x0014, 0x1b01, 0x2800, 0xc795, 0x0015, 0x59c0, 0x0000, //   28 
  0xfa0d, 0x0039, 0x324f, 0x0000, 0xd20e, 0x2920, 0x41c0, 0x0000, //   30 
  0x0024, 0x000a, 0x708f, 0x0000, 0xc44e, 0x280a, 0xcac0, 0x0000, //   38 
  0x028d, 0x6fc2, 0x0024, 0x000c, 0x0981, 0x2800, 0xcad5, 0x0000, //   40 
  0x18c2, 0x290c, 0x4840, 0x3613, 0x0024, 0x290c, 0x4840, 0x4086, //   48 
  0x184c, 0x6234, 0x0024, 0x0000, 0x0024, 0x2800, 0xcad5, 0x0030, //   50 
  0x0317, 0x3f00, 0x0024, 0x280a, 0x71c0, 0x002c, 0x9d40, 0x3613, //   58 
  0x0024, 0x3e10, 0xb803, 0x3e14, 0x3811, 0x3e11, 0x3805, 0x3e00, //   60 
  0x3801, 0x0007, 0xc390, 0x0006, 0xa011, 0x3010, 0x0444, 0x3050, //   68 
  0x4405, 0x6458, 0x0302, 0xff94, 0x4081, 0x0003, 0xffc5, 0x48b6, //   70 
  0x0024, 0xff82, 0x0024, 0x42b2, 0x0042, 0xb458, 0x0003, 0x4cd6, //   78 
  0x9801, 0xf248, 0x1bc0, 0xb58a, 0x0024, 0x6de6, 0x1804, 0x0006, //   80 
  0x0010, 0x3810, 0x9bc5, 0x3800, 0xc024, 0x36f4, 0x1811, 0x36f0, //   88 
  0x9803, 0x283e, 0x2d80, 0x0fff, 0xffc3, 0x003e, 0x2d4f, 0x2800, //   90 
  0xe380, 0x0000, 0xcb4e, 0x3413, 0x0024, 0x2800, 0xd405, 0xf400, //   98 
  0x4510, 0x2800, 0xd7c0, 0x6894, 0x13cc, 0x3000, 0x184c, 0x6090, //   a0 
  0x93cc, 0x38b0, 0x3812, 0x3004, 0x4024, 0x0000, 0x0910, 0x3183, //   a8 
  0x0024, 0x3100, 0x4024, 0x6016, 0x0024, 0x000c, 0x8012, 0x2800, //   b0 
  0xd711, 0xb884, 0x104c, 0x6894, 0x3002, 0x2939, 0xb0c0, 0x3e10, //   b8 
  0x93cc, 0x4084, 0x9bd2, 0x4282, 0x0024, 0x0000, 0x0041, 0x2800, //   c0 
  0xd9c5, 0x6212, 0x0024, 0x0000, 0x0040, 0x2800, 0xdec5, 0x000c, //   c8 
  0x8390, 0x2a00, 0xe240, 0x34c3, 0x0024, 0x3444, 0x0024, 0x3073, //   d0 
  0x0024, 0x3053, 0x0024, 0x3000, 0x0024, 0x6092, 0x098c, 0x0000, //   d8 
  0x0241, 0x2800, 0xe245, 0x32a0, 0x0024, 0x6012, 0x0024, 0x0000, //   e0 
  0x0024, 0x2800, 0xe255, 0x0000, 0x0024, 0x3613, 0x0024, 0x3001, //   e8 
  0x3844, 0x2920, 0x0580, 0x3009, 0x3852, 0xc090, 0x9bd2, 0x2800, //   f0 
  0xe240, 0x3800, 0x1bc4, 0x000c, 0x4113, 0xb880, 0x2380, 0x3304, //   f8 
  0x4024, 0x3800, 0x05cc, 0xcc92, 0x05cc, 0x3910, 0x0024, 0x3910, //  100 
  0x4024, 0x000c, 0x8110, 0x3910, 0x0024, 0x39f0, 0x4024, 0x3810, //  108 
  0x0024, 0x38d0, 0x4024, 0x3810, 0x0024, 0x38f0, 0x4024, 0x34c3, //  110 
  0x0024, 0x3444, 0x0024, 0x3073, 0x0024, 0x3063, 0x0024, 0x3000, //  118 
  0x0024, 0x4080, 0x0024, 0x0000, 0x0024, 0x2839, 0x53d5, 0x4284, //  120 
  0x0024, 0x3613, 0x0024, 0x2800, 0xe585, 0x6898, 0xb804, 0x0000, //  128 
  0x0084, 0x293b, 0x1cc0, 0x3613, 0x0024, 0x000c, 0x8117, 0x3711, //  130 
  0x0024, 0x37d1, 0x4024, 0x4e8a, 0x0024, 0x0000, 0x0015, 0x2800, //  138 
  0xe845, 0xce9a, 0x0024, 0x3f11, 0x0024, 0x3f01, 0x4024, 0x000c, //  140 
  0x8197, 0x408a, 0x9bc4, 0x3f15, 0x4024, 0x2800, 0xea85, 0x4284, //  148 
  0x3c15, 0x6590, 0x0024, 0x0000, 0x0024, 0x2839, 0x53d5, 0x4284, //  150 
  0x0024, 0x0000, 0x0024, 0x2800, 0xd2d8, 0x458a, 0x0024, 0x2a39, //  158 
  0x53c0, 0x3009, 0x3851, 0x3e14, 0xf812, 0x3e12, 0xb817, 0x0006, //  160 
  0xa057, 0x3e11, 0x9fd3, 0x0023, 0xffd2, 0x3e01, 0x0024, 0x0006, //  168 
  0x0011, 0x3111, 0x0024, 0x6498, 0x07c6, 0x868c, 0x2444, 0x3901, //  170 
  0x8e06, 0x0030, 0x0551, 0x3911, 0x8e06, 0x3961, 0x9c44, 0xf400, //  178 
  0x44c6, 0xd46c, 0x1bc4, 0x36f1, 0xbc13, 0x2800, 0xf615, 0x36f2, //  180 
  0x9817, 0x002b, 0xffd2, 0x3383, 0x188c, 0x3e01, 0x8c06, 0x0006, //  188 
  0xa097, 0x468c, 0xbc17, 0xf400, 0x4197, 0x2800, 0xf304, 0x3713, //  190 
  0x0024, 0x2800, 0xf345, 0x37e3, 0x0024, 0x3009, 0x2c17, 0x3383, //  198 
  0x0024, 0x3009, 0x0c06, 0x468c, 0x4197, 0x0006, 0xa052, 0x2800, //  1a0 
  0xf544, 0x3713, 0x2813, 0x2800, 0xf585, 0x37e3, 0x0024, 0x3009, //  1a8 
  0x2c17, 0x36f1, 0x8024, 0x36f2, 0x9817, 0x36f4, 0xd812, 0x2100, //  1b0 
  0x0000, 0x3904, 0x5bd1, 0x2a00, 0xeb8e, 0x3e11, 0x7804, 0x0030, //  1b8 
  0x0257, 0x3701, 0x0024, 0x0013, 0x4d05, 0xd45b, 0xe0e1, 0x0007, //  1c0 
  0xc795, 0x2800, 0xfd95, 0x0fff, 0xff45, 0x3511, 0x184c, 0x4488, //  1c8 
  0xb808, 0x0006, 0x8a97, 0x2800, 0xfd45, 0x3009, 0x1c40, 0x3511, //  1d0 
  0x1fc1, 0x0000, 0x0020, 0xac52, 0x1405, 0x6ce2, 0x0024, 0x0000, //  1d8 
  0x0024, 0x2800, 0xfd41, 0x68c2, 0x0024, 0x291a, 0x8a40, 0x3e10, //  1e0 
  0x0024, 0x2921, 0xca80, 0x3e00, 0x4024, 0x36f3, 0x0024, 0x3009, //  1e8 
  0x1bc8, 0x36f0, 0x1801, 0x2808, 0x9300, 0x3601, 0x5804, 0x0007, //  1f0 
  0x0001, 0x802e, 0x0006, 0x0002, 0x2800, 0xf700, 0x0007, 0x0001, //  1f8 
  0x8050, 0x0006, 0x0028, 0x3e12, 0x3800, 0x2911, 0xf140, 0x3e10, //  200 
  0x8024, 0xf400, 0x4595, 0x3593, 0x0024, 0x35f3, 0x0024, 0x3500, //  208 
  0x0024, 0x0021, 0x6d82, 0xd024, 0x44c0, 0x0006, 0xa402, 0x2800, //  210 
  0x1815, 0xd024, 0x0024, 0x0000, 0x0000, 0x2800, 0x1815, 0x000b, //  218 
  0x6d57, 0x3009, 0x3c00, 0x36f0, 0x8024, 0x36f2, 0x1800, 0x2000, //  220 
  0x0000, 0x0000, 0x0024, 0x0007, 0x0001, 0x8030, 0x0006, 0x0002, //  228 
  0x2800, 0x1400, 0x0007, 0x0001, 0x8064, 0x0006, 0x001c, 0x3e12, //  230 
  0xb817, 0x3e14, 0xf812, 0x3e01, 0xb811, 0x0007, 0x9717, 0x0020, //  238 
  0xffd2, 0x0030, 0x11d1, 0x3111, 0x8024, 0x3704, 0xc024, 0x3b81, //  240 
  0x8024, 0x3101, 0x8024, 0x3b81, 0x8024, 0x3f04, 0xc024, 0x2808, //  248 
  0x4800, 0x36f1, 0x9811, 0x0007, 0x0001, 0x8028, 0x0006, 0x0002, //  250 
  0x2a00, 0x190e, 0x000a, 0x0001, 0x0300,
#ifndef SKIP_PLUGIN_VARNAME
};
#endif

void LoadUserCode(void) {
  int i = 0;

  while (i<sizeof(plugin)/sizeof(plugin[0])) {
    unsigned short addr, n, val;
    addr = plugin[i++];
    n = plugin[i++];
    if (n & 0x8000U) { /* RLE run, replicate n samples */
      n &= 0x7FFF;
      val = plugin[i++];
      while (n--) {
        vs_write(addr, val);
      }
    } else {           /* Copy run, copy n samples */
      while (n--) {
        val = plugin[i++];
        vs_write(addr, val);
      }
    }
  }
}

unsigned char Record(void)
{
  unsigned char res;
  unsigned int i, bw, num_hwords, sample;
   
  FIL file2;

  res = f_open(&file2, "sound.txt", FA_CREATE_ALWAYS | FA_WRITE); //создаем файл на запись
  
  f_printf(&file2, "err %u\r\n", res); // если СРАЗУ ничего не запишем - кукиш!
  
  //f_write(&file2,(char*)plugin,sizeof(plugin),&bw);  //ну или плагин пущай запишет
  
  if (res != FR_OK) return res;
  
  vs_sinetest(1);
  vs_sinetest(0);
  
  LoadUserCode();
  
  vs_write(VS_AICTRL0, 8000U); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL1, 0); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL2, 4096U); delay_ms(10); while(!DREQ);
  vs_write(VS_AICTRL3, 0); delay_ms(10); while(!DREQ); 
  vs_write(VS_MODE, 0x1804); delay_ms(10); while(!DREQ);

   vs_write(VS_AIADDR, 0x0030); while(!DREQ);

  while(1) {
        
        num_hwords = vs_read(VS_HDAT1);
        
        if( num_hwords >= 128 )
        {
            // ìèíèìóì îäèí áëîê
          i=0;  
          while( num_hwords )
            {
                sample = vs_read(VS_HDAT0);
                dataBufPtr[i] = (UCHAR)(sample >> 8 );
                dataBufPtr[i+1] = (UCHAR)(sample & 0xFF );
                i+=2;
                num_hwords--;
            }
        }
        else
        {       
          delay_ms(1);
        }
   
        
        
   if (!PLAY_B) break; 
    
   DISABLE_XCS();
     //f_printf(&file2, "%u\r\n", sample);
     
   f_write(&file2,dataBufPtr,sizeof(dataBufPtr),&bw);
  
  }//while not button - stop recording when BUTTON is pressed
  
  f_close(&file2);
  
  vs_init(SOFT);
  vs_sinetest(0);
  vs_sinetest(1); 
return 0;

}

Edited by Ivan Kuznetzov

Share this post


Link to post
Share on other sites
как будто конфликт SD карты с VS1053

 

конфликт - маловероятно, ведь вы последовательно работаете с картой и кодеком, хотя и допускаю что на одном интерфейсе SPI.

 

Мой вам совет проверьте внимательно работу с SD-картой, возможно вы не снимаете CS или не верно выдерживаете тайминги....

 

Гадать тяжело, но на всякий случай убедитесь что перенастраиваете SPI (Если он один на двоих).

Напишите тестик вида:

FATFS fs = { 0 };
FRESULT res;
FIL file;

disk_msc_tab_init( 0, &msc_card );

res = f_mkfs( 0, 0, 0 );
if(res)
{
// error mkfs
}

res = f_mount( 0, &fs );
if(res)
{
// error mount
}

res = f_open( &file, "test.tst", FA_CREATE_ALWAYS | FA_OPEN_EXISTING | FA_WRITE );
if( res )
{
// error open
}

.... // пишите - читайте - проверяйте.

Share this post


Link to post
Share on other sites

вопрос к Faradey - а у Вас vs1053 и SD карта на разных SPI сидят?

Share this post


Link to post
Share on other sites

Все получилось! Реализовал проект на STM32. Дело было в выборе плагина для кодирования. Сейчас карта и кодек сидят на одном SPI и не конфликтуют.

Share this post


Link to post
Share on other sites
On 8/11/2010 at 5:14 PM, yakuzaa said:

Все получилось! Реализовал проект на STM32. Дело было в выборе плагина для кодирования. Сейчас карта и кодек сидят на одном SPI и не конфликтуют.

А вы можете поделиться тем, що у вас получилось?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this