123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- #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<TSC2046_GetCounts )//循环读数XPT2046_GetCounts次
- {
- if(TSC2046_Read_Position( &databuffer[0][count], &databuffer[1][count]) )
- {
- count++; /* 读数成功才计数 */
- }
- }
- if(count== TSC2046_GetCounts)//一定要读到XPT2046_GetCounts次数据,否则丢弃
- {
- // while(!TP_GetIRQStatus()); //添加这句等待触摸释放
- do//将数据X升序排列
- {
- t1=0;
- for(t=0;t<count-1;t++)
- {
- if( databuffer[0][t]> 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;t<count-1;t++)
- {
- if(databuffer[1][t]>databuffer[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;i<READ_TIMES;i++){
-
- buf[i]= TSC2046_ReadByte(xy);
- }
- for(i=0;i<READ_TIMES-1; i++)//??
- {
- for(j=i+1;j<READ_TIMES;j++)
- {
- if(buf[i]>buf[j])//????
- {
- temp=buf[i];
- buf[i]=buf[j];
- buf[j]=temp;
- }
- }
- }
- sum=0;
- for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];
- temp=sum/(READ_TIMES-2*LOST_VAL);
- return temp;
- }
- //读取XY坐标
- uint8_t TP_Read_XY(void)
- {
- gtTp.rf_X_add=TP_Read_XOY(CMD_RDX);
- gtTp.rf_Y_add=TP_Read_XOY(CMD_RDY);
- if( (gtTp.rf_X_add<100) || (gtTp.rf_Y_add<100) || (gtTp.rf_X_add>4000) || (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;
-
- }
-
- }
|