LCD ILI9481 16Bit. Модуль с Алиэкспресс

Обсуждаем цифровые устройства...
Ответить
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Приветствую форумчан!
Пришел с полгода назад такой дисплейчик, только надпись на этикетке ILI9481 (свою упаковку не могу сфоткать - под рукой ее нет):
Изображение
Решил попробовать его запустить, пока появилась капля свободного времени, но он не хочет проходить инициализацию.
Делаю ногодрыгом, для лучшего понимания. Работаю от внутреннего кварца. Камень - STM32F303VCT6 (на DiacoveryF3).
Линия D0-D15 соединена с портом E, пины управления с портом D.
Функции посылки команд и данных:
Спойлер

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

oid WrCmd (uint16_t Reg_Value)
{ 

	if (Data_PINs_State == 1) {ili9481_PINs_Data_Out();}

	ili9481_LCD_CS_DISABLE;
	//ili9481_LCD_RD_DISABLE;
	ili9481_LCD_WR_DISABLE;
	ili9481_LCD_CD_DATA;

	ili9481_LCD_CS_ENABLE;
	ili9481_LCD_CD_COMMAND;
  ili9481_SET_DATA = Reg_Value;	
	ili9481_WR_STROBE;
	
	ili9481_LCD_CS_DISABLE;

	
}


void WrDat (uint16_t Data_for_send)
{ 
	if (Data_PINs_State == 1) {ili9481_PINs_Data_Out();}
	
	ili9481_LCD_CS_DISABLE;
	//ili9481_LCD_RD_DISABLE;
	ili9481_LCD_WR_DISABLE;
	ili9481_LCD_CD_COMMAND;

	ili9481_LCD_CS_ENABLE;
	ili9481_LCD_CD_DATA;
  ili9481_SET_DATA = Data_for_send;	
	ili9481_WR_STROBE;
	
	ili9481_LCD_CS_DISABLE;
}



void ili9481_Send_Data (uint16_t Reg_Value, uint8_t Data_For_Send)
{ 

	if (Data_PINs_State == 1) {ili9481_PINs_Data_Out();}

	ili9481_LCD_CS_DISABLE;
	//ili9481_LCD_RD_DISABLE;
	ili9481_LCD_WR_DISABLE;
	ili9481_LCD_CD_DATA;

	ili9481_LCD_CS_ENABLE;
	ili9481_LCD_CD_COMMAND;
  ili9481_SET_DATA = Reg_Value;	
	ili9481_WR_STROBE;
	
	ili9481_LCD_CS_DISABLE;
	ili9481_LCD_CS_ENABLE;
	
	ili9481_LCD_CD_DATA;
	
  ili9481_SET_DATA = Data_For_Send;	
	ili9481_WR_STROBE;

	
	ili9481_LCD_CS_DISABLE;

}


Функции настройки портов:
Спойлер

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


void ili9481_PINs_Data_In(void)
{
		GPIOE->MODER = 0x00000000;
		/*;
    GPIOA->CRL &= ~( GPIO_CRL_MODE0 // D0
											|GPIO_CRL_MODE1 // D1
											|GPIO_CRL_MODE2 // D2
											|GPIO_CRL_MODE3 // D3
											|GPIO_CRL_MODE4 // D4
											|GPIO_CRL_MODE5 // D5
											|GPIO_CRL_MODE6 // D6
											|GPIO_CRL_MODE7 // D7
										 );   

    GPIOA->CRL &= ~( GPIO_CRL_CNF0  
											|GPIO_CRL_CNF1
											|GPIO_CRL_CNF2
											|GPIO_CRL_CNF3
											|GPIO_CRL_CNF4
											|GPIO_CRL_CNF5
											|GPIO_CRL_CNF6
											|GPIO_CRL_CNF7
										 );    
    
    GPIOA->CRL |= ( GPIO_CRL_CNF0_0
										 |GPIO_CRL_CNF1_0
										 |GPIO_CRL_CNF2_0
										 |GPIO_CRL_CNF3_0
										 |GPIO_CRL_CNF4_0
										 |GPIO_CRL_CNF5_0
										 |GPIO_CRL_CNF6_0
										 |GPIO_CRL_CNF7_0
										);  
			*/
		Data_PINs_State = 1;
		GPIOE->ODR &= 0x0000;								
      
}



void ili9481_PINs_Command_Init(void)
{
   
    GPIOD->MODER &= ~( //GPIO_MODER_MODER8  // rd
                     GPIO_MODER_MODER1  // wr
                    |GPIO_MODER_MODER0 // rs
                    |GPIO_MODER_MODER2 // cs
                    |GPIO_MODER_MODER3 // rst
                   );

    GPIOD->MODER |=  ( //GPIO_MODER_MODER8_0  // rd
                     GPIO_MODER_MODER1_0  // wr
                    |GPIO_MODER_MODER0_0 // rs
                    |GPIO_MODER_MODER2_0 // cs
                    |GPIO_MODER_MODER3_0 // rst
                   );

}
Дефайны:
Спойлер

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


#define LCD_NOOP            0x00   /* No Operation*/
#define LCD_SWRESET             0x01   /* Software Reset */
#define LCD_RDDPM               0x0A   /* Read Display Power Mode */
#define LCD_RDDMADCTL           0x0B   /* Read Display MADCTL */
#define LCD_RDDCOLMOD           0x0C   /* Read Display Pixel Format */
#define LCD_RDDIM               0x0D   /* Read Display Image Format */
#define LCD_RDDSM               0x0E   /* Read Display Signal Mode */
#define LCD_RDDSDR              0x0F   /* Read Display Self-Diagnostic Result */
#define LCD_SPLIN               0x10   /* Enter Sleep Mode */
#define LCD_SLEEP_OUT           0x11   /* Sleep out register */
#define LCD_PTLON               0x12   /* Partial Mode ON */
#define LCD_NORMAL_MODE_ON      0x13   /* Normal Display Mode ON */
#define LCD_DINVOFF             0x20   /* Display Inversion OFF */
#define LCD_DINVON              0x21   /* Display Inversion ON */
#define LCD_GAMMA               0x26   /* Gamma register */
#define LCD_DISPLAY_OFF         0x28   /* Display off register */
#define LCD_DISPLAY_ON          0x29   /* Display on register */
#define LCD_COLUMN_ADDR         0x2A   /* Column address register */
#define LCD_PAGE_ADDR           0x2B   /* Page address register */
#define LCD_GRAM                0x2C   /* GRAM register */
#define LCD_RGBSET              0x2D   /* Color SET */
#define LCD_RAMRD               0x2E   /* Memory Read */
#define LCD_PLTAR               0x30   /* Partial Area */
#define LCD_VSCRDEF             0x33   /* Vertical Scrolling Definition */
#define LCD_TEOFF               0x34   /* Tearing Effect Line OFF */
#define LCD_TEON                0x35   /* Tearing Effect Line ON */
#define LCD_MAC                 0x36   /* Memory Access Control register*/
#define LCD_VSCRSADD            0x37   /* Vertical Scrolling Start Address */
#define LCD_IDMOFF              0x38   /* Idle Mode OFF */
#define LCD_IDMON               0x39   /* Idle Mode ON */
#define LCD_PIXEL_FORMAT        0x3A   /* Pixel Format register */
#define LCD_WRITE_MEM_CONTINUE  0x3C   /* Write Memory Continue */
#define LCD_READ_MEM_CONTINUE   0x3E   /* Read Memory Continue */
#define LCD_SET_TEAR_SCANLINE   0x44   /* Set Tear Scanline */
#define LCD_GET_SCANLINE        0x45   /* Get Scanline */
#define LCD_READ_DDB_START      0xA1   /* Read DDB start */

/* Level 2 Commands */
#define LCD_CMDACCPRTC          0xB0   /* Command Access Protect  */
#define LCD_FRMCTR              0xB3   /* Frame Memory Access and Interface setting  */
#define LCD_DMFMCTR             0xB4   /* Display Mode and Frame Memory Write Mode
setting */
#define LCD_DEVCODERD           0xBF   /* Device code read */
#define LCD_PANEL_DRV_CTL       0xC0   /* Panel Driving Setting */
#define LCD_NORMAL_TIMING_WR    0xC1   /* Display Timing Setting for Normal Mode  */
#define LCD_PARTIAL_TIMING_WR   0xC2   /* Display Timing Setting for Partial Mode  */
#define LCD_IDLE_TIMING_WR      0xC3   /* Display Timing Setting for Idle Mode  */
#define LCD_FR_INV_CTL          0xC5   /* Frame rate and Inversion Control  */
#define LCD_INTERFACE           0xC6   /* Interface Control */
#define LCD_GAMMAWR            0xC8   /* Gamma Setting */
#define LCD_POWER               0xD0   /* POWER CONTROL */
#define LCD_VCOM               0xD1   /* VCOM Control */
#define LCD_NORMAL_PWR_WR       0xD2   /* Power Setting for Normal Mode  */
#define LCD_PARTIAL_PWR_WR      0xD3   /* Power Setting for Partial Mode  */
#define LCD_IDLE_PWR_WR         0xD4   /* Power Setting for Idle Mode  */
#define LCD_NVMEMWR             0xE0   /* NV Memory Write  */
#define LCD_NVMEMCTRL           0xE1   /* NV Memory Control */
#define LCD_NVMEMRD             0xE2   /* NV Memory Status */
#define LCD_NVMEMPRT            0xE3   /* NV Memory Protection  */
#define LCD_EEPROMWR_ENABLE      0xE8   /* EEPROM Write Enable  */
#define LCD_EEPROMWR_DISABLE    0xE9   /* EEPROM Write Disable  */
#define LCD_EEPROMWR         0xEA   /* EEPROM Word Write */
#define LCD_EEPROMRD            0xEB   /* EEPROM Word Read   */
#define LCD_EEPROM_ADR_SET       0xEC   /* EEPROM Address Set */
#define LCD_EEPROM_ERASE        0xED   /* EEPROM Erase */
#define LCD_EEPROM_ERASE_ALL    0xEE   /* EEPROM Erase All  */




//#define ili9481_LCD_RD_ENABLE 						(GPIOD->BSRR |= GPIO_BSRR_BR_8)// Read data from LCD
//#define ili9481_LCD_RD_DISABLE 						(GPIOD->BSRR |= GPIO_BSRR_BS_8) //

#define ili9481_LCD_WR_ENABLE 							(GPIOD->BSRR |= GPIO_BSRR_BR_1) //	Write data to LCD
#define ili9481_LCD_WR_DISABLE 							(GPIOD->BSRR |= GPIO_BSRR_BS_1) //

#define ili9481_LCD_CD_COMMAND 							(GPIOD->BSRR |= GPIO_BSRR_BR_0) // Command/Data selection. May be marked as LCD_RS, D/C, A0 or RS.
#define ili9481_LCD_CD_DATA		 							(GPIOD->BSRR |= GPIO_BSRR_BS_0) // Data - Hight. Commands - Low

#define ili9481_LCD_CS_ENABLE 							(GPIOD->BSRR |= GPIO_BSRR_BR_2) // Chip Select. 
#define ili9481_LCD_CS_DISABLE 							(GPIOD->BSRR |= GPIO_BSRR_BS_2) // Active - LOW

#define ili9481_LCD_RESET_ENABLE 						(GPIOD->BSRR |= GPIO_BSRR_BR_3) // Reset.
#define ili9481_LCD_RESET_DISABLE 					(GPIOD->BSRR |= GPIO_BSRR_BS_3) // Active (LCD reset activation) - LOW


#define ili9481_SET_DATA										(GPIOE->ODR &= 0x0000); (GPIOE->BSRR)
#define ili9481_READ_DATA										(GPIOE->IDR & 0x0000) 


#define ili9481_WR_STROBE {ili9481_LCD_WR_ENABLE; ili9481_LCD_WR_DISABLE;}

Сама инициализация. В закоментированных блоках отображены все способы, которыми я пытался запустить. ВНИМАНИЕ! много кода:
Спойлер

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


void ili9481_Init_Test (void)
{
	
	ili9481_PINs_Command_Init();
	ili9481_PINs_Data_Out();
	
		_ili9481_Delay_ms(10);
ili9481_LCD_RESET_ENABLE;
_ili9481_Delay_ms(10);
ili9481_LCD_RESET_DISABLE;
_ili9481_Delay_ms(10);
// Âûáðàëè äèñïëåé
ili9481_LCD_CS_DISABLE;
	
	
/*	
	       //LCD_FSMC_Config();
         _ili9481_Delay_ms(50);
       //GPIO_SetBits(GPIOE, GPIO_Pin_1);
       ili9481_LCD_RESET_DISABLE;
       _ili9481_Delay_ms(20);
       //GPIO_ResetBits(GPIOE, GPIO_Pin_1);
       ili9481_LCD_RESET_ENABLE;
       _ili9481_Delay_ms(20);
       //GPIO_SetBits(GPIOE, GPIO_Pin_1);
       ili9481_LCD_RESET_DISABLE;
       _ili9481_Delay_ms(20);;
*/
	


	
/*
	WrCmd(0x11);
	_ili9481_Delay_ms(20);
	//WrCmd(0xD0);
	ili9481_Send_Data(0xD0, 0x07);
	ili9481_Send_Data(0xD0, 0x42);
	ili9481_Send_Data(0xD0, 0x18);

	//WrCmd(0xD1);
	ili9481_Send_Data(0xD1, 0x00);
	ili9481_Send_Data(0xD1, 0x07);
	ili9481_Send_Data(0xD1, 0x10);

	//WrCmd(0xD2);
	ili9481_Send_Data(0xD2, 0x01);
	ili9481_Send_Data(0xD2, 0x02);

	//WrCmd(0xC0);
	ili9481_Send_Data(0xC0, 0x10);
	ili9481_Send_Data(0xC0, 0x3B);
	ili9481_Send_Data(0xC0, 0x00);
	ili9481_Send_Data(0xC0, 0x02);
	ili9481_Send_Data(0xC0, 0x11);

	//WrCmd(0xC5);
	ili9481_Send_Data(0xC5, 0x03);

	//WrCmd(0xC8);
	ili9481_Send_Data(0xC8, 0x00);
	ili9481_Send_Data(0xC8, 0x32);
	ili9481_Send_Data(0xC8, 0x36);
	ili9481_Send_Data(0xC8, 0x45);
	ili9481_Send_Data(0xC8, 0x06);
	ili9481_Send_Data(0xC8, 0x16);
	ili9481_Send_Data(0xC8, 0x37);
	ili9481_Send_Data(0xC8, 0x75);
	ili9481_Send_Data(0xC8, 0x77);
	ili9481_Send_Data(0xC8, 0x54);
	ili9481_Send_Data(0xC8, 0x0C);
	ili9481_Send_Data(0xC8, 0x00);

	//WrCmd(0x36);
	ili9481_Send_Data(0x36, 0x0A);


	//WrCmd(0x3A);
	ili9481_Send_Data(0x3A, 0x55);

	WrCmd(0x2A);
	ili9481_Send_Data(0x2A, 0x00);
	ili9481_Send_Data(0x2A, 0x00);
	ili9481_Send_Data(0x2A, 0x01);
	ili9481_Send_Data(0x2A, 0x3F);

	//WrCmd(0x2B);
	ili9481_Send_Data(0x2B, 0x00);
	ili9481_Send_Data(0x2B, 0x00);
	ili9481_Send_Data(0x2B, 0x01);
	ili9481_Send_Data(0x2B, 0xE0);
	_ili9481_Delay_ms(120);
	WrCmd(0x29);
	*/
	
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	
	/*
	
	  WrCmd(0x11);
    _ili9481_Delay_ms(20);
    WrCmd(0xD0);
    ili9481_Send_Data(0xD0, 0x07);
    ili9481_Send_Data(0xD0, 0x42);
    ili9481_Send_Data(0xD0, 0x18);

    //WrCmd(0xD1, );
    ili9481_Send_Data(0xD1, 0x00);
    ili9481_Send_Data(0xD1, 0x07);
    ili9481_Send_Data(0xD1, 0x10);

    //WrCmd(0xD2, );
    ili9481_Send_Data(0xD2, 0x01);
    ili9481_Send_Data(0xD2, 0x02);

    //WrCmd(0xC0, );
    ili9481_Send_Data(0xC0, 0x10);
    ili9481_Send_Data(0xC0, 0x3B);
    ili9481_Send_Data(0xC0, 0x00);
    ili9481_Send_Data(0xC0, 0x02);
    ili9481_Send_Data(0xC0, 0x11);

    //WrCmd(0xC5, );
    ili9481_Send_Data(0xC5, 0x08);

    //WrCmd(0xC8, );
    ili9481_Send_Data(0xC8, 0x00);
    ili9481_Send_Data(0xC8, 0x32);
    ili9481_Send_Data(0xC8, 0x36);
    ili9481_Send_Data(0xC8, 0x45);
    ili9481_Send_Data(0xC8, 0x06);
    ili9481_Send_Data(0xC8, 0x16);
    ili9481_Send_Data(0xC8, 0x37);
    ili9481_Send_Data(0xC8, 0x75);
    ili9481_Send_Data(0xC8, 0x77);
    ili9481_Send_Data(0xC8, 0x54);
    ili9481_Send_Data(0xC8, 0x0C);
    ili9481_Send_Data(0xC8, 0x00);

    //WrCmd(0x36, );
    ili9481_Send_Data(0x36, 0x0a);

   // WrCmd(0x3A, );
    ili9481_Send_Data(0x3A, 0x55);

    //WrCmd(0x2A, );
    ili9481_Send_Data(0x2A, 0x00);
    ili9481_Send_Data(0x2A, 0x00);
    ili9481_Send_Data(0x2A, 0x01);
    ili9481_Send_Data(0x2A, 0x3F);

    ///WrCmd(0x2B, );
    ili9481_Send_Data(0x2B, 0x00);
    ili9481_Send_Data(0x2B, 0x00);
    ili9481_Send_Data(0x2B, 0x01);
    ili9481_Send_Data(0x2B, 0xDF);

    _ili9481_Delay_ms(120);
    WrCmd(0x29);

    _ili9481_Delay_ms(25);
	*/
	
	
		////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	
	
	
	/*
	//WrCmd(0xB9,); // Enable extension command
    ili9481_Send_Data(0xB9,0xFF);
    ili9481_Send_Data(0xB9,0x83);
    ili9481_Send_Data(0xB9,0x57);
    _ili9481_Delay_ms(50);
    
    //WrCmd(0xB6,); //Set VCOM voltage
    ili9481_Send_Data(0xB6,0x2C);    //0x52 for HSD 3.0"
    
    WrCmd(0x11); // Sleep off
    _ili9481_Delay_ms(200);
    
    //WrCmd(0x35,); // Tearing effect on
    ili9481_Send_Data(0x35,0x00);    // Added parameter

    //WrCmd(0x3A,); // Interface pixel format
    ili9481_Send_Data(0x3A,0x55);    // 16 bits per pixel

    //WrCmd(0xCC,); // Set panel characteristic
    //ili9481_Send_Data(0x09);    // S960>S1, G1>G480, R-G-B, normally black

    //WrCmd(0xB3); // RGB interface
    //ili9481_Send_Data(0x43);
    //ili9481_Send_Data(0x00);
    //ili9481_Send_Data(0x06);
    //ili9481_Send_Data(0x06);

    //WrCmd(0xB1,); // Power control
    ili9481_Send_Data(0xB1,0x00);
    ili9481_Send_Data(0xB1,0x15);
    ili9481_Send_Data(0xB1,0x0D);
    ili9481_Send_Data(0xB1,0x0D);
    ili9481_Send_Data(0xB1,0x83);
    ili9481_Send_Data(0xB1,0x48);
    
    
    //WrCmd(0xC0,); // Does this do anything?
    ili9481_Send_Data(0xC0,0x24);
    ili9481_Send_Data(0xC0,0x24);
    ili9481_Send_Data(0xC0,0x01);
    ili9481_Send_Data(0xC0,0x3C);
    ili9481_Send_Data(0xC0,0xC8);
    ili9481_Send_Data(0xC0,0x08);
    
    //WrCmd(0xB4,); // Display cycle
    ili9481_Send_Data(0xB4,0x02);
    ili9481_Send_Data(0xB4,0x40);
    ili9481_Send_Data(0xB4,0x00);
    ili9481_Send_Data(0xB4,0x2A);
    ili9481_Send_Data(0xB4,0x2A);
    ili9481_Send_Data(0xB4,0x0D);
    ili9481_Send_Data(0xB4,0x4F);
    
    //WrCmd(0xE0,); // Gamma curve
    ili9481_Send_Data(0xE0,0x00);
    ili9481_Send_Data(0xE0,0x15);
    ili9481_Send_Data(0xE0,0x1D);
    ili9481_Send_Data(0xE0,0x2A);
    ili9481_Send_Data(0xE0,0x31);
    ili9481_Send_Data(0xE0,0x42);
    ili9481_Send_Data(0xE0,0x4C);
    ili9481_Send_Data(0xE0,0x53);
    ili9481_Send_Data(0xE0,0x45);
    ili9481_Send_Data(0xE0,0x40);
    ili9481_Send_Data(0xE0,0x3B);
    ili9481_Send_Data(0xE0,0x32);
    ili9481_Send_Data(0xE0,0x2E);
    ili9481_Send_Data(0xE0,0x28);
    
    ili9481_Send_Data(0xE0,0x24);
    ili9481_Send_Data(0xE0,0x03);
    ili9481_Send_Data(0xE0,0x00);
    ili9481_Send_Data(0xE0,0x15);
    ili9481_Send_Data(0xE0,0x1D);
    ili9481_Send_Data(0xE0,0x2A);
    ili9481_Send_Data(0xE0,0x31);
    ili9481_Send_Data(0xE0,0x42);
    ili9481_Send_Data(0xE0,0x4C);
    ili9481_Send_Data(0xE0,0x53);
    ili9481_Send_Data(0xE0,0x45);
    ili9481_Send_Data(0xE0,0x40);
    ili9481_Send_Data(0xE0,0x3B);
    ili9481_Send_Data(0xE0,0x32);
    
    ili9481_Send_Data(0xE0,0x2E);
    ili9481_Send_Data(0xE0,0x28);
    ili9481_Send_Data(0xE0,0x24);
    ili9481_Send_Data(0xE0,0x03);
    ili9481_Send_Data(0xE0,0x00);
    ili9481_Send_Data(0xE0,0x01);

   // WrCmd(0x36,); // MADCTL Memory access control
    ili9481_Send_Data(0x36,0x48);
    _ili9481_Delay_ms(20);

    WrCmd(0x21); //Display inversion on
    _ili9481_Delay_ms(20);

    WrCmd(0x29); // Display on
    
    _ili9481_Delay_ms(120);
	*/
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	
	
	
	/*
	WrCmd(0xB9); // Enable extension command
    WrDat(0xFF);
    WrDat(0x83);
    WrDat(0x57);
    _ili9481_Delay_ms(50);
    
    WrCmd(0xB6); //Set VCOM voltage
    WrDat(0x2C);    //0x52 for HSD 3.0"
    
    WrCmd(0x11); // Sleep off
    _ili9481_Delay_ms(200);
    
    WrCmd(0x35); // Tearing effect on
    WrDat(0x00);    // Added parameter

    WrCmd(0x3A); // Interface pixel format
    WrDat(0x55);    // 16 bits per pixel

    //WrCmd(0xCC); // Set panel characteristic
    //WrDat(0x09);    // S960>S1, G1>G480, R-G-B, normally black

    //WrCmd(0xB3); // RGB interface
    //WrDat(0x43);
    //WrDat(0x00);
    //WrDat(0x06);
    //WrDat(0x06);

    WrCmd(0xB1); // Power control
    WrDat(0x00);
    WrDat(0x15);
    WrDat(0x0D);
    WrDat(0x0D);
    WrDat(0x83);
    WrDat(0x48);
    
    
    WrCmd(0xC0); // Does this do anything?
    WrDat(0x24);
    WrDat(0x24);
    WrDat(0x01);
    WrDat(0x3C);
    WrDat(0xC8);
    WrDat(0x08);
    
    WrCmd(0xB4); // Display cycle
    WrDat(0x02);
    WrDat(0x40);
    WrDat(0x00);
    WrDat(0x2A);
    WrDat(0x2A);
    WrDat(0x0D);
    WrDat(0x4F);
    
    WrCmd(0xE0); // Gamma curve
    WrDat(0x00);
    WrDat(0x15);
    WrDat(0x1D);
    WrDat(0x2A);
    WrDat(0x31);
    WrDat(0x42);
    WrDat(0x4C);
    WrDat(0x53);
    WrDat(0x45);
    WrDat(0x40);
    WrDat(0x3B);
    WrDat(0x32);
    WrDat(0x2E);
    WrDat(0x28);
    
    WrDat(0x24);
    WrDat(0x03);
    WrDat(0x00);
    WrDat(0x15);
    WrDat(0x1D);
    WrDat(0x2A);
    WrDat(0x31);
    WrDat(0x42);
    WrDat(0x4C);
    WrDat(0x53);
    WrDat(0x45);
    WrDat(0x40);
    WrDat(0x3B);
    WrDat(0x32);
    
    WrDat(0x2E);
    WrDat(0x28);
    WrDat(0x24);
    WrDat(0x03);
    WrDat(0x00);
    WrDat(0x01);

    WrCmd(0x36); // MADCTL Memory access control
    WrDat(0x48);
    _ili9481_Delay_ms(20);

    WrCmd(0x21); //Display inversion on
    _ili9481_Delay_ms(20);

    WrCmd(0x29); // Display on
    
    _ili9481_Delay_ms(120);
	*/
	
	
	
	///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
/*	
	
	// Configure HX8357-B display
    WrCmd(0x11);
    _ili9481_Delay_ms(20);
    WrCmd(0xD0);
    WrDat(0x07);
    WrDat(0x42);
    WrDat(0x18);

    WrCmd(0xD1);
    WrDat(0x00);
    WrDat(0x07);
    WrDat(0x10);

    WrCmd(0xD2);
    WrDat(0x01);
    WrDat(0x02);

    WrCmd(0xC0);
    WrDat(0x10);
    WrDat(0x3B);
    WrDat(0x00);
    WrDat(0x02);
    WrDat(0x11);

    WrCmd(0xC5);
    WrDat(0x08);

    WrCmd(0xC8);
    WrDat(0x00);
    WrDat(0x32);
    WrDat(0x36);
    WrDat(0x45);
    WrDat(0x06);
    WrDat(0x16);
    WrDat(0x37);
    WrDat(0x75);
    WrDat(0x77);
    WrDat(0x54);
    WrDat(0x0C);
    WrDat(0x00);

    WrCmd(0x36);
    WrDat(0x0a);

    WrCmd(0x3A);
    WrDat(0x55);

    WrCmd(0x2A);
    WrDat(0x00);
    WrDat(0x00);
    WrDat(0x01);
    WrDat(0x3F);

    WrCmd(0x2B);
    WrDat(0x00);
    WrDat(0x00);
    WrDat(0x01);
    WrDat(0xDF);

    _ili9481_Delay_ms(120);
    WrCmd(0x29);

    _ili9481_Delay_ms(25);
// End of HX8357-B display configuration
	*/
	
	
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	
/*	
	// ili9486
	
	    WrCmd(0x01);
    WrDat(0x00);
    _ili9481_Delay_ms(50);

    WrCmd(0x28);
    WrDat(0x00);

    WrCmd(0xC0);        // Power Control 1
    WrDat(0x0d);
    WrDat(0x0d);

    WrCmd(0xC1);        // Power Control 2
    WrDat(0x43);
    WrDat(0x00);

    WrCmd(0xC2);        // Power Control 3
    WrDat(0x00);

    WrCmd(0xC5);        // VCOM Control
    WrDat(0x00);
    WrDat(0x48);

    WrCmd(0xB6);        // Display Function Control
    WrDat(0x00);
    WrDat(0x22);           // 0x42 = Rotate display 180 deg.
    WrDat(0x3B);

    WrCmd(0xE0);        // PGAMCTRL (Positive Gamma Control)
    WrDat(0x0f);
    WrDat(0x24);
    WrDat(0x1c);
    WrDat(0x0a);
    WrDat(0x0f);
    WrDat(0x08);
    WrDat(0x43);
    WrDat(0x88);
    WrDat(0x32);
    WrDat(0x0f);
    WrDat(0x10);
    WrDat(0x06);
    WrDat(0x0f);
    WrDat(0x07);
    WrDat(0x00);

    WrCmd(0xE1);        // NGAMCTRL (Negative Gamma Control)
    WrDat(0x0F);
    WrDat(0x38);
    WrDat(0x30);
    WrDat(0x09);
    WrDat(0x0f);
    WrDat(0x0f);
    WrDat(0x4e);
    WrDat(0x77);
    WrDat(0x3c);
    WrDat(0x07);
    WrDat(0x10);
    WrDat(0x05);
    WrDat(0x23);
    WrDat(0x1b);
    WrDat(0x00); 

    WrCmd(0x20);        // Display Inversion OFF, 0x21 = ON

    WrCmd(0x36);        // Memory Access Control
    WrDat(0x0A);

    WrCmd(0x3A);        // Interface Pixel Format
    WrDat(0x55); 

    WrCmd(0x11);

    _ili9481_Delay_ms(150);

    WrCmd(0x29);
    _ili9481_Delay_ms(25);
	*/
	
	
}

Кроме белого света дисплея и быстрого строба подсветки в момент дергания ногой РЕСЕТА никаких признаков жизни.

В данный момент есть два сомнения:
1. Неверно отрабатывается алгоритм передачи команд и данных (в том числе последовательность передачи).
2. На порту E, на котором сидит линия данных D0-D15 посажены светодиоды моей DiscoveryF3. Могут ли они так влиять на работу?

P.S. Пол дня уже бьюсь с проблемой, но пока все безуспешно. Буду благодарен за любую помощь...
Реклама
Сверлит текстолит когтями
Сообщения: 1196
Зарегистрирован: Пт авг 21, 2009 03:22:12

Сообщение bolek »

А ардуины мега нет под рукой чтобы проверить? У меня модуль точно такой как на снимке нормально с мегой работает.
И причина не в напряжении питания ли? Ардуина от 5 В, а STM от 3,3 В
Реклама
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Ардуинки под рукой нет. Так-то я дисплей от 5В запитал. Сама логика должна и от 3В наверное работать.
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

ктож знает по идее лучше запитать дисплей тоже от 3в3... 3в6 вдруг поможет помнится похожие проблемы были с диспами от соток когда питание стыковали через 2-3 диода пока не уравняешь не работают
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Реклама
Эиком - электронные компоненты и радиодетали
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Так-то по параметрам должно работать нормально:
Изображение
А что с алгоритмом последовательности передачи данных и команд?
У меня был другой дисплей на контроллере ILI 320х240. Там Инициализация проходила посылкой данных по конкретному адресу каждый раз, типо как тут:

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

...........
   ili9481_Send_Data(0xD0, 0x07);
   ili9481_Send_Data(0xD0, 0x42);
   ili9481_Send_Data(0xD0, 0x18);
...........
А по этому контроллеру все примеры идут с последовательной передачей команд и данных, по типу:

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

.........
    WrCmd(0xB1); // Power control
    WrDat(0x00);
    WrDat(0x15);
    WrDat(0x0D);
.........
Вот меня и напрягает, правильно ли я дергаю пинами управления LCD... :dont_know:
Реклама
Сверлит текстолит когтями
Сообщения: 1196
Зарегистрирован: Пт авг 21, 2009 03:22:12

Сообщение bolek »

isx писал(а):... Так-то я дисплей от 5В запитал. Сама логика должна и от 3В наверное работать...
На фотке: линейный стабилизатор 5В -> 3,3 В и куча преобразователей уровня (ПУ) для согласования сигналов.
Получается полная муйня: питание высокой стороны ПУ - 5 В, следовательно, сигналы от МК должны быть 5 вольтовыми.
Запитаешь LCD от 3,3 В - ХЗ какой там стоит стабилизатор и что он будет выдавать на выход вместо положенных 3,3 В.

Варианты:
1. Поэкспериментировать с питанием LCD - посмотреть на тип стабилизатора, и если повезло и стоит low drop снизить питание LCD до минимального значения в надежде, что ПУ будут нормально работать.
2. Перейти на питание LCD от 3,3 В - подать питание в обход стабилизатора, при этом уровни напряжений высокой и низкой стороны ПУ будут одинаковы. Если ПУ будет нормально работать - проблема решена. Если нет - подавать сигналы от МК напрямую на индикатор, минуя ПУ: самый муторный вариант - куча мелкого монтажа.

По любому нужно начинать с того, что осциллографом посмотреть на сигналы на выходе ПУ, правильно ли они передают сигнал от МК.
Реклама
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Попробовал запитать от 3В (3.3 под рукой сейчас нет) - результат тотже. Похоже надо ардуиноМегу заказать, чтоб разобраться с этим чудом китайской мысли.
Есть подозрения, что пины нормально работают и с 5В и с 3В, так как при исзменении сигнала на выводе RST с единицы на ноль, в обоих случаях дисплей еле заметно моргает. Скорее всего происходит сброс.
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Разобрался с дисплеем. С 3В линиями данных и управления работает отлично. Код инициализации:
Инициализация:
Спойлер

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

void ili9481_Init (void)
{
	 ili9481_PINs_Command_Init();
	 ili9481_PINs_Data_Out();
	 ili9481_HW_Reset();


	 ili9481_Send_Command(0x01);   
	 ili9481_Send_Command(0x11); 
	 _ili9481_Delay_ms(50);

	 ili9481_Send_Command(LCD_NORMAL_MODE_ON);   //0x13

	 ili9481_Send_Command(0xD0);    //(0xD0);
	 ili9481_Send_Data(0x07);
	 ili9481_Send_Data(0x43);    //0x43  0x42
	 ili9481_Send_Data(0x15);    //0x15  0x18

	 ili9481_Send_Command(LCD_VCOM);    //(0xD1);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data(0x07);//07
	 ili9481_Send_Data(0x10);

	 ili9481_Send_Command(LCD_NORMAL_PWR_WR);    //(0xD2);
	 ili9481_Send_Data(0x01);
	 ili9481_Send_Data(0x02);

	 ili9481_Send_Command(LCD_PANEL_DRV_CTL);    //(0xC0);
	 ili9481_Send_Data(0x10); //0x10
	 ili9481_Send_Data(0x3B);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data(0x02);
	 ili9481_Send_Data(0x11);

	 ili9481_Send_Command(LCD_FR_INV_CTL);    //(0xC5);
	 ili9481_Send_Data(0x01);

	 ili9481_Send_Command(LCD_GAMMAWR);    //(0xC8);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data(0x32);
	 ili9481_Send_Data(0x36);
	 ili9481_Send_Data(0x45);
	 ili9481_Send_Data(0x06);
	 ili9481_Send_Data(0x16);
	 ili9481_Send_Data(0x37);
	 ili9481_Send_Data(0x75);
	 ili9481_Send_Data(0x77);
	 ili9481_Send_Data(0x54);
	 ili9481_Send_Data(0x0C);
	 ili9481_Send_Data(0x00);

	 ili9481_Send_Command(0x36);    //(0x2B);   
	 ili9481_Send_Data(0x2B);   

	 ili9481_Send_Command(LCD_PIXEL_FORMAT);    //(0x3A);
	 ili9481_Send_Data(0x55);

	 ili9481_Send_Command(LCD_COLUMN_ADDR);    //(0x2A);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data((uint8_t)(ili9481_WIDTH >> 8));
	 ili9481_Send_Data((uint8_t)(ili9481_WIDTH - 1));

	 ili9481_Send_Command(LCD_PAGE_ADDR);    //(0x2B);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data(0x00);
	 ili9481_Send_Data((uint8_t)(ili9481_HEIGHT >> 8));
	 ili9481_Send_Data((uint8_t)(ili9481_HEIGHT - 1));
	 _ili9481_Delay_ms(120);
	 ili9481_Send_Command(LCD_DISPLAY_ON);    //(0x29);
}

Дефайны:
Спойлер

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

#define LCD_NOOP            0x00   /* No Operation*/
#define LCD_SWRESET             0x01   /* Software Reset */
#define LCD_RDDPM               0x0A   /* Read Display Power Mode */
#define LCD_RDDMADCTL           0x0B   /* Read Display MADCTL */
#define LCD_RDDCOLMOD           0x0C   /* Read Display Pixel Format */
#define LCD_RDDIM               0x0D   /* Read Display Image Format */
#define LCD_RDDSM               0x0E   /* Read Display Signal Mode */
#define LCD_RDDSDR              0x0F   /* Read Display Self-Diagnostic Result */
#define LCD_SPLIN               0x10   /* Enter Sleep Mode */
#define LCD_SLEEP_OUT           0x11   /* Sleep out register */
#define LCD_PTLON               0x12   /* Partial Mode ON */
#define LCD_NORMAL_MODE_ON      0x13   /* Normal Display Mode ON */
#define LCD_DINVOFF             0x20   /* Display Inversion OFF */
#define LCD_DINVON              0x21   /* Display Inversion ON */
#define LCD_GAMMA               0x26   /* Gamma register */
#define LCD_DISPLAY_OFF         0x28   /* Display off register */
#define LCD_DISPLAY_ON          0x29   /* Display on register */
#define LCD_COLUMN_ADDR         0x2A   /* Column address register */
#define LCD_PAGE_ADDR           0x2B   /* Page address register */
#define LCD_GRAM                0x2C   /* GRAM register */
#define LCD_RGBSET              0x2D   /* Color SET */
#define LCD_RAMRD               0x2E   /* Memory Read */
#define LCD_PLTAR               0x30   /* Partial Area */
#define LCD_VSCRDEF             0x33   /* Vertical Scrolling Definition */
#define LCD_TEOFF               0x34   /* Tearing Effect Line OFF */
#define LCD_TEON                0x35   /* Tearing Effect Line ON */
#define LCD_MAC                 0x36   /* Memory Access Control register*/
#define LCD_VSCRSADD            0x37   /* Vertical Scrolling Start Address */
#define LCD_IDMOFF              0x38   /* Idle Mode OFF */
#define LCD_IDMON               0x39   /* Idle Mode ON */
#define LCD_PIXEL_FORMAT        0x3A   /* Pixel Format register */
#define LCD_WRITE_MEM_CONTINUE  0x3C   /* Write Memory Continue */
#define LCD_READ_MEM_CONTINUE   0x3E   /* Read Memory Continue */
#define LCD_SET_TEAR_SCANLINE   0x44   /* Set Tear Scanline */
#define LCD_GET_SCANLINE        0x45   /* Get Scanline */
#define LCD_READ_DDB_START      0xA1   /* Read DDB start */

/* Level 2 Commands */
#define LCD_CMDACCPRTC          0xB0   /* Command Access Protect  */
#define LCD_FRMCTR              0xB3   /* Frame Memory Access and Interface setting  */
#define LCD_DMFMCTR             0xB4   /* Display Mode and Frame Memory Write Mode
setting */
#define LCD_DEVCODERD           0xBF   /* Device code read */
#define LCD_PANEL_DRV_CTL       0xC0   /* Panel Driving Setting */
#define LCD_NORMAL_TIMING_WR    0xC1   /* Display Timing Setting for Normal Mode  */
#define LCD_PARTIAL_TIMING_WR   0xC2   /* Display Timing Setting for Partial Mode  */
#define LCD_IDLE_TIMING_WR      0xC3   /* Display Timing Setting for Idle Mode  */
#define LCD_FR_INV_CTL          0xC5   /* Frame rate and Inversion Control  */
#define LCD_INTERFACE           0xC6   /* Interface Control */
#define LCD_GAMMAWR            0xC8   /* Gamma Setting */
#define LCD_POWER               0xD0   /* POWER CONTROL */
#define LCD_VCOM               0xD1   /* VCOM Control */
#define LCD_NORMAL_PWR_WR       0xD2   /* Power Setting for Normal Mode  */
#define LCD_PARTIAL_PWR_WR      0xD3   /* Power Setting for Partial Mode  */
#define LCD_IDLE_PWR_WR         0xD4   /* Power Setting for Idle Mode  */
#define LCD_NVMEMWR             0xE0   /* NV Memory Write  */
#define LCD_NVMEMCTRL           0xE1   /* NV Memory Control */
#define LCD_NVMEMRD             0xE2   /* NV Memory Status */
#define LCD_NVMEMPRT            0xE3   /* NV Memory Protection  */
#define LCD_EEPROMWR_ENABLE      0xE8   /* EEPROM Write Enable  */
#define LCD_EEPROMWR_DISABLE    0xE9   /* EEPROM Write Disable  */
#define LCD_EEPROMWR         0xEA   /* EEPROM Word Write */
#define LCD_EEPROMRD            0xEB   /* EEPROM Word Read   */
#define LCD_EEPROM_ADR_SET       0xEC   /* EEPROM Address Set */
#define LCD_EEPROM_ERASE        0xED   /* EEPROM Erase */
#define LCD_EEPROM_ERASE_ALL    0xEE   /* EEPROM Erase All  */

#define ili9481_DATA_PORT										GPIOC
#define ili9481_CONTROL_PORT								GPIOD

#define ili9481_LCD_WR_ENABLE 							(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BR_1) //	Write data to LCD
#define ili9481_LCD_WR_DISABLE 							(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BS_1) //

#define ili9481_LCD_CD_COMMAND 							(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BR_0) // Command/Data selection. May be marked as LCD_RS, D/C, A0 or RS.
#define ili9481_LCD_CD_DATA		 							(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BS_0) // Data - Hight. Commands - Low

#define ili9481_LCD_CS_ENABLE 							(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BR_2) // Chip Select. 
#define ili9481_LCD_CS_DISABLE 							(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BS_2) // Active - LOW

#define ili9481_LCD_RESET_ENABLE 						(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BR_3) // Reset.
#define ili9481_LCD_RESET_DISABLE 					(ili9481_CONTROL_PORT->BSRR |= GPIO_BSRR_BS_3) // Active (LCD reset activation) - LOW

#define ili9481_SET_DATA										(ili9481_DATA_PORT->ODR)
#define ili9481_READ_DATA										(ili9481_DATA_PORT->IDR & 0x0000) 

#define ili9481_WR_STROBE {ili9481_LCD_WR_ENABLE; ili9481_LCD_WR_DISABLE;}
Прием/отправка
Спойлер

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

void ili9481_Send_Command (uint16_t Reg_Value)
{ 

	//if (Data_PINs_State == 1) {ili9481_PINs_Data_Out();}

	ili9481_LCD_CS_DISABLE;
	//ili9481_LCD_RD_DISABLE;
	ili9481_LCD_WR_DISABLE;
	ili9481_LCD_CD_DATA;

	ili9481_LCD_CS_ENABLE;
	ili9481_LCD_CD_COMMAND;
  ili9481_SET_DATA = Reg_Value;	
	ili9481_WR_STROBE;
	
	ili9481_LCD_CS_DISABLE;
}



void ili9481_Send_Data (uint16_t Data_for_send)
{ 
	//if (Data_PINs_State == 1) {ili9481_PINs_Data_Out();}
	
	ili9481_LCD_CS_DISABLE;
	//ili9481_LCD_RD_DISABLE;
	ili9481_LCD_WR_DISABLE;
	ili9481_LCD_CD_COMMAND;

	ili9481_LCD_CS_ENABLE;
	ili9481_LCD_CD_DATA;
  ili9481_SET_DATA = Data_for_send;	
	ili9481_WR_STROBE;
	
	ili9481_LCD_CS_DISABLE;
}
Код 100% рабочий. Часть откуда-то успешно с3,14зжена, остальное писал сам, так что, если есть вопросы - спрашиваем не стесняемся :) .

Дальше хочу подключить к FSMC, но информация для CMSIS скудная. Если у кого есть примеры с его использованием - поделитесь пожалуйста.
Ответить

Вернуться в «Цифровая техника»