TIM1_CAP.c 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "TIM1_CAP.h"
  2. #include "app_def.h"
  3. #include "app_msg.h"
  4. #include "TIM6_1MS.h"
  5. #include "BSP.h"
  6. //#define debugbustestcomm
  7. unsigned char TIM1_Rev_flag=0; //表示正在接收总线数据,0表示当前未接收,1表示当前正在接收。
  8. extern unsigned char RunMode; //工作模式
  9. static unsigned char Bus_RevLength=146; //工作模式,0表示注册模式,分机发送注册码长度为146,工作模式时为26
  10. extern unsigned char CallMode; //通话模式,0;双工 1;单工
  11. extern void BUS_Rev_NewInfo(unsigned char *pInfo);
  12. #define BUS_REV_MAX 6
  13. static unsigned short BUS_Rev_Buf[6][150]={0};
  14. static unsigned char BUS_Rev_ReadIndex=0;
  15. static unsigned char BUS_Rev_WriteIndex=0;
  16. static unsigned char TIM1_cc_flag=0;
  17. unsigned char TIM1_Rev_Buf[30]={0};
  18. unsigned char gt_busrxflag =0;
  19. int TIM1_init(void)
  20. {
  21. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  22. TIM_ICInitTypeDef TIM_ICInitStructure;
  23. NVIC_InitTypeDef NVIC_InitStructure;
  24. GPIO_InitTypeDef GPIO_InitStructure;
  25. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  26. //=================================
  27. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  28. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |GPIO_Pin_10;
  29. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  30. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  31. GPIO_Init(GPIOA, &GPIO_InitStructure);
  32. //=================================
  33. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
  34. TIM_DeInit(TIM1);
  35. GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE);
  36. //=================================
  37. TIM_TimeBaseStructure.TIM_Period =65535; //设置自动重装载寄存器周期值
  38. TIM_TimeBaseStructure.TIM_Prescaler =(720-1); //720-1预分频器,100K的计数频率,10us加1.
  39. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
  40. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
  41. TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重复计数设置
  42. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //参数初始化
  43. TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE);
  44. //=================================
  45. TIM_ICInitStructure.TIM_Channel = TIM_Channel_4; //选择输入端 IC1映射到TI4上
  46. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; //下降沿捕获
  47. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //通道一一对应
  48. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
  49. TIM_ICInitStructure.TIM_ICFilter =5; //IC4F=0011 配置输入滤波器 8个定时器时钟周期滤波
  50. TIM_ICInit(TIM1, &TIM_ICInitStructure); //初始化定时器输入捕获通道
  51. TIM_ClearFlag(TIM1,TIM_FLAG_CC4); //清中断标志位
  52. TIM_ITConfig(TIM1,TIM_IT_CC4,ENABLE); //允许CC4IE捕获中断
  53. TIM_ARRPreloadConfig(TIM1, ENABLE);
  54. //=================================
  55. NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
  56. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  57. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  58. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  59. NVIC_Init(&NVIC_InitStructure);
  60. //=================================
  61. TIM_Cmd(TIM1, ENABLE);
  62. return 1;
  63. }
  64. unsigned int itestCC4date[30] = {0};
  65. unsigned int itestCC4cnt =0;
  66. void TIM1_CC_IRQHandler(void)
  67. {
  68. static unsigned int lastCC4Value=0;
  69. static unsigned short TIM1_CC3[200]={0};
  70. unsigned int i,CC4Value;
  71. if(TIM_GetITStatus(TIM1,TIM_IT_CC4)!=RESET)
  72. {
  73. //=========================================
  74. i=TIM_GetCapture4(TIM1);
  75. if(i>lastCC4Value)
  76. CC4Value = i-lastCC4Value;
  77. else
  78. CC4Value=65535-lastCC4Value+i;
  79. lastCC4Value=i;
  80. BufSentTime = 40;
  81. itestCC4cnt ++;
  82. if (itestCC4cnt >25) {
  83. itestCC4cnt =0;
  84. }
  85. itestCC4date[itestCC4cnt] = CC4Value;
  86. //=========================================脉冲计算宽度
  87. if(CC4Value<=150)
  88. {
  89. if(lastCC4Value>=CC4Value)
  90. {
  91. lastCC4Value=lastCC4Value-CC4Value;
  92. }
  93. else
  94. {
  95. lastCC4Value=65535-lastCC4Value+CC4Value;
  96. }
  97. }
  98. //=========================================处理误码
  99. else
  100. {
  101. TIM1_CC3[TIM1_cc_flag]=CC4Value;
  102. if(TIM1_cc_flag==0)
  103. {
  104. if((CC4Value>450)&&(CC4Value<680)) //采集起始位:6ms
  105. {
  106. TIM1_cc_flag=2;
  107. TIM1_CC3[1]=CC4Value;
  108. gtackvalid =0;
  109. // TIM1_Rev_flag=1;
  110. }
  111. else if((CC4Value>900)&&(CC4Value<1100))//采ACK 10ms
  112. {
  113. gtackvalid=0 ;
  114. return;
  115. }
  116. else
  117. {
  118. TIM1_cc_flag=1;
  119. }
  120. }
  121. else if(TIM1_cc_flag==1)
  122. {
  123. if((CC4Value>450)&&(CC4Value<680)) //采集起始位:6ms
  124. {
  125. TIM1_cc_flag=2;
  126. TIM1_CC3[1]=CC4Value;
  127. gtackvalid =0;
  128. }
  129. else if((CC4Value>900)&&(CC4Value<1100)) //采ACK 10ms
  130. {
  131. gtackvalid=0 ;
  132. return;
  133. }
  134. }
  135. else if(TIM1_cc_flag<Bus_RevLength)
  136. {
  137. TIM1_cc_flag++;
  138. if((CC4Value>450)&&(CC4Value<680)) //采集起始位:6ms
  139. {
  140. TIM1_cc_flag=2;
  141. gtackvalid =0;
  142. }
  143. else if((CC4Value>900)&&(CC4Value<1100))//采ACK 10ms
  144. {
  145. gtackvalid=0 ;
  146. return;
  147. }
  148. }
  149. //============================================================================
  150. if(TIM1_cc_flag==Bus_RevLength) //接收完成,进行上传
  151. {
  152. for(i=2;i<Bus_RevLength;i++)
  153. {
  154. BUS_Rev_Buf[BUS_Rev_WriteIndex][i-2]= TIM1_CC3[i];
  155. }
  156. BUS_Rev_WriteIndex++;
  157. if(BUS_Rev_WriteIndex>=BUS_REV_MAX)BUS_Rev_WriteIndex=0;
  158. TIM1_cc_flag=0;
  159. //TIM1_Rev_flag=0;
  160. }
  161. else if(TIM1_cc_flag>Bus_RevLength)
  162. {
  163. TIM1_cc_flag=0;
  164. // TIM1_Rev_flag=0;
  165. }
  166. //============================================================================
  167. }
  168. TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);
  169. }
  170. }
  171. #ifdef debugbustestcomm
  172. unsigned short dwdcnt =0;
  173. unsigned short dwdcnt2 =0;
  174. unsigned short dwdcnt3 =0;
  175. #endif
  176. void BUS_Rev_Tick(void)
  177. {
  178. unsigned short i,j,k;
  179. unsigned short checkSum=0;
  180. //=======================================
  181. if(RunMode==0)
  182. {
  183. Bus_RevLength=146;
  184. }
  185. else
  186. {
  187. Bus_RevLength=26;
  188. }
  189. #ifdef debugbustestcomm
  190. dwdcnt2 ++;
  191. if (dwdcnt2 == 110) {
  192. OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y'));
  193. dwdcnt2 =0;
  194. } else if (dwdcnt2 >200) {
  195. dwdcnt2 =0;
  196. OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y'));
  197. } else if (dwdcnt2 >100) {
  198. dwdcnt2 =0;
  199. OSQPost(BusMsgQueue, BUS_MSG_REGEDITSTATE, TO_WORD(0xff, 'Y'));
  200. // OSQPost(BusMsgQueue, BUS_MSG_EXTENDATA5, TO_WORD(0x11, 0x39));
  201. }
  202. #endif
  203. //=======================================
  204. if(BUS_Rev_WriteIndex != BUS_Rev_ReadIndex)
  205. {
  206. for(i=0;i<30;i++)
  207. {
  208. TIM1_Rev_Buf[i]=0;
  209. }
  210. //=======================================
  211. for(i=0;i<(Bus_RevLength-2);i++)
  212. {
  213. if(BUS_Rev_Buf[BUS_Rev_ReadIndex][i]>360) //230409
  214. {
  215. if(i>0)
  216. {
  217. if(BUS_Rev_Buf[BUS_Rev_ReadIndex][i-1]<280)
  218. {
  219. BUS_Rev_Buf[BUS_Rev_ReadIndex][i-1]+=100;
  220. }
  221. else
  222. {
  223. BUS_Rev_Buf[BUS_Rev_ReadIndex][i+1]+=100;
  224. }
  225. }
  226. else
  227. {
  228. BUS_Rev_Buf[BUS_Rev_ReadIndex][i+1]+=100;
  229. }
  230. BUS_Rev_Buf[BUS_Rev_ReadIndex][i]-=100;
  231. }
  232. }
  233. //=======================================再次处理误码
  234. for(i=0;i<(Bus_RevLength-2);i++)
  235. {
  236. k=(i)/8;
  237. j=(i)%8;
  238. if((BUS_Rev_Buf[BUS_Rev_ReadIndex][i]>250)&&(BUS_Rev_Buf[BUS_Rev_ReadIndex][i]<500)) //数据位:1
  239. {
  240. TIM1_Rev_Buf[k]|=(1<<j);
  241. }
  242. }
  243. //=======================================================
  244. if(RunMode==0)
  245. {
  246. checkSum=0;
  247. for(i=0;i<17;i++)
  248. {
  249. checkSum+=TIM1_Rev_Buf[i];
  250. }
  251. checkSum+=(TIM1_Rev_Buf[17]&0x0F);
  252. i=(TIM1_Rev_Buf[17]>>4)&0x0F;
  253. if((checkSum&0x0F)==i)
  254. {
  255. TIM1_Rev_Buf[17]=TIM1_Rev_Buf[17]&0x0F;
  256. BUS_Rev_NewInfo(TIM1_Rev_Buf);
  257. } else {
  258. #ifdef debugbustestcomm
  259. dwdcnt ++;
  260. #endif
  261. }
  262. }
  263. else
  264. {
  265. checkSum=TIM1_Rev_Buf[0];
  266. checkSum+=TIM1_Rev_Buf[1];
  267. checkSum+=(TIM1_Rev_Buf[2]&0x0F);
  268. i=(TIM1_Rev_Buf[2]>>4)&0x0F;
  269. if((checkSum&0x0F)==i)
  270. {
  271. TIM1_Rev_Buf[2]=TIM1_Rev_Buf[2]&0x0F;
  272. BUS_Rev_NewInfo(TIM1_Rev_Buf);
  273. } else if ((TIM1_Rev_Buf[2] == 'C') || (TIM1_Rev_Buf[2] == 'S')) {
  274. BUS_Rev_146BInfo(TIM1_Rev_Buf); // working find device
  275. }
  276. }
  277. BUS_Rev_ReadIndex++;
  278. if(BUS_Rev_ReadIndex>=BUS_REV_MAX)BUS_Rev_ReadIndex=0;
  279. }
  280. }