打印

请教,触摸屏示波器读的数据和I/O上读的数据不一致

[复制链接]
2068|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lekedwm 于 2011-8-3 08:54 编辑

用的是ads7846,控制器用的是dsp2810,时序和规格书上的差不多,但是观察到的输出波形与实际得到的数据不一致我将I/O的数据直接显示在LCD上,LCD上的数据是,X坐标为3024 ,Y坐标为1009

相关帖子

沙发
lekedwm|  楼主 | 2011-8-3 08:52 | 只看该作者
本帖最后由 lekedwm 于 2011-8-3 08:56 编辑

file:///D:/SAM_0518.JPG

1,表示时钟的波形
2,输出数据波形
3,读状态即BUSY的波形
4,输入波形

SAM_0518.JPG (66.86 KB )

SAM_0518.JPG

使用特权

评论回复
板凳
lekedwm|  楼主 | 2011-8-3 08:54 | 只看该作者
大家帮忙看一下,谢谢了,ADS7846的读写程序如下
//写数据到7846
void Write7846(unsigned int Data)
{
  McbspaRegs.DXR1.all=Data;
  while(McbspaRegs.SPCR2.bit.XRDY !=1);  //等待数据从RBR复制到DRR
}
//从7846中读数据,需要16个时钟信号
unsigned int Read7846(void)
{
  unsigned int data,data1,data2;
   
  McbspaRegs.DXR1.all=0x00;   //提供接受数据时钟用的
  while(McbspaRegs.SPCR2.bit.XRDY !=1);  //等待数据发送完
// while(McbspaRegs.SPCR1.bit.RRDY !=1);  //等待数据从RBR复制到DRR
  data1= McbspaRegs.DRR1.all;     //从DRR中读取数据
  Delay_1us(5);
  McbspaRegs.DXR1.all=0x00;   //提供接受数据时钟用的
  while(McbspaRegs.SPCR2.bit.XRDY !=1);  //等待数据发送完
// while(McbspaRegs.SPCR1.bit.RRDY !=1);  //等待数据从RBR复制到DRR
  data2= McbspaRegs.DRR1.all;     //从DRR中读取数据
  Delay_1us(5);
  data1=data1&(0x0ff);
  data2=data2&(0x0f0);
  data=((data1<<8)+data2)>>4;
  return data;
}

使用特权

评论回复
地板
lekedwm|  楼主 | 2011-8-3 09:20 | 只看该作者
ADS7846处理程序如下:
void ADS7846(void)
{
    static unsigned char poscount=0;  //测量坐标计数
    static unsigned char r=0;
    unsigned int x[6];
unsigned int y[6];
    int xTemp=0,yTemp=0;
int x0,x1,x2,x3,x4,x5;
int y0,y1,y2,y3,y4,y5;
    unsigned int xmin,xmax,ymin,ymax;
    unsigned char i;
    GpioDataRegs.GPFSET.bit.GPIOF9=1;    //SPICE脚输出高电平,触摸屏的SPI口被选上
    GpioDataRegs.GPFCLEAR.bit.GPIOF10=1;  //SS脚输出电平拉低SS脚拉低这样经过138后选择TCS,即触摸片选为低电平
   
   // Delay_1us(10);
    Write7846(0xd0);   //输入测量X坐标命令字
    Delay_1us(30);
    xpos[poscount]=Read7846();
        
    Delay_1us(10);
    Write7846(0x90);   //输入测量Y坐标命令字
    Delay_1us(30);
    ypos[poscount]=Read7846();
    Delay_1us(30);
    GpioDataRegs.GPFSET.bit.GPIOF10=1;   //SS脚拉高,导致TCS脚为高电平,即ADS7846没有被选上
    poscount++;
   
    if(poscount>6)
   {
    poscount=0;
x[0]=xpos[0]; x[1]=xpos[1]; x[2]=xpos[2]; x[3]=xpos[3]; x[4]=xpos[4]; x[5]=xpos[5];
    y[0]=ypos[0]; y[1]=ypos[1]; y[2]=ypos[2]; y[3]=ypos[3]; y[4]=ypos[4]; y[5]=ypos[5];
   
    x0=x[0];x1=x[1];x2=x[2];x3=x[3];x4=x[4];x5=x[5];
    y0=y[0];y1=y[1];y2=y[2];y3=y[3];y4=y[4];y5=y[5];
    xmin=x[0];xmax=x[0];ymin=y[0];ymax=y[0];
    for(r=1;r<6;r++)
    {  
     if(x[r]<xmin)
        xmin=x[r];
     if(x[r]>xmax)
        xmax=x[r];
     if(y[r]<ymin)
         ymin=y[r];
     if(y[r]>ymax)
        ymax=y[r];
    };
    xTemp=(x0+x1+x2+x3+x4+x5-xmin-xmax)/4;
    yTemp=(y0+y1+y2+y3+y4+y5-ymin-ymax)/4;
   
    WriteLcd(0x46,1);       //显示光标地址
    WriteLcd(0x0000&0xff,0);          //低八位光标地址
    WriteLcd((0x0000>>8)&0xff,0);     //高八位光标地址
    WriteLcd(0x42,1);
    for(i=0;i<4;i++)WriteLcd(0x00,0);
BtoOC_show(0x0000,xTemp);

WriteLcd(0x46,1);       //显示光标地址
    WriteLcd(0x0028&0xff,0);          //低八位光标地址
    WriteLcd((0x0028>>8)&0xff,0);     //高八位光标地址
    WriteLcd(0x42,1);
for(i=0;i<4;i++)WriteLcd(0x00,0);
BtoOC_show(0x0028,yTemp);
   // pos_show(0x0000,xTemp);
   // pos_show(0x0028,yTemp);
    LCDX=5*xTemp;
    LCDX>>=6;       //x方向坐标=(320*xTemp)/4096
   
    LCDY=15*yTemp;
    LCDY>>=8;       //y方向坐标=(240*yTemp)/4096
   };
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

31

帖子

1

粉丝