Lea el archivo grande de la tarjeta sd con fatfs

2

Estoy utilizando la placa STM32F4DISCOVERY y estoy tratando de leer un archivo de una tarjeta micro SD y tratar los datos. Estoy usando las siguientes funciones

int main(void)
{

  int i = 0;
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_SDIO_SD_Init();
  MX_TIM10_Init();
  MX_FATFS_Init();
  MX_USART2_UART_Init();
  create_filter_bank();

  ret = f_mount(&filesystem, buff_mount, 1);
  ret = f_open(&file, WANTED, FA_READ);
  ret = f_read(&file, header, 78, &br);
  ret = acquire_voice_from_file(&file);
  f_sync(&file);
  f_close(&file);
  // Some other code 
}

FRESULT acquire_voice_from_file(FIL* file){

  file_pointer = HEADER_WAV_SIZE;  
  acquired_frames = 0;
  FRESULT read_res;
  while(acquired_frames < NUM_ACQUIRE_FRAMES){
    file_pointer += FFT_SIGNAL_BYTES/2; // Need a correlation between frames
    read_res = read_frame_from_file(file);
    acquired_frames++;
    // Some Other Code 
  }
  return read_res;
}
FRESULT read_frame_from_file(FIL* file){

  int i = 0;
  FRESULT res;
  res = f_lseek(file, file_pointer);
  res = f_read(file, bytes, FFT_SIGNAL_BYTES, &br);
  if(res != FR_OK){
    return res;
  }
  for(i = 0; i < FFT_SIGNAL_LENGTH; i++){
    curr_frame[i] = (bytes[2*i+1] << 8) + bytes[2*i];  
    // Multiplying by Hamming window 
    curr_frame[i] *= (0.54 - 0.46*cos(2*PI*i/((float)FFT_SIGNAL_LENGTH)));
  }
  return res;
}

Todos los valores constantes, como WANTED, FFT_SIGNAL_BYTES, etc., se declaran correctamente en el archivo de encabezado. En la función principal, f_mount, f_open y f_read, devuelve el resultado FR_OK y los datos se leen correctamente. Pero luego, en la función "adquirir_voice_from_file", se leen con éxito uno o dos cuadros, y luego obtengo el valor FR_DISK_ERR de la función f_read en la función "read_frame_from_file". Supongo que mi configuración de hardware es correcta ya que los primeros bytes se leen correctamente, pero no logro resolver el problema y leer correctamente los siguientes marcos. El tamaño del marco que intento leer es de 2048 bytes (FFT_SIGNAL_BYTES = 2048). ¿Hay algún problema para leer archivos grandes con FATFS? Y si es así, ¿hay alguna solución? Muchas gracias por tu ayuda.

    
pregunta Armand Chocron

2 respuestas

1

Problema resuelto, seguí la respuesta en este link e hizo el truco. Leí los datos por bloques de 512 bytes y leí con éxito cuadro tras cuadro

    
respondido por el Armand Chocron
0

Si está usando una tarjeta SD, lo más probable es que los valores __MAX_SS y __MIN_SS en ffconf.h se configuren en 512. Y eso significa que su búfer creado para las operaciones de lectura-escritura será de ese tamaño. Esta es la razón por la que recibía un error de disco de FR, (un error de nivel inferior, algo malo en el lado del controlador). Tal vez estabas pasando un mayor valor en tu búfer. De todos modos, lo tienes resuelto. Pero espero que esto ayude a alguien más.

    
respondido por el clmno

Lea otras preguntas en las etiquetas