|
联系 收藏 回复 编辑 删除
如何进行ads7843触摸屏的调试??
我采用ads7843进行触摸屏数据转换,DOUT脚始终是高电平,采集的数据始终是同样的值8190,8190(12位 最大值)
郁闷中 ,不知如何解决,请用过ads7843的朋友指点一二。
下面是程序中读ads7843数据部分。
// A/D 通道选择命令字和工作寄存器
#define CHX 0x90 //通道Y+的选择控制字
#define CHY 0xD0 //通道X+的选择控制字
#define TP_DCLK(a) outw((inw(S3C44B0X_PDATF) &(~(1<<8)) ) | ((a&1<<8),S3C44B0X_PDATF) //GPF8
#define TP_CS(a) outw((inw(S3C44B0X_PDATF) &(~(1<<7)) ) | ((a&1)<<7),S3C44B0X_PDATF) //GPF7
#define TP_DIN(a) outw((inw(S3C44B0X_PDATF) &(~(1<<6)) ) | ((a&1)<<6),S3C44B0X_PDATF) //GPF6
//读ADS7843的I/O控制口
#define TP_DOUT ((inw(S3C44B0X_PDATF)>>5) & 0x1) //GPF5
#define TP_IRQ ((inb(S3C44B0X_PDATG)>>2) & 0x1) //TP_IRQ-----ExINT2(GPG2)
static void ads7843_Start( void )
{
TP_CS(1);
TP_DCLK(0);
TP_CS(0);
TP_DIN(1);
TP_DCLK(1);
}
static void ads7843_Write ( unsigned char cmd )/*实际上写命令字*/
{
unsigned char i,temp;
temp=0x80;
TP_DCLK(0);
for( i = 0; i < 8; i++ )
{
/*将控制字分解成位传入ads7843,从而ads7843发送命令*/
if(cmd&temp)
{
TP_DIN(1);
printk("1 ");
}
else
{
TP_DIN(0);
printk("0 ");
}
/*软件模拟一个CLK,将一位送出,总共送8位,所以总共循环产生了8个时钟*/
TP_DCLK(1); /*DCLK置高*/
for( j = 0; j < 25; j++ ); //200ns
TP_DCLK(0); /*DCLK清0*/
for( j = 0; j < 25; j++ ); //200ns
//为送下一位准备
temp=temp>>1;
}
return ;
}
/*读数据*/
static unsigned short ads7843_Read ( void )
{
unsigned short ack = 0 ;
unsigned char i;
for( i = 0; i < 12; i++ )
{
TP_DCLK(1);
for( j = 0; j < 25; j++ ); //200ns
TP_DCLK(0);
for( j = 0; j < 5; j++ ); /*时钟下降沿读取*/
if(TP_DOUT)
ack +=1;
// printk("%x ",TP_DOUT);
for( j = 0; j < 20; j++ ); //200ns
ack=ack<<1;
}
for( i = 0; i < 4; i++ )
{
TP_DCLK(1);
for( j = 0; j < 25; j++ ); //200ns
TP_DCLK(0);
for( j = 0; j < 25; j++ ); //200ns
}
TP_DCLK(0);
printk("ack=%d \n",ack);
return ack;
}
static void ads7843_get_XY(void)
{
ads7843_Start() ;
for( j = 0; j < 5; j++ ); //40ns
ads7843_Write( CHX ) ;
//延时200ns等待数据转换
for( j = 0; j < 25; j++ ); //200ns
X= ads7843_Read() ;
ads7843_Write( CHY ) ;
for( j = 0; j < 25; j++ ); //200ns
Y= ads7843_Read() ;
TP_CS(1); //芯片禁止
}
//I/O初始化
static void s3c44b0_IO_init(void)
{
/*配置与ADS7843 相连的I/O端口 output : PF5,PG3; inputGF6,PF7,PF8 ;ads7843 busy 线没用*/
unsigned int val32;
unsigned short val16;
/*配置F 端口*/
/*-------------------------*/
/* configuration of PCONF */
/*-------------------------*/
val32=inl(S3C44B0X_PCONF);
outl((val32&0xFFC003FF)|0xFFC923FF, S3C44B0X_PCONF); /* config GPF5 input ; GPF6 GPF7 GPE8 output */
/*-------------------------*/
/* configuration of PUPF */
/*-------------------------*/
val16 =inb(S3C44B0X_PUPF)&0xFE1F;
outw(val16|0xFFDF, S3C44B0X_PUPF); /* config GPF5 activate pull up GPF5 上拉电阻使能,GPF6,GPF7,GPF8 disable */
}
|
|