Страница 1 из 1

TFT01-3.2WD + STM32F4discovery

Добавлено: Ср янв 01, 2014 19:42:59
TripleKill
Есть дисплейный модуль TFT01-3.2WD, который сделан для ардуино. Контроллер HX-8352. Есть дискавери F4. Пытаюсь их подружить.
На странице производителя посмотрел код. http://www.elecfreaks.com/store/32width ... p-116.html.
Меня интересует общий порядок подачи сигналов и данных на дисплей.
Судя по коду и комментариям к нему, подаётся !Reset, потом начинается инициализация.
Каждая команда или данные защёлкиваются по переходу H->L сигнала WR.
Сигналы с дискавери все есть, но дисплей никак не реагирует, только светится белым. Может, я что-то упустил?
Код в кейле под спойлером.
Спасибо.
Спойлер

Код: Выделить всё

#include "stm32f4xx_conf.h"

/*
		RS     = PC4
		WR     = PC3
		RD     = PC2
		CS     = PC1
		RESET  = PC0
		
		PD0..PD15 - data

*/

void LCD_reset(void);
void LCD_data(unsigned int data);
void LCD_comm(unsigned int comm);
void LCD_init(void);
void LCD_com_data(unsigned int com, unsigned int dat);
void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2);
void Pant(unsigned int data);

long i=0;

int main() {

GPIO_InitTypeDef GPIO_InitStructure;
	
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);	

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | \
	GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | \
	GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | \
	GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);
	
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
GPIO_Init(GPIOC, &GPIO_InitStructure);


GPIOD->BSRRH = 0xFFFF;  //data=0
GPIOC->BSRRL = 0xFFFF;  //signals=1


LCD_reset();
LCD_init();

while (1) {
	
Pant(0xFFFF);
for (i=0; i<1500000; i++) {};
Pant(0x0000);
for (i=0; i<1500000; i++) {};
}	


}

void LCD_reset() {
	
GPIOC->BSRRL = GPIO_Pin_0; //PC0=1
GPIOC->BSRRH = GPIO_Pin_0; //PC0=0
GPIOC->BSRRL = GPIO_Pin_0; //PC0=1
	
};

void LCD_init() {
	GPIOC->BSRRH = GPIO_Pin_1; //CS=0
	LCD_comm(0x0083);
	LCD_data(0x0002);
	
	LCD_comm(0x0085);
	LCD_data(0x0003);
	
  LCD_comm(0x008B);
	LCD_data(0x0001);
	LCD_comm(0x008C);
	LCD_data(0x0093);
	
	LCD_comm(0x0091);
	LCD_data(0x0001);
	
	LCD_comm(0x0083);
	LCD_data(0x0000);
	
	LCD_comm(0x003E);
	LCD_data(0x00B0);
	
	LCD_comm(0x003F);
	LCD_data(0x0003);
	
	LCD_comm(0x0040);
	LCD_data(0x0010);
	
	LCD_comm(0x0041);
	LCD_data(0x0056);
	
	LCD_comm(0x0042);
	LCD_data(0x0013);
	
	LCD_comm(0x0043);
	LCD_data(0x0046);
	
	LCD_comm(0x0044);
	LCD_data(0x0023);
	
	LCD_comm(0x0045);
	LCD_data(0x0076);
	
	LCD_comm(0x0046);
	LCD_data(0x0000);
	
	LCD_comm(0x0047);
	LCD_data(0x005E);
	
	LCD_comm(0x0048);
	LCD_data(0x004F);
	
	LCD_comm(0x0049);
	LCD_data(0x0040);
	///
	LCD_comm(0x0017);
	LCD_data(0x0091);
	
	LCD_comm(0x002B);
	LCD_data(0x00F9);
	for (i=0; i<15000; i++) {};
		
	LCD_comm(0x001B);
	LCD_data(0x0014);
	
	LCD_comm(0x001A);
	LCD_data(0x0011);
	
	LCD_comm(0x001C);
	LCD_data(0x0006);
	
	LCD_comm(0x001F);
	LCD_data(0x0042);
	for (i=0; i<15000; i++) {};
		
	LCD_comm(0x0019);
	LCD_data(0x000A);
	
	LCD_comm(0x0019);
	LCD_data(0x001A);
	for (i=0; i<15000; i++) {};
	
	LCD_comm(0x0019);
	LCD_data(0x0012);
	for (i=0; i<15000; i++) {};
	
	LCD_comm(0x001E);
	LCD_data(0x0027);
	for (i=0; i<150000; i++) {};
	///
	LCD_comm(0x0024);
	LCD_data(0x0060);
	
	LCD_comm(0x003D);
	LCD_data(0x0040);
	
	LCD_comm(0x0034);
	LCD_data(0x0038);
	
	LCD_comm(0x0035);
	LCD_data(0x0038);
	
	LCD_comm(0x0024);
	LCD_data(0x0038);
	
	LCD_comm(0x0024);
	LCD_data(0x003C);
	
	LCD_comm(0x0016);
	LCD_data(0x001C);
	
	LCD_comm(0x0001);
	LCD_data(0x0006);
	
	LCD_comm(0x0055);
	LCD_data(0x0000);
	
	LCD_comm(0x0002);
	LCD_data(0x0000);
	
	LCD_comm(0x0003);
	LCD_data(0x0000);
	
	LCD_comm(0x0004);
	LCD_data(0x0000);
	
	LCD_comm(0x0005);
	LCD_data(0x00EF);
	
	LCD_comm(0x0006);
	LCD_data(0x0000);
	
	LCD_comm(0x0007);
	LCD_data(0x0000);
	
	LCD_comm(0x0008);
	LCD_data(0x0001);
	
	LCD_comm(0x0009);
	LCD_data(0x008F);
	
	LCD_comm(0x0022);
	GPIOC->BSRRL = GPIO_Pin_1; //CS=1

	
	
	
};

void LCD_data(unsigned int data) {
	GPIOC->BSRRL = GPIO_Pin_4;
	GPIOD->ODR = data;
	GPIOC->BSRRH = GPIO_Pin_3;
	GPIOC->BSRRL = GPIO_Pin_3;
	
};

void LCD_comm(unsigned int comm) {
	GPIOC->BSRRH = GPIO_Pin_4;
	GPIOD->ODR = comm;
	GPIOC->BSRRH = GPIO_Pin_3;
	GPIOC->BSRRL = GPIO_Pin_3;
};

void Pant(unsigned int data)
{
  int i,j;
  GPIOC->BSRRH = GPIO_Pin_1;
  Address_set(0,0,239,399);
  for(i=0;i<400;i++)
  {
    for (j=0;j<240;j++)
    {
      LCD_data(data);
    }
 
  }
  GPIOC->BSRRL = GPIO_Pin_1;
}

void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
GPIOC->BSRRH = GPIO_Pin_1; //CS=0
  LCD_com_data(0x0003,x1);
	LCD_com_data(0x0006,y1);
	LCD_com_data(0x0007,y1);	
	LCD_com_data(0x0005,x2);
	LCD_com_data(0x0008,y2);
  LCD_com_data(0x0009,y2);
  LCD_comm(0x0022);
GPIOC->BSRRL = GPIO_Pin_1; //CS=1	
}

void LCD_com_data(unsigned int com, unsigned int dat)
{
     LCD_comm(com);
     LCD_data(dat);
};
P.S. Кстати, с Новым годом всех!

Re: TFT01-3.2WD + STM32F4discovery

Добавлено: Ср янв 01, 2014 23:13:39
srg320
TripleKill писал(а):Каждая команда или данные защёлкиваются по переходу H->L сигнала WR.
А разве не наоборот.

Также сброс должен осуществляться с задержкой, да и после сброса тоже должна быть задержка. И провода должны быть как можно короче.

А вообще, лучше свериться с даташитом на контроллер и по командам, и по последовательности сигналов.

Re: TFT01-3.2WD + STM32F4discovery

Добавлено: Чт янв 02, 2014 08:21:25
TripleKill
srg320 писал(а):А разве не наоборот.
Похоже, что нет. Если RD=0, и я выставляю на шину данных FFFF, подсветка тускнеет - очевидно, шина сопротивляется.

Re: TFT01-3.2WD + STM32F4discovery

Добавлено: Чт янв 02, 2014 11:43:34
srg320
Я имел в виду переход с 0 в 1 на WR, а то получается, между командами сигнал WR у вас остаётся активным, как-то не правильно это. По крайней мере, я везде так делаю, и всё отлично работает.

Re: TFT01-3.2WD + STM32F4discovery

Добавлено: Чт янв 02, 2014 12:54:51
TripleKill
Это я понял. Но у этих сигналов активный уровень низкий.
СпойлерИзображение

Re: TFT01-3.2WD + STM32F4discovery

Добавлено: Чт янв 02, 2014 14:17:36
srg320
Вот, буквально вчера запускал дисплей от Samsung S5830i, подключал, правда, к STM8, но смысл тот же, см. комментарии.
Спойлер

Код: Выделить всё

#define LED_RS_PORT		GPIOC
#define LED_RS_PIN                          GPIO_Pin_4
#define LED_WR_PORT		GPIOC
#define LED_WR_PIN		GPIO_Pin_3
#define LED_RD_PORT		GPIOC
#define LED_RD_PIN		GPIO_Pin_2
#define LED_CS_PORT		GPIOA
#define LED_CS_PIN		GPIO_Pin_7
#define LED_RST_PORT		GPIOC
#define LED_RST_PIN		GPIO_Pin_1

#define GPIO_HIGH(a,b) (a->ODR)|=(b)
#define GPIO_LOW(a,b) (a->ODR)&=(~b)
#define GPIO_TOGGLE(a,b) (a->ODR)^=(b)
#define GPIO_SET(a, b) (a->ODR)=(b)

void delay()
{
    for(unsigned long long i=0; i<20000;i++);
}
void LCDData(uint16_t data)
{
    GPIO_LOW(LED_CS_PORT,LED_CS_PIN);   //CS = 0 (необязательно каждый раз дергать)
    GPIO_HIGH(LED_RS_PORT,LED_RS_PIN);  //RS = 1
    
    GPIO_SET(GPIOD, (data&0xFF));       //выставляем данные
    GPIO_SET(GPIOB, (data>>8));
                                        //до этого WR = 1
    GPIO_LOW(LED_WR_PORT,LED_WR_PIN);   //WR = 0
    GPIO_HIGH(LED_WR_PORT,LED_WR_PIN);  //WR = 1
                                        //т.о. на WR будет комбинация 1-0-1
        
    GPIO_HIGH(LED_CS_PORT,LED_CS_PIN);  //CS = 1 (необязательно)
}

void LCDCommand(uint8_t com)
{
    GPIO_LOW(LED_CS_PORT,LED_CS_PIN);   //CS = 0
    GPIO_LOW(LED_RS_PORT,LED_RS_PIN);  //RS = 0
    
    GPIO_SET(GPIOD, com);               //выставляем данные
    GPIO_SET(GPIOB, 0);
    
    GPIO_LOW(LED_WR_PORT,LED_WR_PIN);   //WR = 0
    GPIO_HIGH(LED_WR_PORT,LED_WR_PIN);  //WR = 1
        
    GPIO_HIGH(LED_CS_PORT,LED_CS_PIN);  //CS = 1
}

int main( void )
{
    GPIO_Init( LED_RD_PORT, LED_RD_PIN, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_HIGH(LED_RD_PORT,LED_RD_PIN);                                  //RD = 1
    GPIO_Init( LED_WR_PORT, LED_WR_PIN, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_HIGH(LED_WR_PORT,LED_WR_PIN);                                  //изначально WR = 1
    GPIO_Init( LED_RS_PORT, LED_RS_PIN, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_HIGH(LED_RS_PORT,LED_RS_PIN);                                  //RS = 1
    GPIO_Init( LED_CS_PORT, LED_CS_PIN, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_HIGH(LED_CS_PORT,LED_CS_PIN);                                  //CS = 1
    GPIO_Init( LED_RST_PORT, LED_RST_PIN, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_HIGH(LED_RST_PORT,LED_RST_PIN);                                //RST = 1
    
    GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_SET(GPIOD, 0x00);
    GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
    GPIO_SET(GPIOB, 0x00);
    
    GPIO_LOW(LED_RST_PORT,LED_RST_PIN);                                 //RST = 0
    delay();                                                            //обязательно задержка >= 100ms
    GPIO_HIGH(LED_RST_PORT,LED_RST_PIN);                                //RST = 1
    delay();                                                            //обязательно задержка >= 100ms
             
    //Init
    LCDCommand(0x11); // (SLPOUT)
    delay();
    LCDCommand(0x29); // (DISPON)
    
    LCDCommand(0x2A); // 
    LCDData(0x00);
    LCDData(0x00);
    LCDData(0x01);
    LCDData(0x3F);
    
    LCDCommand(0x2B); // 
    LCDData(0x00);
    LCDData(0x00);
    LCDData(0x01);
    LCDData(0xDF);
    
    LCDCommand(0x2C);
    unsigned long long i=0;
    for (i=0; i < (unsigned long long)320*480; i++) {
        LCDData(0xFFFF);  
    }
    
    while(1);
}

Re: TFT01-3.2WD + STM32F4discovery

Добавлено: Пн янв 06, 2014 07:13:20
TripleKill
Запустилось!

Причина была в том, что в библиотеке UTFT, откуда я брал инициализацию, недостаёт одной задержки.
В остальном всё без изменений, защёлкивание команд и данных по переходу 1 -> 0 вывода WR.
СпойлерИзображение