f_mount () возвращает FA_DISK_ERR

Я внес несколько изменений в свой исходный код после того, как все предложили. Для подключения FATFS API с интерфейсом SPI я следовал этому коду ..

https://github.com/eziya/STM32_SPI_SDCARD/blob/master/Src/fatfs_sd.c

и соответственно изменил свой user_diskio.c.

После выполнения всех этих действий моя SD-карта также возвращается FA_DISK_ERROR.

Я поменял слот для SD-карты, а также SD-карту. Но ничего не изменилось.

Мои user_diskio.c выглядят так:

#include <string.h>
#include "ff_gen_drv.h"
#include "fatfs_sd.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/
/* Disk status */
static volatile DSTATUS Stat = STA_NOINIT;

/* USER CODE END DECL */

/* Private function prototypes -----------------------------------------------*/
DSTATUS USER_initialize (BYTE pdrv);
DSTATUS USER_status (BYTE pdrv);
DRESULT USER_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count);
#if _USE_WRITE == 1
  DRESULT USER_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count);  
#endif /* _USE_WRITE == 1 */
#if _USE_IOCTL == 1
  DRESULT USER_ioctl (BYTE pdrv, BYTE cmd, void *buff);
#endif /* _USE_IOCTL == 1 */

Diskio_drvTypeDef  USER_Driver =
{
  USER_initialize,
  USER_status,
  USER_read, 
#if  _USE_WRITE
  USER_write,
#endif  /* _USE_WRITE == 1 */  
#if  _USE_IOCTL == 1
  USER_ioctl,
#endif /* _USE_IOCTL == 1 */
};

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Initializes a Drive
  * @param  pdrv: Physical drive number (0..)
  * @retval DSTATUS: Operation status
  */
DSTATUS USER_initialize (
    BYTE pdrv           /* Physical drive nmuber to identify the drive */
)
{
  /* USER CODE BEGIN INIT */
    return SD_disk_initialize(pdrv);
  /* USER CODE END INIT */
}

/**
  * @brief  Gets Disk Status 
  * @param  pdrv: Physical drive number (0..)
  * @retval DSTATUS: Operation status
  */
DSTATUS USER_status (
    BYTE pdrv       /* Physical drive number to identify the drive */
)
{
  /* USER CODE BEGIN STATUS */
    return SD_disk_status(pdrv);
  /* USER CODE END STATUS */
}

/**
  * @brief  Reads Sector(s) 
  * @param  pdrv: Physical drive number (0..)
  * @param  *buff: Data buffer to store read data
  * @param  sector: Sector address (LBA)
  * @param  count: Number of sectors to read (1..128)
  * @retval DRESULT: Operation result
  */
DRESULT USER_read (
    BYTE pdrv,      /* Physical drive nmuber to identify the drive */
    BYTE *buff,     /* Data buffer to store read data */
    DWORD sector,   /* Sector address in LBA */
    UINT count      /* Number of sectors to read */
)
{
  /* USER CODE BEGIN READ */
    return SD_disk_read(pdrv, buff, sector, count);
  /* USER CODE END READ */
}

/**
  * @brief  Writes Sector(s)  
  * @param  pdrv: Physical drive number (0..)
  * @param  *buff: Data to be written
  * @param  sector: Sector address (LBA)
  * @param  count: Number of sectors to write (1..128)
  * @retval DRESULT: Operation result
  */
#if _USE_WRITE == 1
DRESULT USER_write (
    BYTE pdrv,          /* Physical drive nmuber to identify the drive */
    const BYTE *buff,   /* Data to be written */
    DWORD sector,       /* Sector address in LBA */
    UINT count          /* Number of sectors to write */
)
{ 
  /* USER CODE BEGIN WRITE */
  /* USER CODE HERE */
    return SD_disk_write(pdrv, buff, sector, count);
  /* USER CODE END WRITE */
}
#endif /* _USE_WRITE == 1 */

/**
  * @brief  I/O control operation  
  * @param  pdrv: Physical drive number (0..)
  * @param  cmd: Control code
  * @param  *buff: Buffer to send/receive control data
  * @retval DRESULT: Operation result
  */
#if _USE_IOCTL == 1
DRESULT USER_ioctl (
    BYTE pdrv,      /* Physical drive nmuber (0..) */
    BYTE cmd,       /* Control code */
    void *buff      /* Buffer to send/receive control data */
)
{
  /* USER CODE BEGIN IOCTL */
    return SD_disk_ioctl(pdrv, cmd, buff);
  /* USER CODE END IOCTL */
}
#endif /* _USE_IOCTL == 1 */

и fatfs_sd.c выглядит так:

ПЕРЕЙДИТЕ ПО ССЫЛКЕ НА GITHUB

Понятия не имею, где я ошибаюсь.

Все по этой теме будет полезно.

Заранее спасибо.


person Devjeet Mandal    schedule 29.06.2018    source источник


Ответы (1)


Раньше я писал свой собственный драйвер, использующий чип stm32f7 для FatFS, и думаю, что могу знать, что происходит. Я предполагаю, что вы, вероятно, забыли прикрепить реализации для функций disk_write и disk_read в diskio.h. Без этого библиотека FatFS не знает, как на самом деле взаимодействовать с SD-картой.

Вы можете ознакомиться с документацией / руководством FatFS в качестве общего ресурса: здесь

Обратите очень внимание на раздел "Необходимые функции" в этом примечании к приложению: здесь

Пример проекта, подобного вашему, но для STM32F4: здесь

person Brandon Braun    schedule 30.06.2018
comment
Я думаю, вы почти у цели. Я просмотрел ваш исходный код, указанный выше, и нашел все ваши определения заглушек для тех функций, о которых я упоминал ранее. На первый взгляд они выглядят нормально. Что мне не удалось найти, так это то, где вы фактически прикрепили свои функции к драйверу FatFS. Это делается с помощью вызова `FATFS_LinkDriver (const Diskio_drvTypeDef * drv, char * path) '. У вас есть определение структуры Diskio_drvTypeDef в строке 89 файла user_diskio.c, и, похоже, вы заполнили дескрипторы функций. Теперь вам просто нужно сообщить FatFS о его существовании, вызвав эту функцию ссылки. - person Brandon Braun; 01.07.2018
comment
Я предполагаю, что это вызов в этой функции void MX_FATFS_Init(void) { /*## FatFS: Link the USER driver ###########################*/ retUSER = FATFS_LinkDriver(&USER_Driver, USERPath); /* USER CODE BEGIN Init */ /* additional user code for init */ /* USER CODE END Init */ } - person Devjeet Mandal; 01.07.2018
comment
и эта функция вызывается из main. - person Devjeet Mandal; 01.07.2018
comment
Хм, да, я вижу, что пропустил это. Виноват. Я не уверен, что вам сказать, кроме как начать пошаговое выполнение кода FatFS построчно в отладчике и посмотреть, где возвращается ошибка. ИМО, они действительно неплохо справляются с возвращением полезных ошибок. Как только вы обнаружите, откуда возникает ошибка в FatFS, проверка окружающего кода должна сказать вам, почему это не удалось. Еще одно предложение - получить логический анализатор, чтобы убедиться, что ваш выход SPI действительно работает. Я не могу сказать вам, сколько раз он должен работать, но обнаружил, что это было не с помощью логического анализатора. - person Brandon Braun; 01.07.2018
comment
Хорошо, я все равно буду проверять построчно в отладчике, спасибо. Получил более глубокий взгляд на тему. Как только он заработает, я отправлю ответ. Спасибо - person Devjeet Mandal; 01.07.2018