#include "TSC2046_spi.h" #include "mapp_gpio.h" #include "main.h" static uint16_t TSC2046_ReadByte(uint8_t value); static uint8_t TSC2046_SendByte(uint8_t value); static uint8_t TSC2046_Read_Position(uint16_t *X_Position, uint16_t *Y_Position); T_TP_CFG gtTp ={0}; /* 触摸控制器连接到MCU的管教配置 */ void TSC2046_PinConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIO clocks */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /************PA****************** PA0------------------RTP_SDO PA1----------------- CTP_RST PA2------------------TX1 PA3------------------ RX1 PA4------------------BATT_CHARG_DET PA5------------------REMOTE_OUT PA6------------------RF_DIN PA7------------------MCU_SCL PA9------------------MCU_SDA PA10---------------- TCP_INT 检测触摸按键按下 PA13---------------- PA14---------------- ****************************************/ //CTP_RST 通用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GpioSpiCSCfg(SET); /* Disable TP CS PA1 */ //PA7->SCK, PA9->MOSI 复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GpioSpiSclCfg(SET); GpioMOSICfg(SET); // PA0->MISO;PA10 PENINQ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); } /* 如果PENIRQ线有效且读取的坐标在正常范围内则返回1,否则返回0 */ uint8_t TSC2046_Read_Single(uint16_t *X_Position, uint16_t *Y_Position) { uint16_t X1,Y1; uint16_t x1,x2,y1,y2; uint8_t t,t1,count=0; uint16_t databuffer[2][TSC2046_GetCounts];//数据组 uint16_t temp=0; while( (!TP_GetIRQStatus()) && count databuffer[0][t+1] )//升序排列 { temp=databuffer[0][t+1]; databuffer[0][t+1]=databuffer[0][t]; databuffer[0][t]=temp; t1=1; } } }while(t1); do//将数据Y升序排列 { t1=0; for(t=0;tdatabuffer[1][t+1])//升序排列 { temp=databuffer[1][t+1]; databuffer[1][t+1]=databuffer[1][t]; databuffer[1][t]=temp; t1=1; } } }while(t1); x1=databuffer[0][TSC2046_GetCounts/2-1]; x2=databuffer[0][TSC2046_GetCounts/2]; //x3=databuffer[0][8]; y1=databuffer[1][TSC2046_GetCounts/2-1]; y2=databuffer[1][TSC2046_GetCounts/2]; //y3=databuffer[1][8]; if( ((x1>x2)&&(x1>x2+30)) || ((x2>x1)&&(x2>x1+30)) || ((y1>y2)&&(y1>y2+30)) || ((y2>y1)&&(y2>y1+30)) ) return 0; /* 数据离散性太大,丢弃 */ else { X1=(databuffer[0][TSC2046_GetCounts/2-1]+databuffer[0][TSC2046_GetCounts/2])/2; Y1=(databuffer[1][TSC2046_GetCounts/2-1]+databuffer[1][TSC2046_GetCounts/2])/2; if(X1<=4096&&Y1<=4096) //12位采样最大值 { (*X_Position)=X1; (*Y_Position)=Y1; return 1; } return 0; /* 数据最大值大于4096,丢弃 */ } }//if(count== GetCounts) return 0; /* 采集数据次数不足,丢弃 */ } /*向触摸屏IC写数值*/ /* 发送一个字节到XPT2046 */ static uint8_t TSC2046_SendByte(uint8_t num) { uint8_t count=0; for(count=0;count<8;count++) { if(num&0x80) { GpioMOSICfg(SET);} else { GpioMOSICfg(RESET);} num<<=1; GpioSpiSclCfg(RESET); SysDelayUs(1); GpioSpiSclCfg(SET); } } //从触摸屏IC读取的数值 /* 发送一个字节到XPT2046并从XPT2046读取一个字节 */ static uint16_t TSC2046_ReadByte(uint8_t value) { uint8_t count=0; uint16_t Num=0; GpioSpiSclCfg(RESET); GpioMOSICfg(RESET); GpioSpiCSCfg(RESET); TSC2046_SendByte(value); //LT_TpDelay();//ADS7846????????6us SysDelayUs(6); GpioSpiSclCfg(RESET); SysDelayUs(6); GpioSpiSclCfg(SET); SysDelayUs(6); GpioSpiSclCfg(RESET); for(count=0;count<16;count++)//??16???,???12??? { Num<<=1; GpioSpiSclCfg(RESET); SysDelayUs(6); GpioSpiSclCfg(SET); if(MISO_DOUT)Num++; } Num>>=4; //???12???. GpioSpiCSCfg(SET); return(Num); } /* 等检测到触摸中断后调用此函数读取位置,读数正确返回1,否则返回0 */ static uint8_t TSC2046_Read_Position(uint16_t *X_Position, uint16_t *Y_Position) { uint16_t temp; TP_CS_LOW(); //delay_ms(1); SysDelayUs(200); TSC2046_ReadByte( TSC2046_CMD_CHY ) ; //delay_ms(1); SysDelayUs(200); // while(TP_GetBusyStatus()); //等待busy信号变低 temp= TSC2046_ReadByte(0x00) ; temp<<= 8; temp|= TSC2046_ReadByte(0x00) ; (*Y_Position) = temp >> 3; (*Y_Position) &=0x0FFF; TP_CS_HIGH(); TP_CS_LOW(); //delay_ms(1); SysDelayUs(200); TSC2046_ReadByte( TSC2046_CMD_CHX ) ; while(TP_GetBusyStatus()); //等待busy信号变低 //delay_ms(1); SysDelayUs(200); temp= TSC2046_ReadByte(0x00) ; temp<<= 8; temp|= TSC2046_ReadByte(0x00) ; (*X_Position) = temp >> 3; (*X_Position) &=0x0FFF; TP_CS_HIGH(); /* 限制一个范围,如果在范围之内,返回1,不然返回0 */ if((*X_Position)>100 && (*Y_Position)>100 && (*X_Position)<4000 && (*Y_Position)<4000) return 1;//读数成功(范围限制) else return 0; } /* PENIRQ中断线配置,下降沿中断 */ void TSC2046_EXIT_Init(void)//中断设置下降沿 { EXTI_InitTypeDef EXTI_InitStructure; /* Connect Button EXTI Line to Button GPIO Pin */ // GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource10); /* Configure Button EXTI line */ EXTI_InitStructure.EXTI_Line = EXTI_Line10; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); } /* NVIC配置 */ void TSC2046_NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; //RCC_ClocksTypeDef RCC_Clocks; // RCC_GetClocksFreq(&RCC_Clocks); /* Set the Vector Table base address at 0x08000000 */ // NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000); /* Configure the Priority Group to 2 bits */ // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); /* Enable the EXTI5 Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn; NVIC_InitStructure.NVIC_IRQChannelPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } /* 添加到中断处理程序中 */ void TSC2046_IntProccess(void) { if(EXTI_GetITStatus(EXTI_Line10) != RESET) { //TSC2046_Read_Position(X_Position , Y_Position); gtTp.tpLedflag =1; if (gtTp.tpflag ==0) { gtTp.tpflag =1; TP_Read_XY(); } // printf("\r\n触摸值 X: %d Y: %d\r\n",X_Addata,Y_Addata); EXTI_ClearITPendingBit(EXTI_Line10); } } #define READ_TIMES 8 //读取次数 //8 #define LOST_VAL 2 //丢弃值 #define CMD_RDX 0XD0 #define CMD_RDY 0X90 uint16_t TP_Read_XOY(uint8_t xy) { uint16_t i, j; uint16_t buf[READ_TIMES]; uint16_t sum=0; uint16_t temp; for(i=0;ibuf[j])//???? { temp=buf[i]; buf[i]=buf[j]; buf[j]=temp; } } } sum=0; for(i=LOST_VAL;i4000) || (gtTp.rf_Y_add >4000)) { gtTp.tpflag =0; return 0; } else { gtTp.tpflag =1; return 1; } return 1; } void TP_TASK(void) { static uint16_t wcnt =0; switch (gtTp.tpstate) { case 0: gtTp.tpstate ++; wcnt =0; break; case 1: wcnt =0; gtTp.tpstate ++; gtTp.rf_X_add=TP_Read_XOY(CMD_RDX); gtTp.rf_Y_add=TP_Read_XOY(CMD_RDY); break; case 2: gtTp.tpstate ++; break; case 3: gtTp.u16cnt ++; if (gtTp.tpflag ) { gtTp.rf_tp[0] = gtTp.rf_X_add ; gtTp.rf_tp[1] = gtTp.rf_Y_add ; wcnt ++; TP_Read_XY(); //dwdtest if( (( gtTp.rf_tp[0]>gtTp.rf_X_add)&&(gtTp.rf_tp[0]>gtTp.rf_X_add+80)) || ((gtTp.rf_X_add>gtTp.rf_tp[0])&&(gtTp.rf_X_add>gtTp.rf_tp[0]+80)) || (( gtTp.rf_tp[1]>gtTp.rf_Y_add)&&(gtTp.rf_tp[1]>gtTp.rf_Y_add+80)) || ((gtTp.rf_Y_add>gtTp.rf_tp[1])&&(gtTp.rf_Y_add>gtTp.rf_tp[1]+80) ) ) { gtTp.rf_X_add=TP_Read_XOY(CMD_RDX); gtTp.rf_Y_add=TP_Read_XOY(CMD_RDY); // U16TESTCNT2 ++; if (wcnt >5) { wcnt =0; gtTp.tpflag =0; // U16TESTCNT3 ++; } } else { wcnt =0; gtTp.tpflag =0; gtTp.tf_X_Y_add = gtTp.rf_X_add <<12; gtTp.tf_X_Y_add |= (gtTp.rf_Y_add &0xfff); if( (gtTp.rf_X_add<100) || (gtTp.rf_Y_add<100) || (gtTp.rf_X_add>4000) || (gtTp.rf_Y_add >4000)) { return; } if ((gtArm.Call_Sx1276_State >= 8) || (gtArm.Call_Sx1276_State < 4)) { gtArm.CallState = CALL_START; gtArm.Call_Sx1276_State = 4; gtArm.rf_stp = 0x80; // U16TESTCNT1 ++; } } } // gtTp.tpstate ++; break; } }