TSC2046_spi.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. #include "TSC2046_spi.h"
  2. #include "mapp_gpio.h"
  3. #include "main.h"
  4. static uint16_t TSC2046_ReadByte(uint8_t value);
  5. static uint8_t TSC2046_SendByte(uint8_t value);
  6. static uint8_t TSC2046_Read_Position(uint16_t *X_Position, uint16_t *Y_Position);
  7. T_TP_CFG gtTp ={0};
  8. /* 触摸控制器连接到MCU的管教配置 */
  9. void TSC2046_PinConfig(void)
  10. {
  11. GPIO_InitTypeDef GPIO_InitStructure;
  12. /* Enable GPIO clocks */
  13. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  14. /************PA******************
  15. PA0------------------RTP_SDO
  16. PA1----------------- CTP_RST
  17. PA2------------------TX1
  18. PA3------------------ RX1
  19. PA4------------------BATT_CHARG_DET
  20. PA5------------------REMOTE_OUT
  21. PA6------------------RF_DIN
  22. PA7------------------MCU_SCL
  23. PA9------------------MCU_SDA
  24. PA10---------------- TCP_INT 检测触摸按键按下
  25. PA13----------------
  26. PA14----------------
  27. ****************************************/
  28. //CTP_RST 通用推挽输出
  29. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  30. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  31. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  32. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  33. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  34. GPIO_Init(GPIOA, &GPIO_InitStructure);
  35. GpioSpiCSCfg(SET); /* Disable TP CS PA1 */
  36. //PA7->SCK, PA9->MOSI 复用推挽输出
  37. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_7;
  38. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  39. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  41. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  42. GPIO_Init(GPIOA, &GPIO_InitStructure);
  43. GpioSpiSclCfg(SET);
  44. GpioMOSICfg(SET);
  45. // PA0->MISO;PA10 PENINQ
  46. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  47. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  48. GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  49. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  51. GPIO_Init(GPIOA, &GPIO_InitStructure);
  52. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  53. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  54. GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  55. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  57. GPIO_Init(GPIOA, &GPIO_InitStructure);
  58. }
  59. /* 如果PENIRQ线有效且读取的坐标在正常范围内则返回1,否则返回0 */
  60. uint8_t TSC2046_Read_Single(uint16_t *X_Position, uint16_t *Y_Position)
  61. {
  62. uint16_t X1,Y1;
  63. uint16_t x1,x2,y1,y2;
  64. uint8_t t,t1,count=0;
  65. uint16_t databuffer[2][TSC2046_GetCounts];//数据组
  66. uint16_t temp=0;
  67. while( (!TP_GetIRQStatus()) && count<TSC2046_GetCounts )//循环读数XPT2046_GetCounts次
  68. {
  69. if(TSC2046_Read_Position( &databuffer[0][count], &databuffer[1][count]) )
  70. {
  71. count++; /* 读数成功才计数 */
  72. }
  73. }
  74. if(count== TSC2046_GetCounts)//一定要读到XPT2046_GetCounts次数据,否则丢弃
  75. {
  76. // while(!TP_GetIRQStatus()); //添加这句等待触摸释放
  77. do//将数据X升序排列
  78. {
  79. t1=0;
  80. for(t=0;t<count-1;t++)
  81. {
  82. if( databuffer[0][t]> databuffer[0][t+1] )//升序排列
  83. {
  84. temp=databuffer[0][t+1];
  85. databuffer[0][t+1]=databuffer[0][t];
  86. databuffer[0][t]=temp;
  87. t1=1;
  88. }
  89. }
  90. }while(t1);
  91. do//将数据Y升序排列
  92. {
  93. t1=0;
  94. for(t=0;t<count-1;t++)
  95. {
  96. if(databuffer[1][t]>databuffer[1][t+1])//升序排列
  97. {
  98. temp=databuffer[1][t+1];
  99. databuffer[1][t+1]=databuffer[1][t];
  100. databuffer[1][t]=temp;
  101. t1=1;
  102. }
  103. }
  104. }while(t1);
  105. x1=databuffer[0][TSC2046_GetCounts/2-1]; x2=databuffer[0][TSC2046_GetCounts/2]; //x3=databuffer[0][8];
  106. y1=databuffer[1][TSC2046_GetCounts/2-1]; y2=databuffer[1][TSC2046_GetCounts/2]; //y3=databuffer[1][8];
  107. if( ((x1>x2)&&(x1>x2+30)) || ((x2>x1)&&(x2>x1+30)) || ((y1>y2)&&(y1>y2+30)) || ((y2>y1)&&(y2>y1+30)) )
  108. return 0; /* 数据离散性太大,丢弃 */
  109. else
  110. {
  111. X1=(databuffer[0][TSC2046_GetCounts/2-1]+databuffer[0][TSC2046_GetCounts/2])/2;
  112. Y1=(databuffer[1][TSC2046_GetCounts/2-1]+databuffer[1][TSC2046_GetCounts/2])/2;
  113. if(X1<=4096&&Y1<=4096) //12位采样最大值
  114. {
  115. (*X_Position)=X1;
  116. (*Y_Position)=Y1;
  117. return 1;
  118. }
  119. return 0; /* 数据最大值大于4096,丢弃 */
  120. }
  121. }//if(count== GetCounts)
  122. return 0; /* 采集数据次数不足,丢弃 */
  123. }
  124. /*向触摸屏IC写数值*/
  125. /* 发送一个字节到XPT2046 */
  126. static uint8_t TSC2046_SendByte(uint8_t num)
  127. {
  128. uint8_t count=0;
  129. for(count=0;count<8;count++)
  130. {
  131. if(num&0x80) { GpioMOSICfg(SET);}
  132. else { GpioMOSICfg(RESET);}
  133. num<<=1;
  134. GpioSpiSclCfg(RESET);
  135. SysDelayUs(1);
  136. GpioSpiSclCfg(SET);
  137. }
  138. }
  139. //从触摸屏IC读取的数值
  140. /* 发送一个字节到XPT2046并从XPT2046读取一个字节 */
  141. static uint16_t TSC2046_ReadByte(uint8_t value)
  142. {
  143. uint8_t count=0;
  144. uint16_t Num=0;
  145. GpioSpiSclCfg(RESET);
  146. GpioMOSICfg(RESET);
  147. GpioSpiCSCfg(RESET);
  148. TSC2046_SendByte(value);
  149. //LT_TpDelay();//ADS7846????????6us
  150. SysDelayUs(6);
  151. GpioSpiSclCfg(RESET);
  152. SysDelayUs(6);
  153. GpioSpiSclCfg(SET);
  154. SysDelayUs(6);
  155. GpioSpiSclCfg(RESET);
  156. for(count=0;count<16;count++)//??16???,???12???
  157. {
  158. Num<<=1;
  159. GpioSpiSclCfg(RESET);
  160. SysDelayUs(6);
  161. GpioSpiSclCfg(SET);
  162. if(MISO_DOUT)Num++;
  163. }
  164. Num>>=4; //???12???.
  165. GpioSpiCSCfg(SET);
  166. return(Num);
  167. }
  168. /* 等检测到触摸中断后调用此函数读取位置,读数正确返回1,否则返回0 */
  169. static uint8_t TSC2046_Read_Position(uint16_t *X_Position, uint16_t *Y_Position)
  170. {
  171. uint16_t temp;
  172. TP_CS_LOW();
  173. //delay_ms(1);
  174. SysDelayUs(200);
  175. TSC2046_ReadByte( TSC2046_CMD_CHY ) ;
  176. //delay_ms(1);
  177. SysDelayUs(200);
  178. // while(TP_GetBusyStatus()); //等待busy信号变低
  179. temp= TSC2046_ReadByte(0x00) ;
  180. temp<<= 8;
  181. temp|= TSC2046_ReadByte(0x00) ;
  182. (*Y_Position) = temp >> 3;
  183. (*Y_Position) &=0x0FFF;
  184. TP_CS_HIGH();
  185. TP_CS_LOW();
  186. //delay_ms(1);
  187. SysDelayUs(200);
  188. TSC2046_ReadByte( TSC2046_CMD_CHX ) ;
  189. while(TP_GetBusyStatus()); //等待busy信号变低
  190. //delay_ms(1);
  191. SysDelayUs(200);
  192. temp= TSC2046_ReadByte(0x00) ;
  193. temp<<= 8;
  194. temp|= TSC2046_ReadByte(0x00) ;
  195. (*X_Position) = temp >> 3;
  196. (*X_Position) &=0x0FFF;
  197. TP_CS_HIGH();
  198. /* 限制一个范围,如果在范围之内,返回1,不然返回0 */
  199. if((*X_Position)>100 && (*Y_Position)>100 && (*X_Position)<4000 && (*Y_Position)<4000)
  200. return 1;//读数成功(范围限制)
  201. else
  202. return 0;
  203. }
  204. /* PENIRQ中断线配置,下降沿中断 */
  205. void TSC2046_EXIT_Init(void)//中断设置下降沿
  206. {
  207. EXTI_InitTypeDef EXTI_InitStructure;
  208. /* Connect Button EXTI Line to Button GPIO Pin */
  209. // GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource10);
  210. SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource10);
  211. /* Configure Button EXTI line */
  212. EXTI_InitStructure.EXTI_Line = EXTI_Line10;
  213. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  214. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  215. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  216. EXTI_Init(&EXTI_InitStructure);
  217. }
  218. /* NVIC配置 */
  219. void TSC2046_NVIC_Config(void)
  220. {
  221. NVIC_InitTypeDef NVIC_InitStructure;
  222. //RCC_ClocksTypeDef RCC_Clocks;
  223. // RCC_GetClocksFreq(&RCC_Clocks);
  224. /* Set the Vector Table base address at 0x08000000 */
  225. // NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0000);
  226. /* Configure the Priority Group to 2 bits */
  227. // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  228. /* Enable the EXTI5 Interrupt */
  229. NVIC_InitStructure.NVIC_IRQChannel = EXTI4_15_IRQn;
  230. NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  231. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  232. NVIC_Init(&NVIC_InitStructure);
  233. }
  234. /* 添加到中断处理程序中 */
  235. void TSC2046_IntProccess(void)
  236. {
  237. if(EXTI_GetITStatus(EXTI_Line10) != RESET)
  238. {
  239. //TSC2046_Read_Position(X_Position , Y_Position);
  240. gtTp.tpLedflag =1;
  241. if (gtTp.tpflag ==0) {
  242. gtTp.tpflag =1;
  243. TP_Read_XY();
  244. }
  245. // printf("\r\n触摸值 X: %d Y: %d\r\n",X_Addata,Y_Addata);
  246. EXTI_ClearITPendingBit(EXTI_Line10);
  247. }
  248. }
  249. #define READ_TIMES 8 //读取次数 //8
  250. #define LOST_VAL 2 //丢弃值
  251. #define CMD_RDX 0XD0
  252. #define CMD_RDY 0X90
  253. uint16_t TP_Read_XOY(uint8_t xy)
  254. {
  255. uint16_t i, j;
  256. uint16_t buf[READ_TIMES];
  257. uint16_t sum=0;
  258. uint16_t temp;
  259. for(i=0;i<READ_TIMES;i++){
  260. buf[i]= TSC2046_ReadByte(xy);
  261. }
  262. for(i=0;i<READ_TIMES-1; i++)//??
  263. {
  264. for(j=i+1;j<READ_TIMES;j++)
  265. {
  266. if(buf[i]>buf[j])//????
  267. {
  268. temp=buf[i];
  269. buf[i]=buf[j];
  270. buf[j]=temp;
  271. }
  272. }
  273. }
  274. sum=0;
  275. for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf[i];
  276. temp=sum/(READ_TIMES-2*LOST_VAL);
  277. return temp;
  278. }
  279. //读取XY坐标
  280. uint8_t TP_Read_XY(void)
  281. {
  282. gtTp.rf_X_add=TP_Read_XOY(CMD_RDX);
  283. gtTp.rf_Y_add=TP_Read_XOY(CMD_RDY);
  284. if( (gtTp.rf_X_add<100) || (gtTp.rf_Y_add<100) || (gtTp.rf_X_add>4000) || (gtTp.rf_Y_add >4000)) {
  285. gtTp.tpflag =0;
  286. return 0;
  287. } else {
  288. gtTp.tpflag =1;
  289. return 1;
  290. }
  291. return 1;
  292. }
  293. void TP_TASK(void)
  294. {
  295. static uint16_t wcnt =0;
  296. switch (gtTp.tpstate) {
  297. case 0:
  298. gtTp.tpstate ++;
  299. wcnt =0;
  300. break;
  301. case 1:
  302. wcnt =0;
  303. gtTp.tpstate ++;
  304. gtTp.rf_X_add=TP_Read_XOY(CMD_RDX);
  305. gtTp.rf_Y_add=TP_Read_XOY(CMD_RDY);
  306. break;
  307. case 2:
  308. gtTp.tpstate ++;
  309. break;
  310. case 3:
  311. gtTp.u16cnt ++;
  312. if (gtTp.tpflag ) {
  313. gtTp.rf_tp[0] = gtTp.rf_X_add ;
  314. gtTp.rf_tp[1] = gtTp.rf_Y_add ;
  315. wcnt ++;
  316. TP_Read_XY(); //dwdtest
  317. 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))
  318. || (( 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) )
  319. ) {
  320. gtTp.rf_X_add=TP_Read_XOY(CMD_RDX);
  321. gtTp.rf_Y_add=TP_Read_XOY(CMD_RDY);
  322. // U16TESTCNT2 ++;
  323. if (wcnt >5) {
  324. wcnt =0;
  325. gtTp.tpflag =0;
  326. // U16TESTCNT3 ++;
  327. }
  328. } else {
  329. wcnt =0;
  330. gtTp.tpflag =0;
  331. gtTp.tf_X_Y_add = gtTp.rf_X_add <<12;
  332. gtTp.tf_X_Y_add |= (gtTp.rf_Y_add &0xfff);
  333. if( (gtTp.rf_X_add<100) || (gtTp.rf_Y_add<100) || (gtTp.rf_X_add>4000) || (gtTp.rf_Y_add >4000)) {
  334. return;
  335. }
  336. if ((gtArm.Call_Sx1276_State >= 8) || (gtArm.Call_Sx1276_State < 4)) {
  337. gtArm.CallState = CALL_START;
  338. gtArm.Call_Sx1276_State = 4;
  339. gtArm.rf_stp = 0x80;
  340. // U16TESTCNT1 ++;
  341. }
  342. }
  343. }
  344. // gtTp.tpstate ++;
  345. break;
  346. }
  347. }