Friday, March 3, 2017

VS1053 을 이용한 mp3 play 시에 음이 빨리 재생되면서 찌직 거리는 경우. too fast play mp3 noise error sound

VS1053에게 mp3 파일 데이터를 보내는 함수가 다음과 같을경우

void VS1053_sdi_write(VS1053_InitTypeDef* vs1053,uint8_t* txbuff,uint16_t datasize)
{
if(vs1053->initialised)
{
while( HAL_GPIO_ReadPin(vs1053->DREQport,vs1053->DREQpin) == 0); //Wait while DREQ is low

SDI_DSEL();
SCI_DSEL();

SDI_SEL();

HAL_SPI_Transmit(vs1053->hspi,txbuff,datasize,vs1053->timeout);

SDI_DSEL();

}
}

위 함수는 datasize만큼 보내기 전에 vs1053의 fifo에 여유가 있는지 물어본 후 데이터를 보낸다.
문제는 datasize가 32byte ( vs1053이 최소한으로 가지고 있는 fifo의 여유 공간)을 넘는 경우
32바이트를 넘는 모든 정보는 사라진다.


따라서 아래처럼 32byte 단위로 보내야 한다.

아주 단순한 코딩 실수이지만 한참을 삽질했다.


void PlayMp3()
{
uint32_t wbytes; /* File write counts */
uint8_t read_buffer[32*100];

if(f_mount(&mynewdiskFatFs, (TCHAR const*)SD_Path, 1) == FR_OK)
{
//SDMMC_Format();

if(f_open(&MyFile, "test.mp3", FA_READ) == FR_OK)
{
uint32_t fetch =0; 

while(1)
{
f_read(&MyFile, read_buffer, 1024,&fetch);
HAL_Delay(1);

if(fetch >0)
{
for(int p = 0; p < fetch / 32; p++)
VS1053_sdi_write(&vs1053, &read_buffer[p*32], 32);
}
else
{
f_close(&MyFile);
break;
}
}
}
}

}


------------------------------
in send mp3 data to vs1053, check DREQ signal each 32 bytes frame.
DREQ is high when vs1053 has fifo spaces at least 32 bytes.
If you send over 32bytes, overflow data.

1 comment:

  1. 어디부분을 바꿔야 하는거죠? 잘 모르는 입장이라 무슨뜻인지 이해하기가 어렵네요 ㅠㅠ

    ReplyDelete