Jump to content

    
Sign in to follow this  
yakuzaa

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

Recommended Posts

Пытаюсь сделать запись с микрофона на 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

Все получилось! Реализовал проект на 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this