Моя команда работала над проектом, который содержит 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. К сожалению, сейчас я не могу уделить больше времени тому, чтобы узнать больше о том, что происходит в моем расписании. Возможно в будущем.