- Функции для работы с ММС- И SD-картами памяти
Функции для работы с ММС- И SD-картами памяти
Multi Media Card (MMC) - это стандарт карт флэш-памяти. ММС-карты в настоящее время имеют объём до нескольких десятков гигабайт и используются в сотовых телефонах, трЗ-плеерах, цифровых камерах и PDA.
Secure Digital (SD) - это стандарт карт флэш-памяти, основанный на старом формате Multi Media Card (MMC). SD-карты в настоящее время имеют объём до нескольких десятков гигабайт. Их модификации с уменьшенными размерами Mini SD и Micro SD используются в сотовых телефонах, трЗ-плеерах, цифровых камерах и PDA.
Среда MikroC предоставляет библиотеку для доступа к данным в ММС через SPI. Эта библиотека также поддерживает карты памяти SD. Данная библиотека имеет следующие ограничения:
• библиотека работает только с семейством PIC18;
• библиотечные функции создают и читают файлы только из корневого каталога;
• библиотечные функции при записи файла заносят данные в обе таблицы - FAT1 и FAT2, но при чтении используют данные только из таблицы FAT 1. То есть восстановление данных при разрушении FAT1 не производится;
• начиная с версии 5.0.0.3, библиотека может обмениваться данными с носителем, который содержит Master Boot Record (MBR) в секторе 0. Она читает необходимую информацию из MBR и переходит к первому доступному primary логическому разделу. За детальной информацией о MBR, физических и логических устройствах, pri-mary/secondary-разделах и таблицах разделов следует обратиться к другим ресурсам, например, Wi-kipedia и т.п.
Библиотека включает в свой состав следующие функции работы с картами: Mmc_Init, Mmc_Read_Sector, Mmc_Write_Sector, Mmc_Read_Cid и Mmc_Read_Csd. Кроме того, имеются следующие функции для работы с файлами:
• Mmc_Fat_Init;
• Mmc_Fat_Assign;
• Mmc_Fat_Reset;
• Mmc_Fat_Read;
• Mmc_Fat__Rewrite;
• Mmc_Fat_Append;
• Mmc_Fat_Delete;
• Mmc_Fat_Write;
• Mmc_Fat_Set_File_Date;
• Mmc_Fat_Get_File_Date;
• Mmc_Fat_Get_File_Size;
• Mmc_Fat_Get_Swap_File.
Описание этих функций приведено в таблицах 22 - 38 соответственно.
Таблица 22. Описание функции Mmc_Init
Прототип | unsigned short Mmc_Init(unsigned short *port, unsigned short pin) |
Возвращаемое значение | Возвращает 0, если MMC присутствует и успешно инициализирована, в противном случае возвращает 1 |
Описание | Инициализирует MMC через аппаратный SPIинтерфейс, где состояние вывода chip select задаётся аргументами port и pin; а порт и выводы интерфейса определяются установками аппаратуры SPI для соответствуюшего контроллера. Mmc_Init должна вызываться перед использованием других функций этой библиотеки |
Требования | Функция Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH); должна быть вызвана перед использованием Mmc_Init |
Пример | Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH); // Цикл, пока MMC не будет инициализирована while (Mmc_Init(&PORTC, 2)); |
Таблица 23. Описание функции Mmc_Read_Sector
Прототип | unsigned short Mmc_Read_Sector(unsigned long sector, unsigned short *data) |
Возвращаемое значение | Возвращает 0 при успешном чтении или 1, если имеет место ошибка |
Описание | Функция читает один сектор (512 байт) из MMC, адрес сектора задаётся аргументом sector. Читаемые данные сохраняются в массиве data |
Требования | MMC должна быть проинициализирована с помощью функции Mmc_Init. |
Пример | error = Mmc_Read_Sector(sector, data) |
Таблица 24. Описание функции Mmc_Write_Sector
Прототип | unsigned short Mmc_Write_Sector(unsigned long sector, unsigned short *data) |
Возвращаемое значение | Возвращает 0 при успешной записи; 1, если была ошибка в передаче команды записи; 2, если была ошибка записи |
Описание | Функция записывает 512 байт из data в сектор с адресом sector MMC |
Требования | MMC должна быть проинициализирована с помощью функции Mmc_Init. |
Пример | error = Mmc_Write_Sector(sector, data) |
Таблица 25. Описание функции Mmc_Write_Sector
Прототип | unsigned short Mmc_Read_Cid(unsigned short * data_for_registers) |
Возвращаемое значение | Возвращает 0, если чтение успешно, и 1 в случае ошибки |
Описание | Функция читает CIDрегистр и возвращает 16 байт содержания в data_for_registers |
Требования | MMC должна быть проинициализирована с помощью функции Mmc_Init |
Пример | error = Mmc_Read_Cid(data) |
Таблица 26. Описание функции Mmc_Read_Csd
Прототип | unsigned short Mmc_Read_Csd(unsigned short *data_for_registers) |
Возвращаемое значение | Возвращает 0, если чтение успешно, и 1 в случае ошибки |
Описание | Функция читает CSDрегистр и возвращает 16 байт содержания в data_for_registers |
Требования | MMC должна быть проинициализирована с помощью функции Mmc_Init |
Пример | error = Mmc_Read_Csd(data) |
Таблица 27. Описание функции Mmc_Fat_Init
Прототип | unsigned short Mmc_Fat_Init(char *port, unsigned short pin) |
Возвращаемое значение | Функция возвращает 0, если инициализация успешна, и 1, если загрузочный сектор не найден, или 255, если карта не обнаружена |
Описание | Инициализирует подпрограммы работы с системой FAT MMC/SD-карт; линия CS для связи задаётся аргументами port и pin parameters. Эта функция должна быть вызвана перед использованием остальных библиотек FAT MMC |
Требования | Функция Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH); должна быть вызвана перед использованием Mmc_Init |
Пример | Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH); Mmc_Fat_Init(&PORTC, 2); |
Таблица 28. Описание функции Mmc_Fat_Assign
Прототип | unsigned short Mmc_Fat_Assign(char *filename, char create_file) |
Возвращаемое значение | Возвращает 1, если файл присутствует (или файла нет, но новый файл создаётся), или 0, если файл отсутствует и новый файл не создаётся |
Описание | Назначает файл для FATопераций. Если файл отсутствует, функция создаёт новый файл с заданным названием. Аргумент filename – это название файла (должно быть в формате 8.3 UPPERCASE). Аргумент create_file – это признак создания новых файлов. Если create_file отличается от 0 – создаётся новый файл (если нет файла с указанным названием) |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init |
Пример | Mmc_Fat_Assign('MIKROELE.TXT',1) |
Таблица 29. Описание функции Mmc_Fat_Assign
Прототип | void Mmc_fat_Reset(unsigned long *size) |
Возвращаемое значение | Нет |
Описание | Открывает существующий файл для чтения, size – возвращает размер файла в байтах |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init Файл должен быть назначен. См. Mmc_Fat_Assign |
Пример | Mmc_Fat_Reset(size) |
Таблица 30. Описание функции Mmc_Fat_Read
Прототип | void Mmc_Fat_Read(unsigned short *bdata) |
Возвращаемое значение | Нет |
Описание | Читает байт данных из файла в bdata |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init Файл должен быть назначен. См. Mmc_Fat_Assign Файл должен быть открыт для чтения. См. Mmc_Fat_Reset |
Пример | Mmc_Fat_Reset(size) |
Таблица 31. Описание функции Mmc_fat_Rewrite
Прототип | void Mmc_fat_Rewrite() |
Возвращаемое значение | Нет |
Описание | Открывает файл для записи. Если существует файл с заданным названием, файл будет перезаписан |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init Файл должен быть назначен. См. Mmc_Fat_Assign |
Пример | Mmc_Fat_Rewrite |
Таблица 32. Описание функции Mmc_fat_Append
Прототип | void Mmc_fat_Append() |
Возвращаемое значение | Нет |
Описание | Открывает файл для записи. Если существует файл с заданным названием, данные будут дописаны в его конец |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init. Файл должен быть назначен. См. Mmc_Fat_Assign |
Пример | Mmc_Fat_Append |
Таблица 33. Описание функции Mmc_Fat_Delete
Прототип | void Mmc_Fat_Delete() |
Возвращаемое значение | Нет |
Описание | Удаляет файл с MMC |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init. Файл должен быть назначен. См. Mmc_Fat_Assign |
Пример | Mmc_Fat_Delete |
Таблица 34. Описание функции Mmc_fat_Write
Прототип | void Mmc_fat_Write(char *fdata, unsigned data_len); |
Возвращаемое значение | Нет |
Описание | Записывает данные в файл на MMC. Аргумент fdata – записываемые данные. Аргумент data_len – количество байтов информации для записи |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init. Файл должен быть назначен. См. Mmc_Fat_Assign. Файл должен быть открыт для записи. См. Mmc_Fat_Rewrite или Mmc_Fat_Append |
Пример | Mmc_Fat_Write(file_contents, 42); // записать данные в назначенный файл |
Таблица 35. Описание функции Mmc_fat_Set_File_Date
Прототип | void Mmc_fat_Set_File_Date(unsigned int year, unsigned short month, unsigned short day, unsigned short hours, unsigned short mins, unsigned short seconds) |
Возвращаемое значение | Нет |
Описание | Устанавливает атрибуты времени для файла. Можно устанавливать year, month, day. hours, mins, seconds |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init. Файл должен быть назначен. См. Mmc_Fat_Assign. Файл должен быть открыт для записи. См. Mmc_Fat_Rewrite или Mmc_Fat_Append |
Пример | Mmc_Fat_Set_File_Date(2005, 9, 30, 17, 41, 0) |
Таблица 36. Описание функции Mmc_fat_Get_File_Date
Прототип | void Mmc_fat_Get_File_Date(unsigned int *year, unsigned short *month, unsigned short *day, unsigned short *hours, unsigned short *mins) |
Возвращаемое значение | Нет |
Описание | Читает атрибуты времени файла. Можно читать year, month, day, hours, mins |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init. Файл должен быть назначен. См. Mmc_Fat_Assign |
Пример | Mmc_Fat_Get_File_Date(year, month, day, hours, mins); |
Таблица 37. Описание функции Mmc_fat_Get_File_Size
Прототип | unsigned long Mmc_fat_Get_File_Size() |
Возвращаемое значение | Размер файла в байтах |
Описание | Функция позволяет получить размер файла в байтах |
Требования | Порты должны быть проинициализированы для FAT-операций с MMC. См. Mmc_Fat_Init. Файл должен быть назначен. См. Mmc_Fat_Assign |
Пример | Mmc_Fat_Get_File_Size |
Таблица 38. Описание функции Mmc_Fat_Get_Swap_File
Прототип | unsigned long Mmc_Fat_Get_Swap_File(unsigned long sectors_cnt) |
Возвращаемое значение | Номер начального сектора swapфайла, если он был создан, в противном случае возвращает 0 |
Описание | Эта функция используется для создания swap-файла на MMC/SD-носителе. Она принимает аргумент sectors_cnt в качестве количества последовательных секторов, которые предполагается использовать в качестве swap-файла. В процессе исполнения функция ищет доступные последовательно расположенные сектора, количество которых задано аргументом sectors_cnt. Если на носителе существует такая область, в ней создается файл MIKROSWP.SYS и область соответствующим образом обозначается в таблицах FAT. Файлу присваиваются атрибуты: system, archive и hidden, чтобы отличать его от других файлов. Если файл с именем MIKROSWP.SYS уже существует на этом носителе, данная функция удаляет его до создания нового такого же. Назначение swap-файла состоит в том, чтобы сделать процесс чтения и записи на MMC/SD-носитель настолько быстрым, насколько это возможно, благодаря использованию функций Mmc_Read_Sector() и Mmc_Write_Sector() непосредственно, без потенциального разрушения FAT-системы. Swap-файл может рассматриваться как «окно» на носителе, куда пользователь может свободно писать/читать данные каким ему угодно способом. Его главное назначение в библиотеке mikroC состоит в обеспечении процесса быстрого сбора данных, когда критичный ко времени процесс сбора данных заканчивается, данные можно переписать в «нормальный» файл в требуемом формате |
Требования | Порты должны быть проинициализированы для FATопераций с MMC. См. Mmc_Fat_Init |
Пример | // Попытка создания swapфайла размером не менее 1000 секторов // Если удаётся, то номер стартового сектора посылается в USART void M_Create_Swap_File() { size = Mmc_Fat_Get_Swap_File(1000); if (size) { Usart_Write(0xAA); Usart_Write(Lo(size)); Usart_Write(Hi(size)); Usart_Write(Higher(size)); Usart_Write(Highest(size)); Usart_Write(0xAA); } }//end |
Функция Mmc_Set_Reg_Adr предназначена только для внутренних потребностей компилятора. Схема подключения карты памяти к микроконтроллеру показана на рисунке 27.
Рис. 27. Схема подключения карты памяти к микроконтроллеру
В нижеследующем примере программы 1024 байта записываются в сектора 55 и 56, а затем сектора читаются и выводятся в порт USART для визуального контроля:
unsigned short trap;
unsigned short data[512];
void main() {
Usart_Init(9600);
// Инициализация интерфейса ММС
Spi_Init_Advanced(MASTER_0SC_DIV1б, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH);
while (Mmc_Init(&PORTC, 2)) ;
// Заполнение буфера символами "М"
for (i = 0; i <= 511; i++)
data[i] = "M";
// Запись его в сектор 55 ММС
tmp = Mmc_Write_Sector(55, data);
// Заполнение буфера символами "Е"
for (i = 0; i <= 511; i++)
data[i] = "E";
// Запись его в сектор 56 ММС
tmp = Mmc_Write_Sector(56, data);
/** Теперь чтение секторов 55 и 56 **/
// Чтение сектора 55
tmp = Mmc_Read_Sector(55, data);
// Отправка 512 байтов из буфера в USART
if (tmp == 0)
for (i = 0; i < 512; i++)
Usart_Write(data[i]);
// Чтение сектора 56
tmp = Mmc_Read_Sector(56, data);
// Отправка 512 байтов из буфера в USART
if (tmp == 0)
for (i = 0; i < 512; i++)
Usart_Write(data[i]);
} // end