FT8xx初始化步骤如下:
1. 复位读取ID
do
{
ft8xxPDEn();
ft8xxSleep(10/TIMER_MS);
ft8xxPDDis();
ft8xxSleep(20/TIMER_MS);
ft8xxWrCmd(FT_GPU_ACTIVE_M);
ft8xxSleep(20/TIMER_MS);
ft8xxWrCmd(FT_GPU_EXTERNAL_OSC); //Default use internal osc
ft8xxSleep(10/TIMER_MS);
}while(ft8xxVerify() == 0);
首先是PD脚复位一次FT8xx,然后ft8xxWrCmd(FT_GPU_ACTIVE_M),FT8xx从Standby/Sleep/PWRDOWN 模式切换到Active模式,接着设置晶振类型,
外部晶振 ft8xxWrCmd(FT_GPU_EXTERNAL_OSC)
内部晶振 ft8xxWrCmd(FT_GPU_INTERNAL_OSC)
函数ft8xxVerify就是读取寄存器REG_ID,如果ID值为0x7C则返回0,否则返回非0。
uint8_t ft8xxVerify(void)
{
uint8_t count = 100;
do
{
uint32_t chipid = 0;
count--;
chipid = ft8xxRdMem32(REG_ID);
//chipid = 0x7c;
if(chipid == 0x7c)
break;
ft8xxSleep(10/TIMER_MS);
}while (count);
return count;
}
如果FT8xx硬件有问题,一般读ID会出错,所以如果ID读不到重点查硬件是否有问题,比如FT8xx焊接不良,SPI通信问题等。另外注意REG_ID的值是否正确,因为FT80x和FT81x的REG_ID值不同。
2. 初始化屏幕部分
首先需要将背光关掉,设置DISP脚输出高电平。
ft8xxWrMem8(REG_PWM_DUTY, 0);
ft8xxGpio(PANEL_DISP_PIN, 1, PANEL_DISP_DIS);
delayms(10);
ft8xxGpio(PANEL_DISP_PIN, 1, PANEL_DISP_EN);
注意FT81x和BT81x的GPIO控制寄存器不一样,DISP对应的GPIO也不一致。
根据官网上的AN_336_FT8xx - Selecting an LCD Display.pdf配置以下寄存器
void ft8xxLcdConfig(void)
{
ft8xxWrMem16(REG_HCYCLE, 548);
ft8xxWrMem16(REG_HOFFSET, 43);
ft8xxWrMem16(REG_HSYNC0, 0);
ft8xxWrMem16(REG_HSYNC1, 41);
ft8xxWrMem16(REG_VCYCLE, 292);
ft8xxWrMem16(REG_VOFFSET, 12);
ft8xxWrMem16(REG_VSYNC0, 0);
ft8xxWrMem16(REG_VSYNC1, 10);
ft8xxWrMem8(REG_SWIZZLE, 0);
ft8xxWrMem8(REG_PCLK_POL, 1);
ft8xxWrMem8(REG_PCLK, 5);
ft8xxWrMem16(REG_HSIZE, LCD_WIDTH);
ft8xxWrMem16(REG_VSIZE, LCD_HEIGHT);
}
3. 设置背光亮度
ft8xxWrMem8(REG_PWM_DUTY, 0x80);
4. 测试代码,在屏幕中间显示“Hello World!”,在目标板上应该可以显示出字符串。
ftStartDisp();
ftWrDispCmd(CLEAR_COLOR_RGB(0, 0, 0));
ftWrDispCmd(CLEAR(1, 1, 1));
ftWrDispCmd(CMD_TEXT);
ftWrDispCmd(((LCD_HEIGHT / 2) << 16) | ((LCD_WIDTH / 2) & 0xffff));
ftWrDispCmd(((OPT_CENTER << 16) | 31));
ftWrDispBuf("Hello World!", strlen("Hello World!") + 1);
ftEnDisp(TRUE);