1. 本次用的是XPT2046芯片作为触摸控制,接口主要是SPI接口。
本文很多是从之前买的黑金板子上的例程学习的,这次拿来研究并用在我的项目上。我觉得黑金的板子做的还是不错的。 CS信号也是拉低有效的使能信号,CLK信号是串行时钟,IRQ是拉低有效的沟 通信号,DI与DO是读写作用的串行数据信号,BY是BUSY的缩写,表示忙状态。 时序如下(图片从黑金资料找的)
2. 其实根据上面的时序看,应该是上升沿读数据,下降沿变数据。 写一个字节数据需要8个时钟。写字节的命令格式如下(参考黑金):
| | | | | | | | 通道地址。X通道 = 3’b001,Y通道 3’b101。 | | | 12位/8位分辨率选择。值0为12位分辨率,反之亦然。 | | | | | | |
看到这个我感觉这个芯片基本就能用起来了,只要把SPI用上,万事俱备。 读取X通道转化结果,12位分辨率,差分输入,低功率,8’b1_001_0000或者8’h90。 读取Y通道转换结果,12位分辨率,差分输入,低功率,8’b1_101_0000或者8’hD0。 所以常用的就只要上面2个命令了。
3. 所以应该完成第一个写SPI的代吗,SPI_DI就是引脚(接XPT2046的),SPI_CLK是时钟引脚,FCLK表示一个时钟周期,C1为0拉低CLK,C1为半个周期(FHALF)则拉高时钟,DATA1就是我们需要写到XOT2046的值,下面代吗还是比较简单的,参考黑金 Begin //上面还有1个循环8次的 SPI_DI <= DATA1[7-i]; //由高至低逐位赋值 if( C1 == 0 ) SPI_CLK <= 1'b0; //产生时钟 else if( C1 == FHALF ) SPI_CLK <= 1'b1; //产生时钟 if( C1 == FCLK -1) begin C1 <= 8'd0; i <= i + 1'b1; end //一个时钟,i+1 else begin C1 <= C1 + 1'b1; end 4. 接下来需要用到读的操作,上升沿读数据 ,这个代码我就不多说了,可以看到SPI的CLK时钟都是由FPGA发出的,所以SPI是主,其实SPI还有4种模式,有兴趣的可以百度瞅瞅
begin if( C1 == FHALF ) DATA2[11-i] <= SPI_DO; if( C1 == 0 ) SP_CLK <= 1'b0; else if( C1 == FHALF ) SPI_CLK <= 1'b1; if( C1 == FCLK -1) begin C1 <= 8'd0; i <= i + 1'b1; end else begin C1 <= C1 + 1'b1; end end
5. 对了,还有一个IRQ引脚,就是触摸屏有按下的时候回触发一个中断,这个引脚是很关键的。
6. 硬件模块如上图所示。代码模块如下:
7. 顶层模块如下 module touch_XPT2046 ( input CLK,RST, output SPI_CS, output SPI_CLK, output SPI_DI, input SPI_DO, input [1:0]SPI_Call, output SPI_Done, output [7:0]SPI_OUT_Data);
|