//本人出入FPGA,可能程序写的不好,请指正。
1 module touch(
2 CLK,RSTn,
3
4 TOUCH_CS,
5 TOUCH_IRQ,
6 TOUCH_BY,
7 TOUCH_CLK,
8 TOUCH_MISO,
9 TOUCH_MOSI,
10
11 test
12 );
13 input CLK;
14 input RSTn;
15
16 input TOUCH_BY;
17 output TOUCH_CS;
18 //input TOUCH_IRQ;
19 inout TOUCH_IRQ;
20 output TOUCH_CLK;
21 input TOUCH_MISO;
22 output TOUCH_MOSI;
23
24 output [3:0]test;
25 reg TOUCH_CSr;
26 reg TOUCH_CLKr;
27 reg TOUCH_MOSIr;
28
29 //check the errer
30 reg [7:0] count_irq;
31 reg irq_flag;
32 always @(posedge CLK or negedge RSTn)
33 if(!RSTn)begin
34 count_irq <= 8'd0;
35 irq_flag <= 1'b0;end
36 else if(count_irq == 8'd20)
37 begin
38 count_irq <= 8'd0;
39 irq_flag <= 1'b1;
40 end
41 else
42 count_irq <= count_irq + 1'b1;
43
44 assign TOUCH_IRQ = (irq_flag)? 1'bz:1'b0;
45 //
46 reg [7:0] count_500ns;
47
48 parameter T500ns = 8'd24;//25*20ns = 500ns = 0.5us
49 reg spi_clk_flag;
50 //***************************************************
51 `define spi_clk_open 1'b1
52 `define spi_clk_close 1'b0
53 //***************************************************
54 always @(posedge CLK or negedge RSTn)
55 if(!RSTn)
56 count_500ns <= 8'd0;
57 else if(count_500ns == T500ns || (!spi_clk_flag))
58 count_500ns <= 8'd0;
59 else if(spi_clk_flag)
60 count_500ns <= count_500ns + 1'b1;
61
62 reg [7:0] count_2us;
63 reg count_2us_flag;
64 //*************************************************
65 `define count_2us_open 1'd1
66 `define count_2us_close 1'd0
67 //*************************************************
68 always @(posedge CLK or negedge RSTn)
69 if(!RSTn)
70 count_2us <= 8'd0;
71 else if(count_2us == 8'd99 || (!count_2us_flag))
72 count_2us <= 8'd0;
73 else if(count_2us_flag)
74 count_2us <= count_2us + 1'b1;
75 else
76 count_2us <= count_2us;
77
78 //**************************************************************
79 `define touch_clk_pos 8'd2
80 `define touch_clk_neg T500ns/2
81 `define high 1'b1
82 `define low 1'b0
83 //**************************************************************
84
85 parameter touch_cmd_x = 8'b1001_0000;// x_pos
86 parameter touch_cmd_y = 8'b1101_0000;// y_pos
87 reg [7:0] state_touch;
88 reg [7:0] count_cmd_bit;
89 reg [7:0] count_dat_bit;
90 reg [11:0] touch_x1data;
91 reg [11:0] touch_x2data;
92 reg [7:0] count_sample;
93 always @(posedge CLK or negedge RSTn)
94 if(!RSTn)
95 begin
96 state_touch <= 8'd0;
97 spi_clk_flag <= `spi_clk_close;
98 count_cmd_bit <= 8'd0;
99 count_sample <= 8'd0;
100 end
101 else
102 case (state_touch)
103 8'd0:
104 if(!TOUCH_IRQ )
105 begin
106 state_touch <= 8'd1;
107 count_sample <= 8'd0;
108 TOUCH_CSr <= `low;
109 spi_clk_flag <= `spi_clk_close;
110 count_2us_flag <= `count_2us_close;
111 TOUCH_CLKr <= `low;
112 end
113 else
114 begin
115 state_touch <= 8'd0;
116 TOUCH_CSr <= `high;
117 TOUCH_CLKr <= `low;
118 end
119 8'd1:
120 begin
121 state_touch <= 8'd2;
122 spi_clk_flag <= `spi_clk_open;
123 TOUCH_CSr <= `low;
124 count_cmd_bit <= 8'd9;
125 count_dat_bit <= 8'd16;
126 end
127 8'd2://write cmd
128 if(count_500ns == `touch_clk_pos)//wait posedge clk
129 begin
130 state_touch <= 8'd3;
131 TOUCH_CLKr <= `low;
132 TOUCH_MOSIr <= touch_cmd_x[count_cmd_bit-2'b10];
133 count_cmd_bit <= count_cmd_bit - 1'b1;
134 end
135 else
136 state_touch <= 8'd2;
137 8'd3:
138 if(count_cmd_bit == 8'd0)
139 begin
140 TOUCH_MOSIr <= 1'd0;
141 TOUCH_CLKr <= `low;
142 if(count_2us == 8'd99)
143 begin
144 state_touch <= 8'd4;
145 count_2us_flag <= `count_2us_close;
146 count_dat_bit <= 8'd16;
147 spi_clk_flag <= `spi_clk_open;
148
149 end
150 else
151 begin
152 state_touch <= 8'd3;
153 count_2us_flag <= `count_2us_open;
154 spi_clk_flag <= `spi_clk_close;
155 end
156 end
157 else if(count_500ns == `touch_clk_neg)
158 begin
159 state_touch <= 8'd2;
160 TOUCH_CLKr <= `high;
161 end
162 else state_touch <= 8'd3;
163 8'd4://read data
164 if(count_500ns == `touch_clk_neg)//wait negedge clk
165 begin
166 state_touch <= 8'd5;
167 TOUCH_CLKr <= `high;
168 touch_x1data[count_dat_bit-1'b1] <= TOUCH_MISO;
169 end
170 else
171 state_touch <= 8'd4;
172 8'd5:
173 begin
174 state_touch <= 8'd6;
175 count_dat_bit <= count_dat_bit - 1'b1;
176 end
177 8'd6:
178 if(count_dat_bit == 8'd0)
179 begin
180 state_touch <= 8'd7;
181 TOUCH_CLKr <= `low;
182 end
183 else if(count_500ns == `touch_clk_pos)
184 begin
185 TOUCH_CLKr <= `low;
186 state_touch <= 8'd4;
187 end
188 else
189 state_touch <= 8'd6;
190
191 8'd7:
192 begin
193 state_touch <= 8'd8;
194 spi_clk_flag <= `spi_clk_close; //close the spi clock
195 TOUCH_CSr <= `high;
196 end
197 8'd8:
198 if(count_2us == 8'd99)
199 begin
200 state_touch <= 8'd0;
201 count_2us_flag <= `count_2us_close;
202 end
203 else
204 begin
205 state_touch <= 8'd8;
206 count_2us_flag <= `count_2us_open;
207 end
208
209 endcase
210 assign TOUCH_CLK = TOUCH_CLKr;
211 assign TOUCH_CS = TOUCH_CSr;
212 assign TOUCH_MOSI = TOUCH_MOSIr;
213 assign test = touch_x1data[3:0];//显示采集的第四位数据
215 endmodule