谁有tcl a996驱动d2 757驱动呀,给一份呀,

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
TCLMS801机芯电路原理与故障检修实例分解.doc 15页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
MS801机芯电路原理MS801机芯的系列机型属于Android 智能数字电视,基本功能包括模拟ATV、数字DTV、互联网、全信源3D 和Android 4.0 UI。主要的型号有L46V7500A-3D、L55V7500A-3D、L65V7500A-3D。各个电路板的连接如图1所示。
一、电源电路
该机的电源电路由主电源电路(24V电源)、待机电源电路(3V3SB电源)、12V电源、5V电源、3.3V电源、2.5V电源等构成,如图2所示。
1.24V、3V3SB电源电路
24V、3V3SB电源设置在电源板上,其中3V3SB电源是不受控电源,通电后就会进入工作状态,为微控制系统提供3.3V工作电源。24V电源是受控电源,开机时来自微控制器电路的待机/开机信号POWER_ON为高电平时,24V电源才能工作并输出24V电压;待机时POWER_ON为低电平,24V电源无电压输出。
2.12V、5V电源电路
12V5V电压由24V电压经DC-DC型功率变换器转换而来,如图3所示。12V5V电源电路的构成,仅元器件符号不同,下面以12V电源电路为例进行介绍。
(1)电压变换
V电压U004内,V电压经L004对C068、C069、C074充电,不仅在它们两端建立电压,而且在L004两端产生左正、右负的电动势;L004 通过自感产生右正、左负的电动势,该电动势通过(2).1V电源电路
15V电源由U001(MP2127)、电感L016为核心构成的DC-DC型功率变换器如图所示。15V电源的工作原理和图3所示的12V电源工作原理基本相同。
1.5V电源电路
.1V电源电路
15V电源由U600(TPS54519)、电感L005为核心构成的DC-DC型功率变换器如图所示。
1.15V电源电路
15V电源的工作原理和图3所示的12V电源工作原理基本相同。不同的点主要有两个:一是,它设置了过压保护电路,由芯片U006的6脚内部电路和取样电阻R097、R045~R047构成;二是,设置软启动电路。由U600内部电路与9脚外接的软启动电容C053构成。
5.V、3.3V电源电路
5V、3.3V电源由LDO型稳压器U002、U003为核心构成,如图所示。5V、3.3V电源的工作原理与普通稳压器的工作原理相同。
2.5V、3.3V电源电路
该机的系统控制电路eMMC内,由MMC (多媒体卡)接口、快闪存储器及主控制器构成。其供电电压3.3V时钟频率CLOCK为32MHz存储容量在SLC模式下为4G,相当于原来的NAND FLASH,用于存储主程序软件及用户数据。
1.基本工作条件电路
待机电源工作后,由其输出的3V3SB电压。
1)开机复位
参见图7a,开机瞬间,3.3V电压一路经D403内右侧的二极管对C408充电,为Q401的e极供电;另一路经R419对C409充电。由于R419的阻值较大,所以C409的充电时间较长,使Q401在开机瞬间因b极电位较低而导通,它的c极输出高电平电压经R417加到MCU的复位端MCU_RESET,使它内部的存储器、寄存器等电路开始复位。随着C409两端的充电电压升高,Q401由导通转为截止,MCU_RESET脚的电位变为低电平,MCU复位结束,开始工作。
2)关机复位
关机复位包括3.3V掉电复位和24V掉电复位两部分。
参见图7a,关机瞬间,3.3V电压消失,D403内右侧的二极管反偏截止,C408存储的电压不能释放,而D403内左侧的二极管导通后,为C409提供放电回路,使C409存储的电压迅速释放,致使Q401因b极电位下降而导通,其c极输出的高电平电压加到MCU的复位端后,就会实现3.3V关机复位功能。
参见图7b,开机期间,24V电压经R415、R414、R412降压限流后使Q404的b极电位高于3.3V,使Q404截止。关机瞬间,24V电压迅速消失,使Q404因b极电位下降而导通,其c极输出的电压加到MCU的复位端后,就会实现24V关机复位功能。
()时钟振荡
参见图,U内的MCU获得供电后,它内部的时钟振荡器与、脚外接的晶振和移相电容C、C通过振荡产生MHz振荡信号。该信号经分频后,为MCU提供对相关电路进行控制时的基准信号。.
MS801机芯的关键点
1)供电 EM_3V3检测点在位置主板背面L603或正面R677一端供电V3SB)如果不正常,不能进行数据读取和写入,软件无法正常启动。
2)时钟CLOCK,检测点在主板背面的R665CLOCK不正常,也不能完成正常的通讯,频率为32MHz,峰峰值为3.3V。
3)命令CMD,检测点在主板的
正在加载中,请稍后...
227页347页27页252页20页17页13页21页24页19页他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十八:TFT模块 - 触屏
来源:博客园
实验二十八:TFT模块 - 触屏
读者在上一个实验所玩弄过的 TFT LCD模块,除了显示大小为 320 × 240,颜色为16位RGB的图像信息以外,它还支持触屏。所谓触屏就是鼠标还有键盘以外的输入手段,例如现在流行平板还有智能手机,触屏输入对我们来说,已经成为日常的一部分。描述语言一门偏向硬件的语言,面对触屏,它顶多只能做做一些驱动的工作,其余如滤波,还有像素转换等计算,它必须交由高级语言去负责。
面向无能为力的描述语言,笔者不禁联想过去的自己 ... 好痛苦,好难受。话虽如此,天生我才必有用,描述语言虽然完成不了触屏的伟业,不过只要做做驱动,平稳过着日子,它便心满意足了。
图28.1 触屏的硬件部署。
如图28.1所示,那是触屏的硬件部署。根据理论,TFT显示屏上面布满一层敏感的电磁层(触屏层)作为输入或者传感,而且传感的强弱会随着位置不同而不同。如果笔者不小心触碰任何一点,控制器 SSD 1289 会经由差分的 X+/-信号 还有 Y+/- 信号,将传感结果发送出去。在此,TFT显示屏的工作已经结束。
差分是什么?估计失忆的同学会非常好奇。假设笔者不小心触碰位置X20,然后像素X20所对应的模拟信号,例如1.2v,其中正电压 +1.2v会经由X+ 信号发送出去,至于负电压 -1.2v 则会经由 X- 信号后发送出去。差分的目的一般都为了使电压更稳定更准确,读者只要这样理解即可。
事后,差分的传感结果便会传入A/D硬件的耳中,如果输入源是差分,A/D硬件理应长出一对接收差分的耳朵,对此也称为差分A/D硬件。如果读者不知道A/D是什么,读者必须抓去枪毙了 ... A/D全名是 Analogue to Digital Convert,即模拟转为数字。这只命运般的A/D硬件就是鼎鼎大名的 XPT2046 硬件。
硬件XPT2046就是差分的A/D硬件,同时也是本实验的主角。如图28.1所示,它将TFT显示屏哪里发来的传感结果转换为数字信号,然后再经由 FPGA读取。好奇的同学可能会继续好奇什么是物理像素?这个问题说来话长 ... 假设屏幕是一个容器,藏在容器里边的像素就称为屏幕像素,然而围绕容器外边的像素就称为物理像素。
比喻来讲,同是人形生物,住在地球的人形生物就称为地球人,住在地球以外的人形生物就称为外星人。结果而言,地球人并不等价外星人,虽然两者都有相似的外表。所以说,物理像素还有屏幕像素,它们听起来都是像素,不过实际上是不等价的东西。对此,物理像素为了成为屏幕像素,它们必须经过“转换算法”才能成为如假包换的屏幕像素。不过,“转换算法”对描述语言来说,这项工作实在太巨大了。
好了好了,笔者也差不多要进入主题了,废话再说下去,口水就会把电脑淹没了。
图28.2 硬件XTP2046链接FPGA。
图28.2显示硬件XTP2046链接FPGA所需要的连线,由于硬件XTP2046是SPI传输协议的信奉者,所以这些信号多少也有SPI的影子。CS信号也是拉低有效的使能信号,CLK信号是串行时钟,IRQ是拉低有效的沟通信号,DI与DO是读写作用的串行数据信号,BY是BUSY的缩写,亦即表达状态的状态信号。如图28.2所示,因为FPGA控制 CLK信号还有CS信号,所以FPGA是主机,硬件XTP2046则是从机。
图28.3 写时序/写命令(主机视角)。
首先让我们来瞧瞧XTP2046的写时序,如图28.3所示,写时序也称为写命令,因为主机访问从机只有写命令而没有写数据。我们知道SPI都是下降沿设置数据,上升沿锁存数据 ... 对此,写一个字节命令需要用到8下降沿,期间CS必须一直拉低。如图28.3所示,一字节命令当中却有各个不同的位作用,结果如表28.1所示:
表28.1 命令位说明。
起始位,值1为起始。
通道地址。X通道 = 3’b001,Y通道 3’b101。
12位/8位分辨率选择。值0为12位分辨率,反之亦然。
输入源选择。值0为差分输入,值1为单端输入。
功率选择。2’b00为低功率,2’b11为平常。
如表28.1所示,那是命令位的说明。Call为起始,值1表示开始命令,A2~A0为通道地址,常用有X通道与Y通道。Mode为分辨率选择,即转换结果是8位还是12位,常见为12位分辨率。SER/DFR为输入源选择,虽然XTP2046是差分A/D,不过它可以选择输入源。PD1~PD0为功率选择,默认为低功率。
表28.1虽然令人眼花缭乱,不过常见的命令只有以下两个:
读取X通道转化结果,12位分辨率,差分输入,低功率,8’b1_001_0000或者8’h90。
读取Y通道转换结果,12位分辨率,差分输入,低功率,8’b1_101_0000或者8’hD0。
此外,Verilog可以这样描述图28.3,结果如代码28.1所示:
0,1,2,3,4,5,6,7:

begin

rDI &= T1[7-i];



if( C1 == 0 ) rCLK &= 1'b0;

else if( C1 == FHALF ) rCLK &= 1'b1;



if( C1 == FCLK -1) begin C1 &= 8'd0; i &= i + 1'b1; end

else begin C1 &= C1 + 1'b1; end

end

代码28.1

如代码28.1所示,第1行表示相同的操作有8次,第8~9行表示一个步骤所停留的时间

,其中的FCLK表示一个时钟周期。第5~6行表示,C1为0拉低CLK,C1为半个周期(FHALF)则拉高时钟。第3行则是由高至低逐位赋值。



图28.4 读时序/读数据(主机视角)。

如图28.4所示,那是XTP2046的读时序或者说为读数据。我们知道SPI利用时钟信号的上升沿锁存数据,如果数据的分辨率设为12位(Mode为0值),那么一次性的读数据需要12个上升沿,期间CS必须拉低。根据手册,虽然一次性的读数据有12位,不过仅有当中的高八位有利用价值,亦即 Bit 11~Bit 4,结果低四位被无视。对此,Verilog可以这样表示,结果如代码28.2所示:


0,1,2,3,4,5,6,7,8,9,10,11:

begin 

if( C1 == FHALF ) T2[11-i] &= TP_DO;



if( C1 == 0 ) rCLK &= 1'b0;

else if( C1 == FHALF ) rCLK &= 1'b1;



if( C1 == FCLK -1) begin C1 &= 8'd0; i &= i + 1'b1; end

else begin C1 &= C1 + 1'b1; end

end

代码28.2

如代码28.2所示,第1行表示该操作重复12次,第8~9行表示该步骤停留FCLK周期

。第5~6行表示,C1为0拉低CLK,C1为FHALF则拉高CLK。第3行表示,C1为HALF就从TP_DO哪里暂存结果。



图28.5 一次性写命令与读数据的时序图(主机视角)。

图28.5是一次性写命令与读数据的时序图。操作期间,CS必须持续拉低,首先主机利用下降沿向从机发送一字节的写命令,事后从机会拉高BY一个时钟以示忙状态,期间主机必须给足一个空时钟。从机忙完以后便会拉低BY信号,紧接着便会发送12位宽的转换结果,期间主机必须利用上升沿读取数据。对此,Verilog 可以这样描述,结果如代码28.3所示:


1: // Write byte

begin rCS &= 1'b0; T1 &= C i &= FF_W Go &= i + 1'b1; end



// Wait Busy 

begin

if( C1 == 0 ) rCLK &= 1'b0;

else if( C1 == FHALF ) rCLK &= 1'b1;



if( C1 == FCLK -1) begin C1 &= 8'd0; i &= i + 1'b1; end

else begin C1 &= C1 + 1'b1; end

end



3: // Read 12 bit

begin i &= FF_R Go &= i + 1'b1; end



4:

begin D1 &= T2[11:4]; rCS &= 1'b1; i &= i + 1'b1; end

代码28.3

如代码28.3所示,步骤0拉低CS之余,它也赋值写命令,然后i指向写命令的伪函数(代码28.1)。写命令完成以后,主机必须给足一个时钟,对此步骤1发呆一个时钟周期。步骤2将i指向读数据的伪函数(代码28.2),随后在步骤4保存高8位的结果,最后也顺便拉高一下CS信号。



图28.6 IRQ信号。

初期阶段(放手阶段)IRQ呈现拉高状态,如果我们不小心触碰屏幕,XTP2046便会察觉输入源发生变化,然后便会拉低IRQ信号以示触屏事件发生了,结果如图28.6所示。

对此,Verilog 可以这样描述,结果如代码28.4所示:


0:

if( !TP_IRQ ) begin ...; i &= i + 1’b1; end



1:

......

代码28.4

准备知识理解完毕以后,我们便可以开始建模了。



图28.7 Touch基础模块的建模图。

图28.7是Touch基础模块,内容包含控制模块还有功能模块。功能模块左边有两位宽的Call/Done,其中[1]为读取物理像素X,[0]为读取物理像素Y。至于右边则是一些顶层信号。控制模块的左边,除了顶层信号IRQ是输入以外,其余信号都呈现输出状态。16位宽的Data对应物理像素X还有物理像素Y,而Done则是沟通作用的触发信号。

整体来说,一旦触碰触屏,IRQ拉低,控制模块利用功能模块读取物理像素X与Y,然后再产生完成信号以示一次性的触屏结果。

touch_funcmod.v



图28.8 Touch功能模块的建模图。

图28.8是Touch功能模块的建模图,具体内容我们还是来看代码吧。


module touch_funcmod

(

input CLOCK,RESET,

output TP_CS_N,

output TP_CLK,

output TP_DI,

input TP_DO,



input [1:0]iCall,

output oDone,

output [7:0]oData

);

以上内容为相关的出入端声明。


parameter FCLK = 8'd20, FHALF = 8'd10; // 2.5Mhz 

parameter FF_Write = 6'd16, FF_Read = 6'd32;

以上内容为常量声明,内容包括2.5Mhz周期,半周期,写命令还有读数据入口地址。


reg [5:0]i,Go;

reg [11:0]D1;

reg [7:0]C1;

reg rCS,rCLK,rDI;

reg isD



always @ ( posedge CLOCK or negedge RESET )

if( !RESET )

begin

{ i,Go } &= { 6'd0, 6'd0 };

D1 &= 12'd0;

C1 &= 8'd0;

{ rCS,rCLK,rDI } &= 3'b111;

isDone &= 1'b0;

end

以上内容为相关的寄存器声明还有复位操作。


else if( iCall )

case( i )



0: // [1] Read 12bit X, [0],Read 12 bit Y

if( iCall[1] ) begin D1[7:0] &= 8'h90; i &= i + 1'b1; end

else if( iCall[0] ) begin D1[7:0] &= 8'hd0; i &= i + 1'b1; end



1: // Write byte

begin rCS &= 1'b0; i &= FF_W Go &= i + 1'b1; end



// Wait Busy 

begin

if( C1 == 0 ) rCLK &= 1'b0;

else if( C1 == FHALF ) rCLK &= 1'b1;



if( C1 == FCLK -1) begin C1 &= 8'd0; i &= i + 1'b1; end

else begin C1 &= C1 + 1'b1; end

end



3: // Read 12 bit

begin i &= FF_R Go &= i + 1'b1; end



4:

begin rCS &= 1'b1; i &= i + 1'b1; end



5:

begin isDone &= 1'b1; i &= i + 1'b1; end



6:

begin isDone &= 1'b0; i &= 6'd0; end



以上内容为该功能模块的核心操作。步骤0会根据 iCall 为 D1赋值 8’h90(读X),还是 8’hD0(读Y)。步骤1拉低CS之余也写命令,步骤2则是给足一个空时间。步骤3为读数据,步骤4拉低CS,步骤5~6则产生完成信号。


/********************/



16,17,18,19,20,21,22,23:

begin

rDI &= D1[23-i];



if( C1 == 0 ) rCLK &= 1'b0;

else if( C1 == FHALF ) rCLK &= 1'b1;



if( C1 == FCLK -1) begin C1 &= 8'd0; i &= i + 1'b1; end

else begin C1 &= C1 + 1'b1; end

end



24:

i &= Go;



步骤16~23为写一个字节。


/********************/



32,33,34,35,36,37,38,39,40,41,42,43:

begin 

if( C1 == FHALF ) D1[43-i] &= TP_DO;



if( C1 == 0 ) rCLK &= 1'b0;

else if( C1 == FHALF ) rCLK &= 1'b1;



if( C1 == FCLK -1) begin C1 &= 8'd0; i &= i + 1'b1; end

else begin C1 &= C1 + 1'b1; end

end



44:

i &= Go;



endcase



步骤32~92为读12位数据。


assign TP_CS_N = rCS;

assign TP_CLK = rCLK;

assign TP_DI = rDI;

assign oDone = isD

assign oData = D1[11:4];



endmodule

以上内容为输出驱动声明。注意第100行,oData赋值D1的高八位。

touch_ctrlmod.v



图28.9 Touch控制模块的建模图。

图28.9是Touch控制模块的建模图,基本上也没有什么好说的,具体内容让我们来看代码吧。


module touch_ctrlmod

(

input CLOCK,RESET,

input TP_IRQ,

output oDone,

output [15:0]oData,



output [1:0]oCall,

input iDone,

input [7:0]iData

);

以上内容为相关的出入端声明。


reg [5:0]i;

reg [7:0]D1,D2;

reg [1:0]isC

reg isD



always @ ( posedge CLOCK or negedge RESET )

if( !RESET )

begin

i &= 6'd0;

{ D1,D2 } &= { 8'd0,8'd0 };

isCall &= 2'd0;

isDone &= 1'b0;

end

以上内容为相关的寄存器声明还有复位操作。


else

case( i )



0:

if( !TP_IRQ ) i &= i + 1'b1; 



1: // Read X

if( iDone ) begin isCall[1] &= 1'b0; D1 &= iD i &= i + 1'b1; end

else begin
isCall[1] &= 1'b1; end



2: // Read Y

if( iDone ) begin isCall[0] &= 1'b0; D2 &= iD i &= i + 1'b1; end

else begin
isCall[0] &= 1'b1; end



3:

begin isDone &= 1'b1; i &= i + 1'b1; end



4:

begin isDone &= 1'b0; i &= 6'd0; end



endcase

以上内容为该控制模块的核心内容。步骤0用来检测 IRQ信号拉低,步骤1读取物理像素X,步骤2读取物理像素Y。步骤3~4则是用来产生完成信号。


assign oDone = isD

assign oData = {D1,D2};

assign oCall = isC



endmodule

以上内容为相关的输出驱动声明。

touch_basemod.v

有关这个模块的连线部署请参考图28.7。


module touch_basemod

(

input CLOCK,RESET,

output TP_CS_N,

output TP_CLK,

input TP_IRQ,

output TP_DI,

input TP_DO,



output oDone,

output [15:0]oData

);

wire [1:0]CallU1;



touch_ctrlmod U1

(

.CLOCK( CLOCK ),

RESET ),

.TP_IRQ( TP_IRQ ),
// & top

.oDone( oDone ),
// & top

.oData( oData ),
// & top

.oCall( CallU1 ),
// & U2

.iDone( DoneU2 ),
// & U1

.iData( DataU2 )
// & U1

);



wire DoneU2;

wire [7:0]DataU2;



touch_funcmod U2

(

.CLOCK( CLOCK ),

.RESET( RESET ),

.TP_CS_N( TP_CS_N ),
// & top

.TP_CLK( TP_CLK ),
// & top

.TP_DI( TP_DI ),
// & top

.TP_DO( TP_DO ),
// & top

.iCall( CallU1 ),
// & U1

.oDone( DoneU2 ),
// & U1

.oData( DataU2 )
// & U1

);



endmodule

以上内容为Touch基础模块的连线部署,读者自己看着办吧。



图28.10 实验二十八的建模图。

图28.10是实验二十八的建模图,首先核心操作会初始化还有清屏TFT基础模块,然后触屏信息会经由Touch基础模块传至核心操作,随后核心操作再将触屏信息作为屏幕像素写入TFT屏当中。此外,笔者也更动基础模块的绘图功能,它会将32位宽的像素X,像素Y,以及颜色信息写入其中。废话少说,让我们看看该绘图功能究竟发生什么改变呢?

tft_ctrlmod.v

6. input [7:0]iData,

首先是tft控制模块多了两个出入端的声明。


else if( iCall[2] )


case( i )



0: // X0

if( iDone ) begin isCall[2] &= 1'b0; i &= i + 1'b1; end

else begin isCall[2] &= 1'b1; D1 &= 8'h4E; D2 &= { 8'd0, iData[31:24] }; end



1: // Y0

if( iDone ) begin isCall[2] &= 1'b0; i &= i + 1'b1; end

else begin isCall[2] &= 1'b1; D1 &= 8'h4F; D2 &= { 8'd0, iData[23:16] }; end



2: // Write data to ram 0x22

if( iDone ) begin isCall[1] &= 1'b0; i &= i + 1'b1; end

else begin isCall[1] &= 1'b1; D1 &= 8'h22; end



/**********/



3: // Write color

if( iDone ) begin isCall[0] &= 1'b0; i &= i + 1'b1; end

else begin isCall[0] &= 1'b1; D2 &= [15:0]; end



/**********/



4:

begin isDone &= 1'b1; i &= i + 1'b1; end



5:

begin isDone &= 1'b0; i &= 6'd0; end



endcase

紧接着是受更动的绘图功能。步骤0根据 Data[31:24] 设置X像素,步骤1根据Data[23:16]设置Y像素,然后步骤2锁定数据该写入的地址,最后步骤3再将Data[15:0]的图像信息写进去。步骤4~5则是用来产生完成信号。读者是不是觉得很简单呢?

touch_demo.v


module touch_demo

(

input CLOCK, RESET,

output TFT_RST,

output TFT_RS,


output TFT_CS_N,


output TFT_WR_N,

output TFT_RD_N,

output [15:0]TFT_DB,



output TP_CS_N,

output TP_CLK,

input TP_IRQ,

output TP_DI,

input TP_DO

);

以上内容为相关的出入端声明。


wire DoneU1;

wire [15:0]DataU1;



touch_basemod U1

(

.CLOCK( CLOCK ),

.RESET( RESET ),

.TP_CS_N( TP_CS_N ),

.TP_CLK( TP_CLK ),

.TP_IRQ( TP_IRQ ),

.TP_DI( TP_DI ),

.TP_DO( TP_DO ),

.oDone( DoneU1 ),

.oData( DataU1 ),

);



以上内容为Touch基础模块的实例化。


wire DoneU2; 



tft_basemod U2

(

.CLOCK( CLOCK ),

.RESET( RESET ),

.TFT_RST( TFT_RST ),

.TFT_RS( TFT_RS ),

.TFT_CS_N( TFT_CS_N ),

.TFT_WR_N( TFT_WR_N ),

.TFT_RD_N( TFT_RD_N ),

.TFT_DB( TFT_DB ),

.iCall( isCall ),

.oDone( DoneU2 ),

.iData( {D1,D2,D3} ),

);



以上内容为TFT基础模块的实例化。


reg [5:0]i,Go;

reg [2:0]isC

reg [7:0]D1;

reg [8:0]D2;

reg [15:0]D3;



always @ ( posedge CLOCK or negedge RESET )

if( !RESET )

begin

{i,Go} &= { 6'd0,6'd0 };

isCall &= 3'd0;

{ D1,D2,D3 } &= { 8'd0,9d0,16'd0 };

end

else

以上内容为相关的寄存器声明还有复位操作。


case( i )



0: // Inital TFT

if( DoneU2 ) begin isCall[0] &= 1'b0; i &= i + 1'b1; end

else begin isCall[0] &= 1'b1; end



1: // Clear Screen

if( DoneU2 ) begin isCall[1] &= 1'b0; i &= i + 1'b1; end

else begin isCall[1] &= 1'b1; end



2:

if( DoneU1 ) begin i &= i + 1'b1; end



3:

if( DoneU2 ) begin isCall[2] &= 1'b0; i &= i + 1'b1;
end

else begin isCall[2] &= 1'b1; D1 &= DataU1[15:8]; D2 &= { 1'b0, DataU1[7:0] }; D3 &= 16'd0; end



4:

i &= 2;



endcase



endmodule

以上内容为核心操作。步骤0初始化TFT显示屏,步骤1则是清屏。步骤2等待Touch基础模块反馈完成,然后继续步骤。步骤3将反馈过来的X与Y以及黑色写入其中。完后,步骤步骤2~3不停来回重复。

综合完毕便下载程序,然后我们便可以用手指在屏幕上涂鸦了,虽然方向还有涂鸦大小有点暴走,那是因为物理像素对屏幕像素是不同性质的东西,结果还是视为实验成功。

细节一:完整的个体模块

本实验的Touch基础模块充其量还是半身熟的鸡蛋,因为当中缺省重要的环节,然而这个环节却是描述语言难以负担的重任。



图28.11 物理像素转换为屏幕像素的概念图。

如图28.11所示,原始的物理像素一般都包含噪声,对此物理像素必须预先经过一层滤波。滤波以后的物理像素才会开始进入转换阶段,转换阶段必须借用转换算法的力量,论道算法,想必有些同学会不经意缩紧眉心,因为我们必须向数学打交道不可。那怕对象是简单乘法或者除法,读过《时序篇》的朋友一定会晓得算法都很麻烦。

物理像素成功转换为屏幕像素以后,它还不能立即纳入使用,因为转换算法有可能存在细节上的缺失。对此,屏幕像素必须经过校正 ... 校正期间不仅有出现算法,我们还要和屏幕发生互动,实在烦死人了。现阶段而言,如果描述语言如果不及顺序语言那么便捷,什么物理像素转换屏幕像素,什么校正 ... 我们最好想也不要想,不然结果只有自讨苦吃。

虽然笔者有可能被指责为胆小鬼,不负责任之类的渣渣,对此笔者不否认,理性而言,那些危及生命的事情,笔者另可背负屈辱也要逃跑,因为没有什么东西比生命更可贵。此刻,只要承认懦弱,我们才会安全成长,未来的事情就让未来的自己去打算吧!少年少女们!

细节二:时序参数

老实说,笔者也觉得懦弱的自己太没出息了 ... 不过,作为补偿,让我们来瞧瞧硬件XTP2046的时序参数吧。



图28.11 XTP2046 的物理时序图。

图28.11是从官方手册哪里拷贝过来的物理时序图,这张图虽然有可能是吓跑小朋友的虎姑婆 ... 不过,我们只要习惯以后,它也可能是弱小的小虎猫。换之,表28.2是各个时序参数的详细信息。

表28.2 时序参数的详细信息。










DIN在 DCLK上升沿前生效








DIN 保持在DCLK高电平后








DCLK 下降沿到 DOUT生效








CS 下降沿到 DOUT 使能








CS 上升沿到 DOUT禁止








CS 下降沿到第一个 DCLK 上升沿








CS 上升沿到 DCLK被忽略








DCLK 高电平








DCLK低电平








DCLK下降沿到 BUSY上升/下降








CS 下降沿到 BUSY 使能








CS 上升沿到BUSY 禁止








图28.11 DCLK相关的时序参数。

首先是时序第一员的TCH 还有TCL,如图28.11所示,TBD+TCL+ TBD+TCH造就一个时钟周期。根据表28.2所示,由于TBD最小为0ns,所以可以无视(TBD可以视为上山信号还有下上信号)。对此,造就一个时钟周期的成分只有TCH+TCL,而且两者最小皆是200ns,所以最高速率是:

1/(200ns + 200ns) = 2.5Mhz

话虽如此,这仅仅是手册给出的安全速率,如果读者是一名头文字D的死粉,读者随时都可以驾驶藤原豆腐车超频。



图28.12 CS相关的时序参数。

接下来让我们看看 TCSS 还有 TCSH,前者可以视为CS拉低所需的最小时间,后者则是CS拉高所需的最小时间。前者需要100ns,后者则是10ns,如果无法满足它们,CS的有效性就会存在风险。话虽如此,因为手册比较怕死,所以参数略显保险(夸张),我们只要随便应付就好。



图28.13 数据相关的时序参数(主机视角)。

再者就是TDS还有TDH,前者是典型的setup要求,后者则是hold要求,只要两者得到满足,数据打入寄存器才能得到确保。首先,读者必须注意一下图28.13是主机视角的写时序(从机读数据),所以Data是主机发给从机的食物。饿昏的从机会借用上升沿锁存时序,此刻只要 TBD+TCL 大于 TDS,又或者 TBD+TCH大于 TDH,数据就会成功被锁存。

根据表28.2所示,TDS是100ns,TDH则是50ns,换之TBD+TCL是200ns,TBD+TCH则是200ns。简单来说,TDS还有TDH都无法完全覆盖数据,结果数据的有效性是得到人头担保的。



图28.14 数据相关的时序参数(主机视角)。

图28.14还是数据相关的时序参数,不过方向是从机给主机发送数据,当从机借由下降沿设置数据的时候,必须被TDO拖后腿诺干时间。根据理想时序(左图),TDO只是单纯覆盖Data而已 ... 反之,右图的物理时序则会推挤Data。根据表28.2所示,TDO最大有可能拖后腿半个周期,反过来就是不拖任何后腿。活着就要乐观一点,凡事都往好的方向去想,所以我们可以无视TDO。

最后还有一些仅是与CS信号扯上关系的小啰嗦,如TDV,TTR等参数。我们仅要读写数据之前死拉高CS不放,读写数据之间死拉低CS不放,然后读写数据之后又死拉高CS不放,我们就能成功打发它们。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 tcl a996驱动 的文章

 

随机推荐