lift_indicator_suite/bsp/sd
2026-06-30 16:28:48 +03:00
..
include/bsp # bsp_sd: on process 2026-05-06 11:13:46 +03:00
src # bsp: usd - исправления бага с переинициализацией 2026-06-30 16:28:48 +03:00
CMakeLists.txt # bsp_sd: on process 2026-05-06 11:13:46 +03:00
README.md # test_buttons: finished, all documentation refactored 2026-06-23 15:02:36 +03:00

bsp_sd — SD host-контроллер (USDHC1)

Инициализация SD host-контроллера и детект карты. Файловой системой не занимается — это ответственность слоя bsp_usd / port_fatfs_sd поверх.


Аппаратура

Сигнал Пин MCU Корпус Конфигурация
CLK GPIO_SD_B0_01 J3 USDHC1_CLK, периферийный режим
CMD GPIO_SD_B0_00 J4 USDHC1_CMD, периферийный режим
D0 GPIO_SD_B0_02 J1 USDHC1_DATA0, периферийный режим
D1 GPIO_SD_B0_03 K1 USDHC1_DATA1, периферийный режим
D2 GPIO_SD_B0_04 H2 USDHC1_DATA2, периферийный режим
D3 GPIO_SD_B0_05 J2 USDHC1_DATA3, периферийный режим
CD_B GPIO_B1_12 D13 USDHC1_CD_B — детект через периферийный режим
SdPwr GPIO_AD_B1_03 M12 GPIO1[19], active-low

CD_B подключён как периферийный сигнал USDHC1 — детект читается через USDHC_GetPresentStatusFlagskUSDHC_CardInsertedFlag. GPIO-прерывание не используется (kSD_DetectCardByHostCD).

SdPwr инициализируется в BOARD_SD_Config() как GPIO-выход, выключен при старте. SDK включает питание автоматически в SD_HostInit() через callback.


Архитектура

graph TB
    FW["firmware_test / tft_app"]
    USD["bsp_usd\nмонтирование FatFS, тест R/W"]
    FATFS["firmware_test_fatfs / tft_app_fatfs\nff.c + fsl_sd_disk + diskio"]
    PORT["port/fatfs/sd\ndiskio_sd.c → fsl_sd_disk"]
    BSP["bsp_sd\nhost init / deinit / card detect"]
    SDMMC_CFG["bsp/generated/sdmmc_config\nBOARD_SD_Config, GPIO питания"]
    SDK_SD["sdk_sdmmc_sd\nfsl_sd, fsl_sdmmc_common"]
    SDK_USDHC["sdk_usdhc\nfsl_usdhc"]

    FW --> USD --> FATFS --> PORT --> BSP
    BSP --> SDMMC_CFG --> SDK_SD --> SDK_USDHC

Почему ff.c и fsl_sd_disk.c не собираются как общая библиотека: оба включают ffconf.h, который разный для firmware_test (FF_FS_REENTRANT=0) и tft_app (FF_FS_REENTRANT=1). Общий только port_fatfs_sd — он ff.h напрямую не включает.


API

bsp_status_t bsp_sd_init(void);
bsp_status_t bsp_sd_deinit(void);
bool         bsp_sd_is_inserted(void);

bsp_sd_init() — конфигурирует SDMMC host однократно (BOARD_SD_Config) и запускает host-контроллер (SD_HostInit). Повторный вызов без deinit — no-op, возвращает BSP_OK.

bsp_sd_is_inserted() — читает регистр USDHC1 PRSSTAT. Не требует предварительного bsp_sd_init() — включает тактирование через CLOCK_EnableClock. Читает аппаратный регистр без дебаунса — добавляй дебаунс в вызывающем коде при механическом детекте.

Коды возврата:

Функция Код Условие
bsp_sd_init BSP_OK Host готов к работе
bsp_sd_init BSP_ERR_INIT SD_HostInit вернул ошибку
bsp_sd_deinit BSP_OK Всегда

Быстрый старт

#include "bsp/sd.h"

if (!bsp_sd_is_inserted()) {
    /* карта отсутствует */
}

if (bsp_sd_init() != BSP_OK) {
    /* host не инициализирован */
}

/* работа с картой через FatFS... */

bsp_sd_deinit();

CMake

target_link_libraries(firmware_test PRIVATE bsp_sd)

Зависимости модуля:

Зависимость Тип Описание
bsp_status PUBLIC bsp_status_t в публичном API
bsp_sdmmc_config PRIVATE BOARD_SD_Config, sdmmc_config.h, sdk_sdmmc_sd

sdk_sdmmc_sd и sdk_usdhc — транзитивно через bsp_sdmmc_config.