FR_DISK_ERROR всегда возвращается f_open - PullRequest
0 голосов
/ 10 января 2020

Моя команда работала над проектом, который содержит SD-карту на основе стандартной библиотеки. Недавно мы решили перейти на HAL, и это началось.

К счастью, все части нашего проекта были заменены на HAL, и они отлично работают, но мы не знаем, почему SD-карта не работает. не работают.

Мы не изменили тактовые частоты конфигурации периферийного устройства, но нам пришлось изменить «тактовую частоту контроллера SDMM C» на 1,5 МГц в HAL, тогда как в STDLibrary она была 24 МГц. Потому что это не сработало совсем.

Кроме того, наши клиенты используют широкий спектр типов SD-карт, и все они в порядке, но не очень хороши. Я имею в виду, что FR_DISK_ERR часто возвращается во время работы, но наше устройство пытается получить FR_OK.

К сожалению, мы всегда получаем FR_DISK_ERR на некоторых SD-картах, хотя это работало все время в наша версия STDLibrary.

Кроме того, мы обнаружили, что если функция "f_mount" была вызвана один раз, и после этого вы извлекаете SD-карту и вставляете ее снова, она никогда не будет работать, пока вы не перезагрузите свой микроконтроллер.

Мой микроконтроллер STM32F427VI и SDIO настроен так же, как это:

 hsd.Instance = SDIO;

 hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;

 hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;

 hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;

 hsd.Init.BusWide = SDIO_BUS_WIDE_1B;

 hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;

 hsd.Init.ClockDiv = 14;

и работает с шиной шириной 4 бита.

Кроме того, часы моего устройства составляют 96 МГц, а «Периферийные часы APB2» - 48 МГц.

Отредактировано:

Что касается повторной установки карты - Я снова сделал инициализацию, вызвав f_mount, когда f_open вернул FR_DISK_ERR. Я делал это до тех пор, пока не дал FR_OK, но в этом случае он никогда не возвращается FR_OK.

Я понял, что f_mount не запускает SDIO во второй раз, как сказал дорогой Яцек Элимок.

Потому что флаг, который не позволяет снова вызывать SD_initialize (функция SD_initialize включает в себя BSP_SD_Init).

Вот код diskio. c:

DSTATUS disk_initialize (
    BYTE pdrv /* Physical drive nmuber to identify the drive */
)

{

 DSTATUS stat = RES_OK;

 if(disk.is_initialized[pdrv] == 0)

 {

     disk.is_initialized[pdrv] = 1;

     stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]);

 }

 return stat;

}

Теперь я использовал SD_PowerON и SD_InitCard до вызова f_mount, и теперь он работал правильно. Это ошибка, не так ли? 10

Но другие проблемы остались. Он не работает с тактовой частотой 24 МГц, и некоторые карты SD по-прежнему возвращают FR_DISK_ERR.

Отредактировано (2020/02/24):

Наконец, это сработало, когда я обновил свою библиотеку HAL до STM32Cube_FW_F4_V1.24.2. Но HAL по-прежнему не работает так же хорошо, как стандартная периферия. Например, я пока не могу установить «ClockDiv» на «0» (24 МГц). Это не работает вообще. Теперь я установил «ClockDiv» на «1» (16 МГц), что недостаточно для моего проекта, но я должен это сделать. Или, если вы берете SDCard и вставляете его снова, когда программа работает, вы не можете запустить FATFS с помощью f_mount. Это не сработает вообще. Вы должны самостоятельно инициировать SDIO Peripheral. К сожалению, сейчас я не могу уделить больше времени тому, чтобы узнать больше о том, что происходит в моем расписании. Возможно в будущем.

...