ДП_поясняк (1231259), страница 8
Текст из файла (страница 8)
MRF_write_l(addr, data)– функция записи в регистры памяти контроллера модуля, которые находятся в области длинных адресов. Функция имеет аргумент в виде двух байтового слова – адреса регистра. Адреса переопределены по именам регистров в заголовочном файле, для удобства и читаемости кода. Функция ни чего не возвращает.
MRF_read_s(addr) – функция производит чтение памяти контроллера модуля. При этом адресация является короткой. Функция имеет однобайтовый аргумент – адрес. Функция возвращает однобайтовое значение – содержимое ячейки памяти, регистра или буфера контроллера модуля.
MRF_read_l(addr) - функция производит чтение памяти контроллера модуля. При этом адресация является длинной. Функция имеет двухбайтовый аргумент – адрес. Функция возвращает однобайтовое значение – содержимое ячейки памяти, регистра или буфера контроллера модуля.
Для работы с LCD дисплеем была использована библиотека «LCD.h». Библиотека написана согласно технической документации на данное изделие. Библиотека позволяет инициализировать дисплей, производить вывод данных на экран путем динамического изменения изображения, а так же путем записи данных в память. Реализованы функции вывода букв английского алфавита, которые уже записаны контроллер дисплея. Так же есть возможность самому выводить данные на дисплей, путем занесения массива данных в знак-позицию дисплея. Основные использованные функции библиотеки представлены ниже.
LCDinit() - данная функция выполняет стартовую инициализацию дисплея, а так же переводит дисплей в режим работы по 8 битной шине данных, либо по 4 битной.
LCDcommand(data) – данная функция отправляет в дисплей команды. Аргументом является некое значение, которое соответствует команде. Команды описаны в заголовочном файле библиотеки.
LCDGotoXY(x, y) – функция переводит курcор дисплея в позицию X, Y. Аргументом функции является соответственно два байта – значение Х и значение Y. Значение Х в диапазоне от 0 до 20. Значения Y от 0 до 3.
LCDdata(data) – функция отправляет на дисплей один символ. В качестве аргумента передается значение буквы.
LCDstring(data, x, y)–функция записывает на дисплей символьный массив, записанный в программной памяти, в позицию X, Y. В качестве аргумента передается соответственно массив, и позиция, с которой начнется вывод.
LCDclear() – данная функция очищает экран, и переводит курсор в нулевое положение.
Для реализации программных задержек, была использована стандартная библиотека «delay.h». Библиотека позволяет использовать задержку, с указанием длительности, как в микросекундах, так и в миллисекундах. Библиотека написана на языке программирования С, использованием ассемблерных вставок, что повышает точность используемых временных задержек. Основные функции библиотеки:
_delay_ms(data) и _delay_us(data) функции задержки в мили и микро секундах соответственно. В качестве аргументов передаются значения задержки.
Для упрощения работы с прерываниями, что бы в ручную не переопределять таблицу векторов прерывания, была использована стандартная библиотека работы с прерываниями – «interrupt.h». Использованные определения библиотеки:
-
ISR (ADC_vect){ } – функция, вызов которой осуществляется по прерыванию по завершении преобразовании АЦП;
-
ISR (TIMER2_OVF_vect){ } – функция, вызов которой осуществляется по прерыванию по переполнению 8 битного таймера.
Для организации обмена данными по UART ,была использована библиотека – «uart_driver.c». В библиотеке находятся все необходимые для работы с последовательным интерфейсом дескрипторы. Так же в библиотеке реализованы кольцевые буферы, для передачи и приема информации. Так же есть функции со встроенным форматированием и последующей передачей. Имеется функция ожидания нажатия клавиши – что очень удобно при организации взаимодействия с пользователем.
Основные функции:
-
uart_init(baud) – данная функция производит все необходимые записи в регистры настройки последовательного интерфейса UART. В качестве аргумента передается значение скорости в бодах. Так же функция настраивает интерфейс на 1 стоп бит, без проверки на четность и 8 битовые посылки.
-
uart_putc(data) – данная функция производит отправку одного символа. В качестве аргумента передается значение символа в ASCI коде;
-
uart_getc () – функция принимает однобайтовое значение. Не имеет аргумента, и возвращает принятое значение;
-
uart_write (str) – данная функция отправляет символьный массив, записанный в программную память. В качестве аргумента передается указатель на отправляемый символьный массив;
-
CharToInt(char) данная функция используется для преобразования цифры в ASCII коде в целочисленный эквивалент;
-
uart_wait (char *msg, chark) – функция ожидает указанный символ, и отправляет записанный в программной памяти символьный массив. В качестве указателя передается переменная, в которой находится символьный массив. Вторым аргументом является символ.
Для инициализации и работы с SD картами была использована библиотека – «sd.c». Библиотека написана согласно спецификации на устройство – в данном случае на карту памяти типа SD - Trancend 2 Gb. Основные функции:
-
sd_cmd(char b0, char b1, char b2, char b3, char b4, char b5) функция отправки команды карте. В результате успешного выполнения, функция возвращает 00h . В качестве параметров передается индекс команды;
-
sd_card_init() – функция выполняет инициализацию карты. В случае успешного выполнения, функция возвращает 00h;
-
read_block (char* buff, unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4) – функция чтения блок данных из памяти карты. Размер блока 512 байт. В качестве параметров функции передается 4 однобайтовые переменные, в которых указан номер блока, и блок данных;
-
write_block (char* buff, unsigned char a1, unsigned char a2, unsigned char a3, unsigned char a4) – функция производит запись в память карты блок данных, размером 512 байт. В качестве параметров функции передается 4 однобайтовые переменные, в которых указан номер блока, и буфер, в который будет произведена запись.
Для работы с расширителем портов, работающем по интерфейсу I2C (TWI), была использована библиотека – «i2cmaster.с». В библиотеке реализованы функции инициализации, адресации и обмена по шине I2C
Функции библиотеки:
-
i2c_init () – функция инициализации интерфейса;
-
i2c_stop () – функция остановки интерфейса;
-
i2c_start (unsigned char addr) – начинает работу шины. В качестве параметра указывается адрес устройства;
-
i2c_write (data) – функции записи данных по шине;
-
i2c_readAck () – функция читает ответ от устройства;
-
i2c_read (ack) – функция читает один байт данных от устройств.
Для работы с системой FAT была использована библиотека «Petit_FAT_FS_sample.c». В ней описаны все дескрипторы и функции работы с файлами и файловой системой, основные из них:
FRESULT pf_mount (FATFS* fs) - смонтировать/демонтировать диск. Эта функция должна вызываться перед началом работы с диском. Она получает данные о структуре файловой системы диска и позволяет продолжить работу с его содержимым. Также функция демонтирует или виртуально отключает диск, если ее вызывать с нулевым указателем. Когда диск демонтирован, все остальные функции библиотеки возвращают FR_NOT_ENABLED (диск не смонтирован). Функция pf_mount() доступна всегда.
Параметры:
FATFS*fs - указатель на объект типа FATFS. Это объект библиотеки, в котором описана структура файловой системы. На него можно взглянуть в файле «pff.h». Ну а по сути, это просто переменная определенного типа, которая должна быть предварительно объявлена.
Возвращаемые значения:
-
FR_OK - успешное завершение функции;
-
FR_NOT_READY - не удалось инициализировать диск;
-
FR_DISK_ERR - ошибка диска;
-
FR_NO_FILESYSTEM - на диске нет правильного FAT раздела;
-
FRESULT pf_open (constchar* path) - открывает существующий файл. Функция должна вызываться перед тем, как выполняется любая работа с файлом - чтение, запись, изменение указателя. С открытым файлом можно работать до тех пор, пока не будет открыт другой файл. Функция pf_open() доступна всегда.
Параметры:
- constchar *path - указатель на строку, показывающую путь к файлу. Строка должна заканчиваться нулевым символом. Путь нужно указывать полностью, разделяя подкаталоги символом слэша.
Возвращаемые значения
-
FR_OK - успешное завершение функции;
-
FR_NO_FILE - не удалось найти файл;
-
FR_NO_PATH - не удалось найти путь;
-
FR_DISK_ERR - ошибка диска;
-
FR_NOT_ENABLED - не смонтирован диск.
FRESULT pf_read (void* buff, WORD btr, WORD* br) – прочитать данные из файла. Функция читает заданное количество байт из открытого файла и записывает их в буфер пользователя. Также она подсчитывает количество прочитанных байт. Если заданное количество байт и прочитанное не совпадают, значит при чтении был достигнут конец файла. Функция доступна, когда параметр _USE_READ равен 1.
Параметры
-
void* buff - указатель на буфер, в котором будут сохраняться прочитанные данные. Если передать нулевой указатель, то прочитанные данные будут перенаправлены в другой поток, некую функцию, которую нужно описывать самостоятельно;
-
WORD btr - количество байт, которое нужно прочитать;
-
WORD* br - указатель на переменную, в которой функция pf_open сохранит количество прочитанных байтов.
Возвращаемые значения
-
FR_OK - успешное завершение функции;
-
FR_DISK_ERR - ошибка диска;
-
FR_NOT_OPENED - файл не был открыт;
-
FR_NOT_ENABLED - не смонтирован диск.
FRESULT pf_write(constvoid* buff, WORD btw, WORD* bw) - эта функция записывает данные в предварительно открытый файл. Она доступна только тогда, когда параметр _USE_WRITE равен 1. Из-за того, что библиотека PetitFatFs рассчитана на микроконтроллеры с маленьким объемом памяти, функцию записи имеет ряд ограничений:
-
нельзя создать новый файл;
-
нельзя увеличить размер файла;
-
нельзя обновить временную метку файла;
-
файловый атрибут "только для чтения" не может запретить запись;
-
операцию записи можно запустить/остановить только на границе сектора диска.
SD карта разбита на сектора по 512 байт. Функция pf_write может выполнять запись только с начала какого-либо сектора. При этом, если записывается меньше 512 байт, остаток заполняется нулями. Например, мы порциями записываем 612 байтов полезной информации - первый сектор будет заполнен полностью, а во втором будет 100 байтов полезной информации и 412 нулевых байтов.
Функция pf_lseek(..), позволяет перемещать указатель чтения/записи данных. При использовании функции записи указатель нужно устанавливать на начало сектора. Если установить указатель в середину, то он будет округлен к нижней границе сектора, и запись все равно будет выполняться с его начала.
Таким образом, операция записи выполняется в следующей последовательности:
-
устанавливаем указатель записи на какой-нибудь сектор;
-
вызываем функцию записи;
-
если записаны не все данные, и конец файла не достигнут, вызываем функцию записи;
-
финализируем запись, вызвав функцию записи с нулевым указателем.
Параметры:
-
constvoid* buff - указатель на буфер, содержащий данные для записи. Нулевое значение завершает текущую операцию записи;
-
WORD btw - количество байт, которое нужно записать в файл;
-
WORD* bw - указатель на 16-и разрядную переменную, в которой сохранится количество байт, которое удалось записать. По значению этой переменной можно определять, когда конец файла.
Возвращаемые значения:
-
FR_OK - успешное завершение функции;
-
FR_DISK_ERR - ошибка диска;
-
FR_NOT_OPENED - файл не был открыт;
-
FR_NOT_ENABLED - не смонтирован диск.
FRESULT pf_lseek(DWORD offset) - смещает указатель чтения/записи открытого файла. Эта функция используется чтобы указать с какого байта выполнять чтение, или с какого сектора диска выполнять запись. Можно выполнять абсолютное смещение указателя, передавая функции число, а можно выполнять смещение относительно текущей позиции, передавая значение указателя fs.fptr и величину смещения (смотри пример). Функция доступна, когда параметр _USE_LSEEK = 1.
Параметры:
DWORD offset - количество байт, на которые нужно сместить указатель.
Возвращаемые значения:
-
FR_OK - успешное завершение функции;
-
FR_DISK_ERR - ошибка диска;
-
FR_NOT_OPENED - файл не был открыт.
FRESULT pf_opendir(DIR* dp, constchar * path) - эта функцию открывает существующую директорию и инициализирует переменную типа DIR. В дальнейшем эта переменная может использоваться для получения списка файлов открытой директории. Функцию доступна, когда параметр _USE_DIR равен 1.
Параметры:
-
DIR *dp - указатель на переменную типа DIR. Она должна быть предварительно объявлена;
-
constchar* path - указатель на строку-путь к директории. Строка должна заканчиваться нулевым символом. Путь нужно указывать полностью, разделяя подкаталоги символом слэша. Написание пути к директории подчиняется тем же правилам, что и написание пути к файлу (смотри функцию pf_open).
Возвращаемые значения:
-
FR_OK - успешное завершение функции;
-
FR_NO_PATH - не удалось найти путь;
-
FR_NOT_READY - не удалось инициализировать диск;
-
FR_DISK_ERR - ошибка диска;
-
FR_NOT_ENABLED - не смонтирован диск.
FRESULT pf_readdir(DIR* dp, FILINFO* fno) - эта функцию позволяет прочитать содержимое директории. Для этого ее нужно вызывать несколько раз, пока функция не возвратит нулевую строку в одном из членов переменной fno - fno.fname[]. Функция доступна, когда параметр _USE_DIR равен 1. Читаемая директория должна быть предварительно открыта с помощью функции pf_opendir(..).















