差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 | |||
book_excise_lcd_touch [2021/08/24 14:02] zili |
book_excise_lcd_touch [2021/08/24 14:14] (当前版本) zili |
||
---|---|---|---|
行 222: | 行 222: | ||
.c1(clk_sys)); | .c1(clk_sys)); | ||
+ | </code> | ||
+ | |||
+ | #### 3.3 触摸屏touch模块(touch.v) | ||
+ | 触摸屏touch模块检测触点坐标的基本原理是:等待触摸屏送出IRQ终端信号,在检测到终端信号后,向触摸屏控制芯片TSC2046写入控制字,在写入控制字后通过SSI接口读取相应触点的x、y坐标位置,并将坐标位置显示在7段数码管上。 | ||
+ | |||
+ | 触摸屏主要有六个信号:CS、DCLK、DIN、BUSY、DOUT和IRQ,在检测到中断IRQ后,通过DOUT输出控制字,然后通过DIN接收坐标位置;CS为片选信号,DCLK为访问时钟;在输出控制字后,触摸屏置BUSY为高一个时钟周期,表示触摸屏正忙。 | ||
+ | 触摸屏模块touch的数据流如图20-6所示。 | ||
+ | {{ ::图20-6.png |图20-6 触摸屏程序框图}} | ||
+ | <WRAP centeralign> | ||
+ | **图20-6 触摸屏程序框图** | ||
+ | </WRAP> | ||
+ | |||
+ | Ping模块的接口分两部分:一部分是与触摸屏控制芯片的接口,一部分是与显示坐标数据的8段数码管接口。与触摸屏的接口如下: | ||
+ | <code verilog> | ||
+ | |||
+ | input IRQ; //触摸屏产生的中断信号,有触摸时IRQ为低。 | ||
+ | input iBusy; //触摸屏工作中指示信号,为高时表示触摸屏忙。 | ||
+ | input Din; //从触摸屏输入到FPGA的坐标位置数据。 | ||
+ | output Dclk; //接口时钟。 | ||
+ | output Dout; //FPGA向触摸屏发送的控制信号。 | ||
+ | output oCs; //触摸屏片选信号。 | ||
+ | 与显示坐标数据的7段数码管有关的引脚如下: | ||
+ | output [7:0]HEX_sel; //七段数码管片选信号线。 | ||
+ | output [7:0]HEX_seg; //数码管显示的数据。 | ||
</code> | </code> | ||
- | \\ | ||
- | \\ | ||
- | ### 4. 仿真结果 | ||
+ | Touch模块主要受状态机State控制,其状态转移图如图 20-7所示。 | ||
+ | {{ ::图20-7.png |图20-7 触摸屏程序状态机}} | ||
+ | <WRAP centeralign> | ||
+ | **图20-7 触摸屏程序状态机** | ||
+ | </WRAP> | ||
+ | State有X_CONFIG、X_DATA、Y_CONFIG和Y_DATA4个状态: | ||
- | \\ | + | X_CONFIG状态:对TSC2046进行设置,以测试X方向的坐标。 |
- | \\ | + | |
- | ### 5. 演示程序文件说明 | + | |
+ | X_DATA状态:读取TSC2046送来的X方向坐标值。 | ||
+ | Y_CONFIG状态:对TSC2046进行设置,以测试Y方向的坐标。 | ||
+ | Y_DATA状态:读取TSC2046送来的Y方向坐标值。 | ||
+ | |||
+ | 状态机的状态转移由计数器counter来进行控制。在初始时,State处于Y_DATA,而当IRQ被拉低期间,counter每个时钟自动增加,从而驱动状态机发生跳转以读取x、y坐标,并将坐标显示在八段数码管上。当触摸屏受到触发时IRQ信号被拉低,一般情况下拉低的周期足够完成状态机的跳转(因为FPGA运转很快,而人的操作则相对缓慢),完成坐标位置的读写。具体程序如下: | ||
+ | |||
+ | <code verilog> | ||
+ | |||
+ | reg [2:0] state; | ||
+ | reg [11:0] counter; | ||
+ | always@(negedge Dclk or negedge iRst) begin | ||
+ | if(!iRst) | ||
+ | counter <= 12'b0; | ||
+ | else begin | ||
+ | if(IRQ==1'b1) | ||
+ | counter <= 12'b0; | ||
+ | else //在IRQ为低时,表示有触摸,counter开始工作。 | ||
+ | counter <= counter + 1'b1; | ||
+ | end | ||
+ | end | ||
+ | | ||
+ | always@(posedge Dclk or negedge iRst) begin | ||
+ | if(!iRst) begin | ||
+ | state <= Y_DATA; | ||
+ | end | ||
+ | else begin | ||
+ | if((counter>=3000) && (counter < 3008)) | ||
+ | state <= X_CONFIG; //发送命令:读取x坐标值 | ||
+ | else if((counter >=3008) && (counter <3024)) | ||
+ | state <= X_DATA; //读取x坐标值 | ||
+ | else if((counter >=3024) && (counter <3032)) | ||
+ | state <= Y_CONFIG; //发送命令:读取y坐标值 | ||
+ | else | ||
+ | state <= Y_DATA; //读取y坐标值 | ||
+ | end | ||
+ | end | ||
+ | |||
+ | </code> | ||
+ | |||
+ | 需要说明的是,因为该接口时钟为百K量级,所以触摸屏程序的时钟是通过内部触发器产生,没有统一到整个系统时钟域内。 | ||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ### 4. 运行结果 | ||
+ | 从SignalTap中观测触摸屏程序中读取坐标值的信号如图 20 8所示,其中在X_CONFIG、X_DATA、Y_CONFIG、和Y_DATA 有效期间,Din和Dout在Dclk时钟控制下对TSC2046进行配置和读取。其中在X_CONFIG有效期间程序向TSC2046发送的数据为8'b0001_1011,而在Y_CONFIG有效时程序向TSC2046发送的数据为8' b0001_1001。 | ||
+ | {{ ::图20-8.jpg |图20-8 运行结果}} | ||
+ | <WRAP centeralign> | ||
+ | **图20-8 运行结果** | ||
+ | </WRAP> | ||
+ | |||
+ | \\ | ||
+ | \\ | ||
+ | ### 5. 演示程序文件说明 | ||
+ | |文件名|功能| | ||
+ | |TFT.v|顶层模块。| | ||
+ | |ping.v|液晶屏控制模块。| | ||
+ | |touch.v|控制和读取触摸屏上面的坐标值。| | ||
+ | |data_2_display.v|显示触点坐标。| | ||
+ | |displayData.hex|该文件存储液晶屏芯片ILI9326的配置数据, 16位宽,奇数地址存储ILI9326的寄存器地址,偶数地址存储待向该地址写入配置数据。| | ||
\\ | \\ | ||
\\ | \\ | ||
### 6. 演示程序使用 | ### 6. 演示程序使用 | ||
+ | 演示设备:核心板、扩展板。 | ||
+ | |||
+ | 演示方法:首先需要用Nios将图像“tft屏显示图像.bmp”烧到Flash中,起始地址为0x0。然后把程序下载到开发板上之后,液晶屏上将显示烧入的图像。如果FLASH内没有烧入图像,液晶屏上将液晶花屏。用手指触摸液晶屏,可以看到在8段数码上显示当前触点的坐标值。 | ||