Вывод картинки на TFT дисплей с SD карты на примере SSD1289.

Вывод картинки на 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 была найдена в сети. Теперь подключим все необходимые файлы к проекту.
Вывод картинки на TFT дисплей с SD карты на примере SSD1289.


Код для вывода картинки выглядит следующим образом

//определяем размер буфера
#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)
    {	

    }
}

Вывод картинки на TFT дисплей с SD карты на примере SSD1289.

Вывод картинки на TFT дисплей с SD карты на примере SSD1289.

Ниже изображена схема подключения.
Вывод картинки на TFT дисплей с SD карты на примере SSD1289.

Проект для Atmel_Studio_6.2  в архиве ssd1289_8080__sd_card_example.rar [135,33 Kb] (cкачиваний: 570).
Также надо сказать, что если напряжение питания опускалось ниже 3.3V, то файл считать не получалось, SD карточка оказалась очень чувствительна к напряжению питания, поэтому  TFT модуль был подключён к 5V, так и пользуюсь ним по сей день. На этом всё, мы рассмотрели все компоненты TFT модуля, а в планах попробовать подключить его к stm32f103VET6, что получилось можно посмотреть тут.
 
комментарии
1