Урок 33
Часть 5
SPI. Карта SD. FAT
В прошлой части занятия мы подключили библиотеку для работы с файловой системой и уже смогли не только примонтировать флеш-карту, а уже и открыть файл. Сегодня мы будем продолжать начатое дело и попытаемся уже считать с карты какую-либо информацию.
Чтобы считать какие-то данные из открытого файла, существует функция pf_lseek. Поэтому также вызовем её в main() и отобразим результат
str_lcd(str);
res=pf_lseek(0); //Установим курсор чтения на 0 в 123.txt
sprintf(str,«%d»,res);
setpos(1,0);
str_lcd(str);
То есть читать мы будем с самого начала — с нулевого байта.
Соберём проект, прошьём контроллер и посмотрим результат
Мы видим два нуля, что свидетельствует об удачном выполнении функций
Далее уже вызовем непосредственно функцию чтения и также вернём результат
str_lcd(str);
res=pf_read(buffer2,128,&s1);
sprintf(str,«%d»,res);
setpos(2,0);
str_lcd(str);
Здесь у функции появились уже какие-то параметры. первый параметр — указатель на наш строковый массив, который у нас инициализирован нулями. Второй — количество байтов для считывания. Функция данная «умная» и она, не смотря на то, что байтов у нас в файле меньше, чем мы пытаемся считать, считает до последнего байта и лишнее считывать пытаться не будет. Третий параметр — это формальный указатель, который ничего нам не даёт, но без него нельзя.
Соберём опять код, прошьём наш контроллер и посмотрим результат на дисплее
Отлично! Значит всё у нас прочиталось. Теперь осталось нам попробовать вывести на дисплей текст из файла
str_lcd(str);
setpos(0,1);
str_lcd(buffer2);
Всё содержимое нашего файла считалось. Также мы видим, что функция ничего лишнего не считала.
Теперь, прежде чем нам что-то записать на карту SD, размонтируем файловую систему
str_lcd(buffer2);
res=pf_mount(0x00);//Демонтируем файловую систему карты
sprintf(str,«%d»,res);
setpos(3,0);
str_lcd(str);
Я думаю, нет смысла проверять, что система отмонтировалась. Вставим задержку, очистим дисплей, вызовем заново функцию монтирования и опять отобразим результат, можно с первой позиции, мы же очистили дисплей. И заново откроем тот же файл, вставив перед этим задержку.
str_lcd(str);
_delay_ms(2000);
clearlcd();//очистим дисплей
res=pf_mount(&fs);
sprintf(str,«%d»,res);
setpos(4,0);
str_lcd(str);
_delay_ms(2000);
clearlcd();//очистим дисплей
res=pf_open(«/123.txt»); //Попытка открыть файл 123.txt
sprintf(str,«%d»,res);
setpos(5,0);
str_lcd(str);
Пока проверять ничего не будем, потом всё проверится.
Указатель мы никуда устанавливать не будем, он автоматически встанет на нулевую позицию. Вызовем теперь функцию записи в файл
str_lcd(str);
sprintf(buffer2,«World Hello!»);
res=pf_write(buffer2,strlen(buffer2),&s1);//Запишем текст из buffer2 в файл 123.txt
sprintf(str,«%d»,res);
setpos(6,0);
str_lcd(str);
Что мы тут заметили нового? Мы перевернули слова наоборот в тексте, а также использовали новую функцию для измерения длины строки. Измеряются байты до первого вхождения нулевого байта.
Только есть одна загвоздка. Применив данную функцию, мы ничего не запишем в файл, чтобы всё записалось, нужно финализировать запись. То есть мы можем записывать частями и каждый раз не финализировать, так будет процесс идти быстрее. А затем перед размонтированием файловой системы мы финализируем запись. Поэтому вызовем ещё функцию
str_lcd(str);
res=pf_write(0,0,&s1);//Финализируем файл 123.txt
sprintf(str,«%d»,res);
setpos(7,0);
str_lcd(str);
Вот так. Осталось нам только отмонтировать файловую систему
str_lcd(str);
res=pf_mount(0x00);//Демонтируем файловую систему карты
sprintf(str,«%d»,res);
setpos(8,0);
str_lcd(str);
Соберём код, прошьём контроллер и проверим результат
Все результаты у нас хорошие.
Вынем карту из картоприёмника и поместим в картовод, чтобы считать файл на ПК. Считаем файл:
Теперь давайте отобразим новое содержание файла на дисплее, дописав код для чтения
str_lcd(str);
clearlcd();//очистим дисплей
res=pf_mount(&fs);
sprintf(str,«%d»,res);
setpos(9,0);
str_lcd(str);
_delay_ms(2000);
clearlcd();//очистим дисплей
res=pf_open(«/123.txt»); //Попытка открыть файл 123.txt
sprintf(str,«%d»,res);
setpos(10,0);
str_lcd(str);
res=pf_lseek(0); //Установим курсор чтения на 0 в 123.txt
sprintf(str,«%d»,res);
setpos(11,0);
str_lcd(str);
res=pf_read(buffer2,128,&s1);
sprintf(str,«%d»,res);
setpos(12,0);
str_lcd(str);
setpos(0,2);
str_lcd(buffer2);
res=pf_mount(0x00);//Демонтируем файловую систему карты
sprintf(str,«%d»,res);
setpos(13,0);
str_lcd(str);
while(1)
Проверим результат, воткнув перед этим SD-карту, но не ту же, так как на ней уже файл с новым содержимым, а другую
Всё отлично считывается и пишется.
На этом мы данную часть завершим. В следующей части урока мы устраним мелкие ошибки, а также вместо цифрового отображения результата действий с картой SD мы напишем код для отображения в более удобочитаемом текстовом виде. Также мы удалим лишние неиспользуемые функции и фрагменты исходного кода.
Предыдущая часть Программирование МК AVR Следующая часть
Техническая документация на Secure Digital
Программатор, модуль SD и дисплей можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)
Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)
Добавить комментарий