Эта библиотека предназначена для работы с SD-картой с файловой системой FAT через SDIO интерфейс с использованием DMA под управлением микроконтроллера STM32f4.
Примечание: существует библиотека для USB флешки с файловой системой FATFS (урок №32) и комбинированная USB+SD библиотека (урок №87).
Для создания данной библиотеки (FATFS) был использована библиотека с открытым исходным кодом от STM для работы с функциями SDIO.
Библиотека FATFS имеет очень хорошую англоязычную документацию, в которой описаны все необходимые функции и параметры.
Далее в статье будут описано несколько основных функций, позволяющих смонтировать флешку, открыть файл, прочитать или записать строку в него.
Скорость чтения блока составляет 2.4Мбайт/с в буфер 512 байт, скорость записи на карточку - 500 кбайт/с.
Начиная с библиотеки версии 1.4 можно переключать с 4х битного на одно-битный режим управления в файле "stm32_ub_sdcard.h" режиме SDIO. Если контакт контроля не используется, его можно отключить там же.
ПРИМЕЧАНИЕ: Torsten S. с форума по микроконтроллерам указал ошибку, которая имеет функция FATFS "f_write" (и, предположительно, "f_read"). Если в эту функция передается файл больше 512 байт, происходит ошибка, и файл неправильно читается/пишется. Функции автора “WriteBlock/ReadBlock” позволяют использовать файлы больше 512 байт, так что ошибка не возникает. Но необходимо проверить отсутствие ошибки при непосредственном использовании функции.
Возможные аппаратные ошибки:
SD-карта может неправильно работать из-за каких либо аппаратных ошибок. Вот список наиболее частых из них:
- Плохой контакт проводников (непропай)
- Короткое замыкание между контактами (капля припоя и т.д.)
- Неправильное подключение
- Неисправный разъем SD-карты
- Карта с неправильной файловой системой
- Карта не поддерживается
- Слишком длинные линии подключения
- Подтяжки вверх на линиях
Пример работы и подключение:
Данные о карте.
Подключение карты.
- Линии соединения делайте как можно короче
- Не используйте подтягивающие резисторы на всех линиях
- Используйте SD-карты <=1Гб
- Используйте файловую систему FAT (FAT16), не FAT32 и не NTFS
Используемые выводы и DMA:
1-битный режим:
PC8 : SDIO_D0 = SD-карта DAT0
PC12 : SDIO_CK = SD-карта Clock
PD2 : SDIO_CMD = SD-карта CMD
Примечание: вывод CD SD-карты должен быть подключен к Vcc!!
4х-битный режим:
PC8 : SDIO_D0 = SD-карта DAT0
PC9 : SDIO_D1 = SD-карта DAT1
PC10 : SDIO_D2 = SD-карта DAT2
PC11 : SDIO_D3 = SD-карта DAT3/CD
PC12 : SDIO_CK = SD-карта Clock
PD2 : SDIO_CMD = SD-карта CMD
Вывод обнаружения карты:
PC0 : SD_Detect-Pin (Hi = SD-карта не вставленна)
либо DMA2_STREAM3_CHANNEL4
или DMA2_STREAM6_CHANNEL4
Требования:
Подключаемые модули CooCox-IDE: GPIO, MISC, SDIO, DMA.
Поддерживаемые библиотеки: FATFS.
Перечисления:
typedef enum { FATFS_OK =0, FATFS_NO_MEDIA, FATFS_MOUNT_ERR, FATFS_GETFREE_ERR, FATFS_UNLINK_ERR, FATFS_OPEN_ERR, FATFS_CLOSE_ERR, FATFS_PUTS_ERR, FATFS_SEEK_ERR, FATFS_RD_STRING_ERR, FATFS_RD_BLOCK_ERR, FATFS_WR_BLOCK_ERR, FATFS_EOF, FATFS_DISK_FULL }FATFS_t;
typedef enum { F_RD =0, // зачитать (только если файл существует) F_WR, // записать (только если файл существует) и добавить данные F_WR_NEW, // записать (создать новый файл) и добавить данные F_WR_CLEAR // записать поверх (удалить старые данные) }FMODE_t;
Функции:
void UB_Fatfs_Init(void); // инициализации функций FATFS FATFS_t UB_Fatfs_CheckMedia(MEDIA_t dev); // проверка наличия карты FATFS_t UB_Fatfs_Mount(MEDIA_t dev); // смонтировать карту FATFS_t UB_Fatfs_UnMount(MEDIA_t dev); // отключить карту FATFS_t UB_Fatfs_DelFile(const TCHAR* name); // удалить файл FATFS_t UB_Fatfs_OpenFile(FIL* fp, const TCHAR* name, FMODE_t mode); // открыть файл для чтения или записи FATFS_t UB_Fatfs_CloseFile(FIL* fp); // закрыть файл FATFS_t UB_Fatfs_WriteString(FIL* fp, const TCHAR* text); // записать строку в открытый файл FATFS_t UB_Fatfs_ReadString(FIL* fp, char* text, int len); // чтение строки из открытого файла uint32_t UB_Fatfs_FileSize(FIL* fp); // чтение переменной из файла FATFS_t UB_Fatfs_ReadBlock(FIL* fp, unsigned char* buf, uint32_t len, uint32_t* read); // побайтное чтение файла FATFS_t UB_Fatfs_WriteBlock(FIL* fp, unsigned char* buf, uint32_t len, uint32_t* write); // побайтная запись в файл
Пример использования:
//-------------------------------------------------------------- // File : main.c // Datum : 06.04.2013 // Version : 1.1 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.0 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der FATFS-SDIO-Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_fatfs.h" int main(void) { FIL myFile; // Хэндлер файла SystemInit(); // Инициализация настроек кварца // инициализации функций FATFS UB_Fatfs_Init(); // проверка наличия карты if(UB_Fatfs_CheckMedia(MMC_0)==FATFS_OK) { // Смонтировать карту if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) { // записать в файл в коневом каталоге if(UB_Fatfs_OpenFile(&myFile, "0:/UB_File.txt", F_WR_CLEAR)==FATFS_OK) { //записать несколько строк в файл UB_Fatfs_WriteString(&myFile,"Test der WriteString-Funktion"); UB_Fatfs_WriteString(&myFile,"hier Zeile zwei"); UB_Fatfs_WriteString(&myFile,"ENDE"); // закрыть файл UB_Fatfs_CloseFile(&myFile); } // отключить карту UB_Fatfs_UnMount(MMC_0); } } while(1) { } }
В приложении проект CooCox отдельная библиотека для использования в других проектах. Автор оригинала статьи просит задавать вопросы на его сайте на немецком или английских языках.
Прикрепленные файлы:
- ub_stm32f4_fatfs_sdio_v104_RUS.rar (184 Кб)
- Demo_13_FATFS_SDIO_RUS.rar (473 Кб)
Комментарии (7) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
void UB_Fatfs_Init(void); (в h файле) а на саму функцию (с ) не находит не видит. И все остальные до маин подчеркивает красным. Проект не изменял.