Подключение SD карты по SPI к STM32F4xx и FatFS

Опубликовано 30 января 2014 в рубрике Микроконтроллеры

Рейтинг статьи:

Разбираясь к контроллером STM32 встала задача подключения внешней памяти, а точнее SD карты, как наиболее простого и удобного средства хранения. И дабы облегчить кому-то жизнь, опишу, как это было сделано и приложу исходный код. Работаем с SD картой STM32

Для сохранения данных нужно место. Можно использовать flash-память микроконтроллера, но это уменьшает количество циклов записи. Можно EEPROM на шине I2C или SPI, но они, как правило, малого объема, и удобны для хранения только системных настроек. А вот использование карты памяти - это как раз то, что надо. Большой объем, удобство передачи информации, возможность передачи информации в контроллер (например прошивка).

SD-карта может быть подключена двумя разными интерфейсами - SDIO и SPI. Так как скорость работы с памятью в данном случае не критична, использовался SPI протокол. Для сохранения измерений и прошивки прибора этого должно хватить. 

Подключение. 

Давайте посмотрим на распиновку карты памяти. Для работы по интерфейсу SPI помимо питания нам понадобятся сигналы CS, SCK, MISO, MOSI.Распиновка SD карт На контроллере эти сигналы подключил к выводам:

  • PB12 - CS
  • PB13 - SCK
  • PB14 - MISO
  • PB15 - MOSI

Также нам понадобится работа с файловой системой на карте памяти. Для этого будем использовать библиотеку FatFS.

Итак, в первую очередь нам необходимо инициализировать всю необходимую периферию и написать драйвер устройства, т.е. функции инициализации, приема и передачи данных. Тут не забываем, что инициализация устройства должна происходить на малой скорости обмена, и только после можно переходить на полную скорость.

Для инициализации карты памяти используется функция 

DSTATUS disk_initialize (
uint8_t drv /* Physical drive number (0) */
)

которая в свою очередь настраивает и инициализирует SPI интерфейс и SD карту.

Для считывания данных с карты используется функция

DRESULT disk_read (
uint8_t drv, /* Physical drive number (0) */
uint8_t *buff, /* Pointer to the data buffer to store read data */
uint32_t sector, /* Start sector number (LBA) */
uint8_t count /* Sector count (1..255) */
)

Для записи на карту

DRESULT disk_write (
uint8_t drv, /* Physical drive number (0) */
const uint8_t *buff, /* Pointer to the data to be written */
uint32_t sector, /* Start sector number (LBA) */
uint8_t count /* Sector count (1..255) */
)

Не следует забывать, что это низкоуровневые функции работы с картой памяти. Они используются библиотекой FatFS для доступа к карте. А вся дальнейшая работа идет с помощью функций библиотеки.

Ну и в заключение пример работы, который создает директорию, в ней файл. 

FRESULT f_err_code;
static FATFS FATFS_Obj;
UINT len; //для хранения количества реально записанных байт
if ( disk_initialize ( 0 ) == 0 )
if (f_mount(0, &FATFS_Obj) == 0) { //Mount Fat Fs


res = f_mkdir ("0:WorkProj"); //создаем директорию
f_chdir ("0:/DIR");
char str[]="Hello, Word"; //записываемая строка
//создаем файл с именем FileName и открываем его для для записи
res = f_open(&fil_obj, "newfile.txt", FA_WRITE | FA_CREATE_ALWAYS);
// if(res) return res; //если произошла ошибка
//записываем строку в файл
res = f_write(&fil_obj, str, sizeof(str), &len);
// if(res) return res; //если произошла ошибка
//закрываем файл
f_close(&fil_obj);
}

Вот пример программы. Если у Вас возникнут вопросы - спрашивайте. Ну и.. до новых встреч.

Комментариев: 7

  • guest:

    Запустил на F103 без проблем, переделав только инициализацию периферии. Спасибо!

      guest:

      можете прислать Ваш пример на почту roma-cezar@rambler.ru, заранее благодарен!

  • guest:

    .

  • guest:

    .










































































































































































































    .

  • guest:

    Какая скорость чтениязаписи была получена в режиме SPI ?

      Somebady:

      Скорость не проверял, т.к. карта использовалась для записи логов с небольшой скоростью

  • guest:

    This message is posted here using XRumer + XEvil 4.0

    XEvil 4.0 is a revolutionary application that can solve almost any antibot protection.
    Captcha Solution Google (ReCaptcha-1, ReCaptcha-2), Facebook, BING, Hotmail, Yahoo,
    Yandex, VKontakte, Captcha Com - and over 8.4 million other types!

    You read this - it means it works! ;)
    Details on the official website of XEvil.Net, there is a free demo version.

    Check YouTube video "XEvil ReCaptcha2"

Добавить комментарий