Некоторые нюансы, которые следует помнить при использовании библиотеки SD
Общие сведения
Взаимодействие между микроконтроллером и SD-картой памяти осуществляется по шине SPI, объединяющей в себе выводы 11, 12 и 13 (на большинстве плат Ардуино), либо 50, 51 и 52 (на Arduino Mega). Помимо перечисленных, еще один вывод должен использоваться для активизации SD-карты. Для этого может использоваться как аппаратный вывод SS - вывод 10 (на большинстве плат Ардуино) или вывод 53 (на Arduino Mega), так и любой другой вывод, указанный в качестве параметра метода SD.begin(). Обратите внимание, что для корректной работы библиотеки SD, аппаратный вывод SS должен быть всегда сконфигурирован как выход, даже в тех случаях, когда он не используется. Указывая этот вывод функции SD.begin(), будьте внимательны, поскольку на разных платах расширения в качестве линии SS могут использовать различные выводы.
На странице библиотеки SD приведены не все ее функции, поскольку некоторые из них относятся к функциям вспомогательных классов.
Форматирование/подготовка карты памяти
(Примечание: здесь и далее под SD-картой памяти подразумеваются карты формата SD или SDHC стандартных размеров - как SD, так и microSD)
Чаще всего SD-карты продаются отформатированными и готовы к работе сразу после покупки. Если же вы используете карту памяти от фотоаппарата или компьютера, то, вероятнее всего, она не будет работать с библиотекой SD. В этом случае карту необходимо отформатировать в файловую систему, поддерживаемую Arduino.
Слишком частое форматирование SD-карты не желательно, т.к. это уменьшает срок ее службы.
Для форматирования карты вам понадобится компьютер с установленным SD-кардридером. Библиотека SD поддерживает работу с двумя файловыми системами - FAT16 и FAT32, однако, по возможности рекомендуется использовать систему FAT16. Процесс форматирования карты памяти довольно прост и заключается в следующем.
На Windows : щелкните правой кнопкой на значке вашей SD-карты, после чего из контекстного меню выберите пункт "Format". Убедитесь, что в качестве файловой системы выбрана система FAT.
На OSX : откройте программу Disk Utility (расположенную в меню Applications > Utilities). Выберите карту памяти, перейдите на вкладку "Erase", в разделе "Format" выберите пункт "MS-DOS(FAT)", после чего нажмите кнопку Erase. Примечание: при форматировании устройства, OSX размещает на нем ряд скрытых системных файлов. Чтобы этого избежать, следуйте инструкциями на сайте Ladyada.
На Linux : вставьте SD-карту памяти и откройте терминал. В командной строке наберите "df" и нажмите Enter. Команда выведет системное имя устройства, соответствующее вашей SD-карте - оно будет выглядеть примерно так: "/dev/sdb1". Отмонтируйте SD-карту памяти, не вынимая ее из кардридера. Далее, наберите в терминале "sudo mkdosfs -F 16 /dev/sdb1", где вместо "/dev/sdb1" необходимо указать системное имя вашего устройства. Извлеките и снова подключите SD-карту для проверки ее работоспособности.
Имена файлов
Файловые системы FAT предъявляют определенные требования к именам файлов. Одно из таких требований - использование формата имени 8.3, согласно которому имена файлов должны выглядеть так: "NAME001.EXT", где "NAME001" - строка из 8 (или менее) символов, а "EXT" - расширение файла из 3 символов. В качестве расширений обычно используют сокращения ".TXT" или ".LOG". Что касается имени файла - оно может быть короче 8 символов (например, "mydata.txt" или "time.log"). Подробнее о стандарте 8.3 см. здесь.
Открытие/закрытие файлов
Функция file.write() физически не записывает данные на карту памяти, она лишь помещает их в определенный буфер, который сбрасывается на карту только при вызове функции flush() или close(). Поэтому, после каждого открытия файла не забывайте закрывать его, в противном случае ваши данные могут быть утеряны.
Начиная с версии 1.0, в Арудино реализована возможность одновременного открытия нескольких файлов.
Различные платы расширения
Существуют различные платы расширения, работающие с SD-картами памяти. Список наиболее часто используемых плат приведен ниже.
Плата расширения Arduino Ethernet
Плата расширения Ethernet поставляется со встроенным разъемом для SD-карт памяти и при подключении располагается над Ардиуно. В качестве вывода CS для активизации SD-карты используется вывод 4, поскольку традиционный 10 вывод задействован Ethernet-модулем. Поэтому, для работы с SD-картой необходимо использовать команду SD.begin(4).
Отладочная плата Adafruit Micro-SD
Данная плата предназначена для работы с Micro-SD картами памяти. Прежде, чем начать с ней работать, необходимо соединить ее выводы с Ардуино несколькими проводниками. Для этого подключите вывод GND к земле, 5V к 5V, CLK - к выводу 13 Ардуино, DO - к выводу 12, DI - к выводу 11, и CS - к выводу 10. Если вывод 10 на Ардуино уже занят - можно использовать любой другой свободный вывод, указав его функции SD.begin().
Плата расширения Sparkfun SD
Плата расширения Sparkfun также крепится поверх Ардуино, но в качестве вывода CS SD-карты использует вывод 8. Поэтому, в данном случае для работы с картой памяти необходимо использовать команду SD.begin(8). Примечание: существует новая версия платы расширения Sparkfun, которая внешне выглядит так же. Основное отличие состоит в том, что на старых версиях платы отсутствует соединение с шиной 3.3В и нет встроенного 6-разрядного инвертора.