天天看点

五点触摸屏的实现

原理图的理解

五点触摸屏的实现

它通过四根线连接在底板上,其中这四根的线连接的的是一个管理触摸屏,其中

EINT14:是一个普通的是gpio接口,他和按键一样,可以产生一个外部中断

nRESET: 他是一个复位引脚

SDA2:i2c的数据总线

SCL2:i2c的时钟总线

五点触摸屏的实现

通过电平转换芯片,连接到主板上

五点触摸屏的实现

i2c控制原理

五点触摸屏的实现

发数据的时候,第一个数据是主机开始选择从机,第一个数据是第一个自己的地址,第二个数据是从机的地址,一次八位数据,所有的停止和开始都是主机说了算

五点触摸屏的实现

写的时候,主机申请读信号,从机开始发送,然后主机开始响应

寄存器的配置
五点触摸屏的实现

通过I2C控制器对对数据进行管理,其中I2CSTAT这个寄存器前四位是使能收发,后四位是状态位ui

五点触摸屏的实现

上面的图描述的是我们对数据读取的流程,我们通过操作寄存器来对他进行读写

int read_data(char *data, int len)
 {

     int i, ret = -1;
     //参照数据帧格式,从机地址放7-1位,读写方向放1位
    //I2CADD1 = (DEV_ADDR <<1) | 1<<0;
    I2CDS1 = (DEV_ADDR <<1) | 1<<0;
    //写0XB0到I2CSTAT 开始读取数据
    I2CSTAT1 = 0XB0;
    //需要进行防错判断
    if (wait_until_iic_irq() < 0)
    {
        goto END;
    }
    if (I2CSTAT1 & 0x1)
    {
        ret = -2; //有连接但无应答
        goto END;
    }
    for ( i = 0; i < len; i++)
    {
        clr_iic_int();
        if (wait_until_iic_irq() < 0)
        {
            goto END;
        }
        data[i] = I2CDS1;
    }
           
void do_tp(void)
{
    int i;
    char data[32];
    //清中断
    EXT_INT41_PEND = EXT_INT41_PEND;
    if (read_data(data, sizeof(data))== -2)
    {
        if (read_data(data, sizeof(data))== -2)
        {
            printf("no ack\n");
            return;
        }
        
    }
    
    if (data[2] <= 0)
    {
        return;
    }
    printf("\rpoints_count=%d\n",data[2]);

    for ( i = 0; i < data[2]; i++)
    {
        printf("x%d=%d,y%d=%d;", i, ((data[i*6+3]&0xf<<8) | (data[i*6+4])),\
        i,((data[i*6+5]&0xf<<8) | (data[i*6+6])) );
    }
    printf("\n\n%d\n",(data[3]>>6)&0x3);
    printf("\n");
       
}