Jump to content

    

STM32L496: не работает SDMMC с USB MASS STORAGE

Всем доброго дня!!!

Я использую в своих разработках плату NUCLEO-L496ZG, мне необходимо реализовать задание с ЦАП напряжения, считывания его с АЦП, а так же подключение SD карточки, считывания и запись файла на нее, а так же отображение SD карты через usb устройство как USB MASS STORAGE

Генерацию проекта я использовал CUBE MX 5.3.0, версия репозитория STM32Cube_FW_L4_V1.14.0

я начал с того, чтобы монтировать карту памяти, читать и записывать файлы - увидел, что не приходят прерывания по DMA на передачу при записи в файл - помогла очень вот эта тема https://community.st.com/s/feed/0D50X00009XkVtKSAV
в итоге монтируется SD карточка и происходит запись и чтение файлов

перешел к отображению SD карты на ПК как съемного носителя через USB - здесь не работает, верно определяется размер карточки и количество секторов на стороне ПК, но вот выдается ошибка, что диск поврежден и требуется форматирование, при нажатии на форматирование Windows выдает ошибку, что форматирование закончилось ошибкой, при этом по логу от процессора STM32L496 через терминал я вижу, что идет обращение к функциям чтении(STORAGE_Read_FS) и записи(STORAGE_Write_FS) устройства

У меня следующие вопросы:
1. как заставить отображаться верно SD карту как USB MASS STORAGE???

2. если раскоментировать код в функции STORAGE_Init_FS, а именно:
 res = BSP_SD_Init();
  if( res == MSD_ERROR_SD_NOT_PRESENT) {
      printf("\rSD Card don't set\n");
      return USBD_FAIL;
  }
  else if(res == MSD_ERROR){
      printf("\rSD Card is set, Init SD Card ERROR\n");
      return USBD_FAIL;
  }
  printf("\rSD Card is set, Init SD Card OK\n");

то зывисает в BSP_SD_Init(), где вызывается задержка HAL_DELAY(2U), которая построена на подсчете тиков от системного клока, причем при вызове этой функции в функции main(файл main.c) такого не происходит

как это исправить, т.к. мне необходимо переставлять карточки во время работы, а значит должна обновляться информация о них, а это делается через BSP_SD_Init()???

3. если я подмонтировал SD карту к процессору через f_mount, при этом подключил SD карту как USB MASS STORAGE к компьютеру, при этом я пишу в один файл через процессор STM32 через f_write, но на стороне компютера я данный файл не трогаю, а просматриваю содержимое других файлов

корректно ли будет отображение файлов SD карты на компьютере, а так же работа с теми файлами, которые я не использую на данный момент через процессор???

либо перед тем как подключаться к компьютеру SD карту (отображение SD карты через USB на компьютер), мне необходимо отмонтировать SD карту от STM32, и только после этого разрешать работать с SD картой 

Проект прикладываю, делал все в Eclipse(https://yadi.sk/d/Dzue0E79O_m_Rw)

Буду очень признателен за любую помощь!!!
спасибо

Share this post


Link to post
Share on other sites

я решил проблему с отображением SD карты на USB MASS STORAGE следующим образом:
1. неверно были указаны количество и размер блоков
2. поставил цикл ожидания после того, как запустил DMA

 

в файле usbd_storage_if.c должно быть следующее:

int8_t STORAGE_GetCapacity_FS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 3 */
  //printf("\r STORAGE_GetCapacity_FS \n");
  *block_num = hsd1.SdCard.LogBlockNbr;
  *block_size = hsd1.SdCard.LogBlockSize;
  //printf("\r block_num = %d, block_size = %d \n",*block_num,*block_size);
  return (USBD_OK);
  /* USER CODE END 3 */
}

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
  // printf("\r Start STORAGE_Read_FS \n");
  uint8_t status = BSP_SD_ReadBlocks_DMA((uint32_t*)buf, (uint32_t)blk_addr, (uint32_t) blk_len);
  //printf("\r End STORAGE_Read_FS %d\n",status);
  if(status != MSD_OK) return (USBD_FAIL);
  /* Wait until SD card is ready to use for new operation */
  while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}
  return (USBD_OK);
  /* USER CODE END 6 */
}

int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
  //printf("\r Start STORAGE_Write_FS \n");
  uint8_t status = BSP_SD_WriteBlocks_DMA((uint32_t*)buf, blk_addr, (uint32_t) blk_len);
  //printf("\r End STORAGE_Write_FS %d\n",status);
  if(status != MSD_OK) return (USBD_FAIL);
  /* Wait until SD card is ready to use for new operation */
  while (BSP_SD_GetCardState() != SD_TRANSFER_OK){}
  return (USBD_OK);
  /* USER CODE END 7 */
}

 

все заработало, надеюсь, кому-нибудь эта информация пригодится

 

у меня остался один нерешенный вопрос:
2. если раскоментировать код в функции STORAGE_Init_FS, а именно:

int8_t STORAGE_Init_FS(uint8_t lun)
{
  /* USER CODE BEGIN 2 */
/*  uint8_t res;
  //printf("\r STORAGE_Init_FS \n");
  res = BSP_SD_Init();
  if( res == MSD_ERROR_SD_NOT_PRESENT) {
      printf("\rSD Card don't set\n");
      return USBD_FAIL;
  }
  else if(res == MSD_ERROR){
      printf("\rSD Card is set, Init SD Card ERROR\n");
      return USBD_FAIL;
  }
  printf("\rSD Card is set, Init SD Card OK\n");*/

  return (USBD_OK);
  /* USER CODE END 2 */
}

то зывисает в BSP_SD_Init(), где вызывается задержка HAL_DELAY(2U), которая построена на подсчете тиков от системного клока, причем при вызове этой функции в функции main(файл main.c) такого не происходит

функция BSP_SD_Init() генерируется CubeMX, задержка HAL_DELAY(2U) находится в ней, я бы очень не хотел корректировать эту функцию, т.к. при пересборке надо будет туда всегда лазить

 

системный таймер у меня настроен вот таким образом(см приложение)

 

2.bmp

1.bmp

Edited by xxxmatrixxx

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