AVR Урок 33. SPI. Карта SD. FAT. Часть 5



 

Урок 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);

 

То есть читать мы будем с самого начала — с нулевого байта.

Соберём проект, прошьём контроллер и посмотрим результат

 

Image44

 

Мы видим два нуля, что свидетельствует об удачном выполнении функций

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

 

str_lcd(str);

res=pf_read(buffer2,128,&s1);

sprintf(str,«%d»,res);

setpos(2,0);

str_lcd(str);

 

Здесь у функции появились уже какие-то параметры. первый параметр — указатель на наш строковый массив, который у нас инициализирован нулями. Второй — количество байтов для считывания. Функция данная «умная» и она, не смотря на то, что байтов у нас в файле меньше, чем мы пытаемся считать, считает до последнего байта и лишнее считывать пытаться не будет. Третий параметр — это формальный указатель, который ничего нам не даёт, но без него нельзя.

Соберём опять код, прошьём наш контроллер и посмотрим результат на дисплее

 

Image45

 

 

Отлично! Значит всё у нас прочиталось. Теперь осталось нам попробовать вывести на дисплей текст из файла

 

str_lcd(str);

setpos(0,1);

str_lcd(buffer2);

 

Image46

 

Всё содержимое нашего файла считалось. Также мы видим, что функция ничего лишнего не считала.

Теперь, прежде чем нам что-то записать на карту 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);

 

Соберём код, прошьём контроллер и проверим результат

 

Image47

 

Все результаты у нас хорошие.

Вынем карту из картоприёмника и поместим в картовод, чтобы считать файл на ПК. Считаем файл:

 

Image48

 

Теперь давайте отобразим новое содержание файла на дисплее, дописав код для чтения

 

read file

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-карту, но не ту же, так как на ней уже файл с новым содержимым, а другую

 

Image49 Image50

 

Всё отлично считывается и пишется.

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

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Техническая документация на Secure Digital

 

Программатор, модуль SD и дисплей можно приобрести здесь:

Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером

Модуль карты SD SPI

Дисплей LCD 20×4

 

 

Смотреть ВИДЕОУРОК в RuTube (нажмите на картинку)

AVR SPI. Карта SD. FAT

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

AVR SPI. Карта SD. FAT

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*