|
最近在写ILI9486驱动,液晶是8位并口,通过STM32F4xx的FMC连接。我测试了液晶屏ID读取是正确;然后设置区域,填充数据后再读取出来,数值也是一样的。
但是屏幕上什么都没有显示,请大家帮我分析一下.#define ILI9486_BASE ((uint32_t)(0x60000000 | 0x00000000))
#define ILI9486_REG *(__IO uint8_t *)(ILI9486_BASE)
#define ILI9486_RAM *(__IO uint8_t *)(ILI9486_BASE + (1 << (0)))
unsigned char buf[300] = {0};
void lcd_fmc_init(void)
{
FMC_NORSRAM_TimingTypeDef Timing;
FMC_NORSRAM_TimingTypeDef ExtTiming;
__HAL_RCC_FMC_CLK_ENABLE();
/** Perform the SRAM1 memory initialization sequence
*/
hsram1.Instance = FMC_NORSRAM_DEVICE;
hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_8;
hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hsram1.Init.WrapMode = FMC_WRAP_MODE_DISABLE;
hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_ENABLE;
hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
//hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 1;
Timing.DataSetupTime = 120;
Timing.BusTurnAroundDuration = 0;
Timing.CLKDivision = 0;
Timing.DataLatency = 0;
Timing.AccessMode = FMC_ACCESS_MODE_A;
/* ExtTiming */
ExtTiming.AddressSetupTime = 9;
ExtTiming.AddressHoldTime = 1;
ExtTiming.DataSetupTime = 16;
ExtTiming.BusTurnAroundDuration = 0;
ExtTiming.CLKDivision = 0;
ExtTiming.DataLatency = 0;
ExtTiming.AccessMode = FMC_ACCESS_MODE_A;
if (HAL_SRAM_Init(&hsram1, &Timing, &ExtTiming) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
static void ILI9486_WriteCmd(uint8_t _ucCmd)
{
ILI9486_REG = _ucCmd; /* ·¢ËíCMD */
}
static void ILI9486_WriteData(uint8_t _ucParam)
{
ILI9486_RAM = _ucParam;
}
void lcd_reg_init(void)
{
LCD_nRESET;
HAL_Delay(1);
LCD_RESET;
HAL_Delay(10);
LCD_nRESET;
HAL_Delay (120);
ILI9486_WriteCmd(0x01);
HAL_Delay(100);
ILI9486_WriteCmd(0XF1);
ILI9486_WriteData(0x36);
ILI9486_WriteData(0x04);
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x3C);
ILI9486_WriteData(0x0F);
ILI9486_WriteData(0x8F);
ILI9486_WriteCmd(0xF2);
ILI9486_WriteData(0x18);
ILI9486_WriteData(0xA3);
ILI9486_WriteData(0x12);
ILI9486_WriteData(0x02);
ILI9486_WriteData(0xB2);
ILI9486_WriteData(0x12);
ILI9486_WriteData(0xFF);
ILI9486_WriteData(0x10);
ILI9486_WriteData(0x00);
ILI9486_WriteCmd(0XF7);
ILI9486_WriteData(0xa9);
ILI9486_WriteData(0x91);
ILI9486_WriteData(0x2d);
ILI9486_WriteData(0x0a);
ILI9486_WriteData(0x4c);
ILI9486_WriteCmd(0xF8);
ILI9486_WriteData(0x21);
ILI9486_WriteData(0x04);
ILI9486_WriteCmd(0xF9);
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x08);
ILI9486_WriteCmd(0x36); // Memory Access Control
ILI9486_WriteData(0xC8);
ILI9486_WriteCmd(0x3A); // 16/18 bits
ILI9486_WriteData(0x55);
ILI9486_WriteCmd(0xB4);
ILI9486_WriteData(0x02); // 2-Dot Inv
ILI9486_WriteCmd(0xB7);
ILI9486_WriteData(0x86);
ILI9486_WriteCmd(0xC0); // Vreg
ILI9486_WriteData(0x0c); // Vreg1
ILI9486_WriteData(0x02); // Vreg2
ILI9486_WriteCmd(0xC1); //Power control
ILI9486_WriteData(0x41); //SAP[2:0];BT[3:0]
ILI9486_WriteCmd(0xC2); //Pump Freq
ILI9486_WriteData(0x22);
ILI9486_WriteCmd(0xC5); //DC VCOM
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x44);
ILI9486_WriteData(0x80);
ILI9486_WriteCmd(0xB1); //Frame Rate
ILI9486_WriteData(0xB0);
ILI9486_WriteData(0x11);
ILI9486_WriteCmd(0x26); //Gamma curve selected
ILI9486_WriteData(0x01);
ILI9486_WriteCmd(0xE0);
ILI9486_WriteData(0x0F);
ILI9486_WriteData(0x1C);
ILI9486_WriteData(0x18);
ILI9486_WriteData(0x0A);
ILI9486_WriteData(0x0F);
ILI9486_WriteData(0x08);
ILI9486_WriteData(0x45);
ILI9486_WriteData(0xA8);
ILI9486_WriteData(0x34);
ILI9486_WriteData(0x0C);
ILI9486_WriteData(0x13);
ILI9486_WriteData(0x05);
ILI9486_WriteData(0x0B);
ILI9486_WriteData(0x07);
ILI9486_WriteData(0x00);
ILI9486_WriteCmd(0XE1);
ILI9486_WriteData(0x0F);
ILI9486_WriteData(0x38);
ILI9486_WriteData(0x34);
ILI9486_WriteData(0x0A);
ILI9486_WriteData(0x0C);
ILI9486_WriteData(0x03);
ILI9486_WriteData(0x4B);
ILI9486_WriteData(0x75);
ILI9486_WriteData(0x3A);
ILI9486_WriteData(0x07);
ILI9486_WriteData(0x13);
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x27);
ILI9486_WriteData(0x23);
ILI9486_WriteData(0x00);
/*ILI9486_WriteCmd(0xB6);
ILI9486_WriteData(0x00); // CPU\RGB
ILI9486_WriteData(0x42);
ILI9486_WriteData(0x3B); */
ILI9486_WriteCmd(0xB7);
ILI9486_WriteData(0x86);
ILI9486_WriteCmd(0xB6); // RM.DM Setting
ILI9486_WriteData(0x02);
// if(s_lcd_direct == LCD_DIRECT_ROT_180||g_InversionDisplaySwitch) //180518 update
// //ILI9486_WriteData(0x02); //?1?ok
// ILI9486_WriteData(0x42); //?2?ok
// else
ILI9486_WriteData(0x22);
ILI9486_WriteCmd(0x2A); // Gamma setting
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x01);
ILI9486_WriteData(0x3F);
ILI9486_WriteCmd(0x2B); // Gamma setting
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x00);
ILI9486_WriteData(0x01);
ILI9486_WriteData(0xDF);
ILI9486_WriteCmd(0x36); // Color filter setting
ILI9486_WriteData(0x08);
ILI9486_WriteCmd(0x11); //Exit Sleep
HAL_Delay(120);
ILI9486_WriteCmd(0x29); //Display on
HAL_Delay(20);
ILI9486_WriteCmd(0x2C);
}
void lcd_set_cursor(unsigned short Xpos,unsigned short Ypos)
{
ILI9486_WriteCmd(0x2A); // Gamma setting
ILI9486_WriteData(Xpos>>8);
ILI9486_WriteData(Xpos&0XFF);
ILI9486_WriteData(0x01);
ILI9486_WriteData(0x3F);
ILI9486_WriteCmd(0x2B); // Gamma setting
ILI9486_WriteData(Ypos>>8);
ILI9486_WriteData(Ypos&0XFF);
ILI9486_WriteData(0x01);
ILI9486_WriteData(0xDF);
}
void lcd_drow_point(unsigned short Xpos,unsigned short Ypos)
{
lcd_set_cursor(Xpos,Ypos);
ILI9486_WriteCmd(0x2C);
for(unsigned int i = 0; i<480*320; i+=2)
{
ILI9486_WriteData(i);
ILI9486_WriteData(i+1);
}
}
unsigned short lcd_get_point(unsigned short Xpos,unsigned short Ypos)
{
lcd_set_cursor(Xpos,Ypos);
ILI9486_WriteCmd(0x2E);
for(unsigned short i = 0; i<204; i+=2)
{
buf[i] = ILI9486_RAM;
buf[i+1] = ILI9486_RAM;
}
printf("read point is ");
for(unsigned short i = 0; i<204; i++)
{
printf("%02x,",buf[i]);
}
printf("\r\n");
}
unsigned int lcd_get_id(void)
{
ILI9486_REG = 0xd3;
buf[0] = ILI9486_RAM;
buf[1] = ILI9486_RAM;
buf[2] = ILI9486_RAM;
buf[3] = ILI9486_RAM;
printf("the reg[d3h] para is %02x,%02x,%02x,%02x,%02x\r\n",buf[0],buf[1],buf[2],buf[3],buf[4]);
return (buf[1] << 16) + (buf[2] << 8) + buf[3];
}
void lcd_reg_test(void)
{
lcd_reg_init();
lcd_get_id();
lcd_drow_point(0,0);
HAL_Delay(1);
lcd_get_point(1,0);
HAL_Delay(1);
}
|
|