Вывод картинки на TFT дисплей с SD карты на примере SSD1289.
В прошлой статье мы преобразовали картинку в массив и записали этот массив на SD карточку, теперь давайте попробуем вывести её на TFT дисплей. Для работы с SD карточкой воспользуемся библиотекой Petit FatFs, эта библиотека предназначена для 8-битных микроконтроллеров с малым размером памяти.
Библиотека состоит из 5 файлов:
integer.h - заголовочный файл в котором описаны основные типы данных.
diskio.h - заголовочный файл в котором объявлены прототипы низкоуровневых функций для работы с диском и статусные коды, которые они возвращают.
diskio.c - в этом файле должны быть реализованы низкоуровневые функции, изначально там "заглушки".
pffсonf.h - конфигурационный файл.
pff.h - заголовочный файл в котором объявлены прототипы функций взаимодействия с файловой системой диска.
pff.c - файл содержит реализации функций для взаимодействия с файловой системой диска.
Давайте рассмотрим функции, которые нам понадобятся для работы с диском.
FRESULT pf_mount (FATFS*) — функция монтирует/демонтирует диск. Эту функцию необходимо вызывать до начала работы диском, если вызвать функцию с нулевым указателем диск демонтируется. Функция может быть вызвана в любой момент времени.
Параметры
FATFS* fs — указатель на объект типа FATFS, описание этой структуры можно посмотреть в файле pff.h. Нам надо всего лишь объявить переменную такого типа.
Возвращаемые значения:
FR_OK (0) — возвращается в случае успешного выполнения функции
FR_NOT_READY — устройство не может быть инициализировано
FR_DISK_ERR — возникла ошибка во время чтения с диска
FR_NO_FILESYSTEM — на диске нет правильного раздела FAT
FRESULT pf_open (const char* path) — функция открывает существующий файл. После того как файл открыт с ним можно работать, то есть читать из него и записывать в него. С открытым файлом можно работать до тех пор, пока не будет открыт другой файл. Функция может быть вызвана в любой момент времени.
Параметры
const char* path — указатель на строку, указывающую путь к файлу. Путь надо указывать полностью относительно корневой директории, разделяя директории слэшем.
Возвращаемые значения:
FR_OK (0) — возвращается в случае успешного выполнения функции
FR_NO_FILE — файл не найден
FR_DISK_ERR — ошибка диска
FR_NOT_ENABLED — диск не был смонтирован
FRESULT pf_read(void* buff, WORD btr, WORD* br) — функция читает указанное количество байт из файла и сохраняет их в буфер. Если количество прочитанных байт меньше чем указано, значит был достигнут конец файла. Для того чтобы функция работала надо в файле pffconf.h надо записать
#define _USE_READ 1
Параметры:
void* buff — указатель на буфер, в котором сохраняются прочитанные данные
WORD btr — количество байт, которые нужно прочитать
WORD* br — указатель на переменную, в которой хранится количество прочитанных байт.
Возвращаемые значения:
FR_OK (0) — возвращается в случае успешного выполнения функции
FR_DISK_ERR — ошибка диска
FR_NOT_OPENED — файл не был открыт
FR_NOT_ENABLED — диск не был смонтирован
Описание функций взято отсюда, перевод не совсем полный, но этих функций достаточно для вывода картинки. Чтобы они заработали надо реализовать низкоуровневые функции в файле diskio.c и сам протокол общения с карточкой — SPI. На сайте есть пример работы с библиотекой, в нём есть файл mmc.c в котором реализованы низкоуровневые функции, его и возьмём, а реализацию SPI была найдена в сети. Теперь подключим все необходимые файлы к проекту.
Код для вывода картинки выглядит следующим образом
Ниже изображена схема подключения.
Проект для Atmel_Studio_6.2 в архиве .
Также надо сказать, что если напряжение питания опускалось ниже 3.3V, то файл считать не получалось, SD карточка оказалась очень чувствительна к напряжению питания, поэтому TFT модуль был подключён к 5V, так и пользуюсь ним по сей день. На этом всё, мы рассмотрели все компоненты TFT модуля, а в планах попробовать подключить его к stm32f103VET6, что получилось можно посмотреть тут.
Библиотека состоит из 5 файлов:
integer.h - заголовочный файл в котором описаны основные типы данных.
diskio.h - заголовочный файл в котором объявлены прототипы низкоуровневых функций для работы с диском и статусные коды, которые они возвращают.
diskio.c - в этом файле должны быть реализованы низкоуровневые функции, изначально там "заглушки".
pffсonf.h - конфигурационный файл.
pff.h - заголовочный файл в котором объявлены прототипы функций взаимодействия с файловой системой диска.
pff.c - файл содержит реализации функций для взаимодействия с файловой системой диска.
Давайте рассмотрим функции, которые нам понадобятся для работы с диском.
FRESULT pf_mount (FATFS*) — функция монтирует/демонтирует диск. Эту функцию необходимо вызывать до начала работы диском, если вызвать функцию с нулевым указателем диск демонтируется. Функция может быть вызвана в любой момент времени.
Параметры
FATFS* fs — указатель на объект типа FATFS, описание этой структуры можно посмотреть в файле pff.h. Нам надо всего лишь объявить переменную такого типа.
Возвращаемые значения:
FR_OK (0) — возвращается в случае успешного выполнения функции
FR_NOT_READY — устройство не может быть инициализировано
FR_DISK_ERR — возникла ошибка во время чтения с диска
FR_NO_FILESYSTEM — на диске нет правильного раздела FAT
FRESULT pf_open (const char* path) — функция открывает существующий файл. После того как файл открыт с ним можно работать, то есть читать из него и записывать в него. С открытым файлом можно работать до тех пор, пока не будет открыт другой файл. Функция может быть вызвана в любой момент времени.
Параметры
const char* path — указатель на строку, указывающую путь к файлу. Путь надо указывать полностью относительно корневой директории, разделяя директории слэшем.
Возвращаемые значения:
FR_OK (0) — возвращается в случае успешного выполнения функции
FR_NO_FILE — файл не найден
FR_DISK_ERR — ошибка диска
FR_NOT_ENABLED — диск не был смонтирован
FRESULT pf_read(void* buff, WORD btr, WORD* br) — функция читает указанное количество байт из файла и сохраняет их в буфер. Если количество прочитанных байт меньше чем указано, значит был достигнут конец файла. Для того чтобы функция работала надо в файле pffconf.h надо записать
#define _USE_READ 1
Параметры:
void* buff — указатель на буфер, в котором сохраняются прочитанные данные
WORD btr — количество байт, которые нужно прочитать
WORD* br — указатель на переменную, в которой хранится количество прочитанных байт.
Возвращаемые значения:
FR_OK (0) — возвращается в случае успешного выполнения функции
FR_DISK_ERR — ошибка диска
FR_NOT_OPENED — файл не был открыт
FR_NOT_ENABLED — диск не был смонтирован
Описание функций взято отсюда, перевод не совсем полный, но этих функций достаточно для вывода картинки. Чтобы они заработали надо реализовать низкоуровневые функции в файле diskio.c и сам протокол общения с карточкой — SPI. На сайте есть пример работы с библиотекой, в нём есть файл mmc.c в котором реализованы низкоуровневые функции, его и возьмём, а реализацию SPI была найдена в сети. Теперь подключим все необходимые файлы к проекту.
Код для вывода картинки выглядит следующим образом
//определяем размер буфера
#define BUF_SIZE 512UL
#define HALF_BUF ((BUF_SIZE)/2)
#define F_CPU 8000000UL
#include "ssd1289_i8080.h"
#include "diskio.h"
#include "pff.h"
const uint8_t string_1 [] PROGMEM = "hub";
const uint8_t string_2 [] PROGMEM = "stub.ru";
//инициализируем буффер и указатель на него
uint16_t buffer[256] = {0};
uint16_t *buf = &buffer[0];
//объявляем переменные для доступа к SD
FATFS fs;
DIR dir;
FILINFO fno;
UINT s1;
FRESULT res;
int main(void)
{
_delay_ms(1000);
DATA_DDR_0 = 0XFF;
DATA_DDR_8 = 0XFF;
COMMAND_DDR = 0XFF;
COMMAND_DDR1 = 0X01;
Init_SSD1289();
Lcd_Clear(blue);
Draw_String(4,2,0X6A9F,0X3185,3,string_1);
Draw_String(4,5,0XFEE6,0X3185,3,string_2);
//монтируем диск
res = pf_mount(&fs);
if (res == FR_OK)
{
//открываем файл
res = pf_open("hub_stub.bin");
if (res == FR_OK)
{
//устанавливаем курсор в левый верхний угол
Set_Cursor(0,0);
for (register uint16_t i = 0; i<300; i++)
{
//считываем данные в буффер
pf_read((uint16_t*)buf, BUF_SIZE, &s1);
for (register uint16_t j = 0; j < 256; j++)
{
//выводим данные на дисплей
Lcd_Write_Data(buffer[j]);
}
}
}
}
while(1)
{
}
}
Ниже изображена схема подключения.
Проект для Atmel_Studio_6.2 в архиве .
Также надо сказать, что если напряжение питания опускалось ниже 3.3V, то файл считать не получалось, SD карточка оказалась очень чувствительна к напряжению питания, поэтому TFT модуль был подключён к 5V, так и пользуюсь ним по сей день. На этом всё, мы рассмотрели все компоненты TFT модуля, а в планах попробовать подключить его к stm32f103VET6, что получилось можно посмотреть тут.
Похожие статьи