NuMaker-IIoT-NUC980 测评之使用 EBI 驱动 LCD 作者:qinyunti
特征 三个独立芯片选择引脚,可设置极性,支持三个设备,时序独立设置 数据总线和地址总线分开。 每个设备支持1MB空间 8/16位数据宽度 支持8080模式LCD接口 支持PDMA 支持设置读写空闲时间 可选内部HCLK分频得到MCLK或者外部EBI_MCLK 支持地址总线和数据总线分开
配置 时钟使能 EBI (CLK_HCLKEN[9]) 复位模块 EBIRST (SYS_AHBIPRST[3]) 引脚
地址映射 三个片选分别对应地址如
连接 地址总线和数据总线分开模式
读写时序
tASU:地址建立时间,CS拉低到RD或WR拉低的时间,连续读模式CACCESS=1,tASU不需要. tACC:RD,WD拉低的时间,数据访问时间,即给对方去读数据的时间。 tAHD:数据保持时间,即RD,WR拉高后到CS拉高的时间。 寄存器 EBI_CTLx 设置时钟分频,使能EBI功能,总线宽度设置,CS极性等
EBI_TCTLx 设置时序参数 使用EBI驱动LCD设计 硬件设计 - LCD选型 从原理图可以看出CON11为EBI接口,设计时实际就是预留给LCD使用的,可以使用EBI接口,接8080模式16bit的LCD屏。
对应如下:
从淘宝上挑选了一个便宜的2.4寸支持8080模式的触摸屏。使用的驱动芯片是ST7789V。 原理图和PCB设计 使用KiCAD设计了原理图和PCB
原理分析 用的CS0片选,所以地址空间为0x6000_0000 ~ 0x600F_FFFF
由于RS引脚接到了ADDR10,而且使用的是16bit模式,所以地址中的1<<11位对应ADDR10即RS。 如果是8位模式则一一对应,地址中的1<<10位对应ADDR10即RS 写地址0x60000000 | 1<<11则ADDR10为1,RS=1表示数据 写地址0x60000000 | 0<< 11则ADDR10为0,RS=0表示命令
所以读写命令或者数据只需要读写地址0x60000000 | 1<<11和0x60000000 | 0<< 11即可。
液晶屏的参数如下 根据以上 先确认HCLK时钟分频2^x次得到MCLK,x=0~7最大分频128。 sysGetClock(SYS_HCLK))可以获取HCLK单位为M 分频x则MCLK为x/HCLK uS = 1000*x/HCLK nS
nu_clocks可以打印当前时钟配置 代码编写 见lcd.c 硬件/时序调试 焊接完后要先确认是否有短路,再上电。
首先先确认各引脚是不是对,对于RESET和BL引脚是作为IO的直接翻转用示波器或者逻辑分析仪看是否正确, 对于其他EBI引脚按照如下测试代码 用逻辑分析仪去看是否信号线是否都对,首先确认信号线是否一一对应,不对就检查原理图和PCB和焊接。 然后确认信号是否符合要求,不符合就确认寄存器的配置是否正确。 \nk-980-iot-test\lcd-pcb\测试信号 使用Logic 2.3.47打开.sal 是我这里抓取到波形,可以打开回放,和上面的测试代码对应。 源码 https://gitee.com/qinyunti/nk-980-iot-test.git
LCD相关资料在lcd-pcb目录下。 总结 EBI接口驱动8080接口的LCD非常方便,本次设计也比较顺利,一次就成功,其中逻辑分析仪非常重要,用来分析时序没有他不行,另外嘉立创的打样活动非常不错,可以去看看。 下次测试下性能,优化下时序,将时序尽可能提高到最快,尽可能提高刷屏速度。 后面再移植GUI,暂时选定lvgl或者emwin。 后面再添加ADC测评,添加驱动支持。
|