mapp_canid.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. /==================================================================
  2. //
  3. // Filename: mapp_avm.c
  4. // Description: dvd driver
  5. //
  6. //------------------------------------------------------------------
  7. //
  8. // version:
  9. // date: 16:08pm, 12.Apr.2018, by dwd
  10. // Description:
  11. //
  12. //------------------------------------------------------------------
  13. //==================================================================
  14. /*------------------------------------------------------------------------------
  15. * I N C L U D E
  16. *------------------------------------------------------------------------------*/
  17. #include "stm32f0xx.h"
  18. #include "general.h"
  19. #include "main.h"
  20. #include "mapp_canid.h"
  21. #include "mapp_can.h"
  22. /*------------------------------------------------------------------------------
  23. * D E F I N E
  24. *------------------------------------------------------------------------------*/
  25. /*------------------------------------------------------------------------------
  26. * S T R U C T
  27. *------------------------------------------------------------------------------*/
  28. /*------------------------------------------------------------------------------
  29. * S T R U C T
  30. *------------------------------------------------------------------------------*/
  31. T_Can_Info gtCaninfo ={0};
  32. /*------------------------------------------------------------------------------
  33. * S T A T I C - V A R I A B L E S
  34. *------------------------------------------------------------------------------*/
  35. /*------------------------------------------------------------------------------
  36. * G L O B A L
  37. *------------------------------------------------------------------------------*/
  38. /*------------------------------------------------------------------------------
  39. * P R O T O T Y P E
  40. *------------------------------------------------------------------------------*/
  41. static void s_frmAvmTxNull(U16 prm);
  42. static void s_frmAvmTxAck(U16 prm);
  43. static void s_frmAvmTxCar(U16 prm);
  44. static void s_frmAvmTxTime(U16 prm);
  45. static void s_frmAvmTxTpPos(U16 prm);
  46. static void s_frmAvmTxTp2Pos(U16 prm);
  47. static void s_frmAvmRxAvm(void);
  48. static void s_frmAvmRxAvm2(void);
  49. static BOOL s_AvmRxCheck(void);
  50. void TIM1_Config(void)
  51. {
  52. GPIO_InitTypeDef GPIO_InitStructure;
  53. NVIC_InitTypeDef NVIC_InitStructure;
  54. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  55. TIM_ICInitTypeDef TIM_ICInitStructure;
  56. /* TIM1 clock enable */
  57. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
  58. /* GPIOA clock enable */
  59. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  60. /* TIM2 chennel2 configuration : PA.11 */
  61. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  62. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  63. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  64. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  65. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  66. GPIO_Init(GPIOA, &GPIO_InitStructure);
  67. /* Connect TIM pin to AF2 */
  68. GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_2);
  69. /* Enable the TIM1 global Interrupt */
  70. NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
  71. NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
  72. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  73. NVIC_Init(&NVIC_InitStructure);
  74. TIM_TimeBaseStructure.TIM_Prescaler = 48-1;
  75. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  76. TIM_TimeBaseStructure.TIM_Period = 0xffffffff;
  77. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  78. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
  79. /* ---------------------------------------------------------------------------
  80. TIM2 configuration: PWM Input mode
  81. The external signal is connected to TIM2 CH2 pin (PB.03)
  82. TIM2 CCR2 is used to compute the frequency value
  83. TIM2 CCR1 is used to compute the duty cycle value
  84. In this example TIM2 input clock (TIM2CLK) is set to APB1 clock (PCLK1), since
  85. APB1 prescaler is set to 1.
  86. TIM2CLK = PCLK1 = HCLK = SystemCoreClock
  87. External Signal Frequency = SystemCoreClock / TIM2_CCR2 in Hz.
  88. External Signal DutyCycle = (TIM2_CCR1*100)/(TIM2_CCR2) in %.
  89. Note:
  90. SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file.
  91. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate()
  92. function to update SystemCoreClock variable value. Otherwise, any configuration
  93. based on this variable will be incorrect.
  94. --------------------------------------------------------------------------- */
  95. TIM_ICInitStructure.TIM_Channel = TIM_Channel_4;
  96. TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
  97. TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
  98. TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
  99. TIM_ICInitStructure.TIM_ICFilter = 0x0;
  100. //TIM_Cmd(TIM1,&TIM_ICInitStructure);
  101. // TIM_PWMIConfig(TIM1, &TIM_ICInitStructure);
  102. TIM_ICInit(TIM1,&TIM_ICInitStructure);
  103. /* Select the TIM2 Input Trigger: TI2FP2 */
  104. TIM_SelectInputTrigger(TIM1, TIM_TS_TI1FP1);
  105. /* Select the slave Mode: Reset Mode */
  106. TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Reset);
  107. TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);
  108. /* TIM enable counter */
  109. TIM_Cmd(TIM1, ENABLE);
  110. /* Enable the CC2 Interrupt Request */
  111. TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);
  112. }
  113. void TIM1_OffConfig(void)
  114. {
  115. GPIO_InitTypeDef GPIO_InitStructure;
  116. /* Configure CAN2 **************************************************/
  117. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  118. GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4);
  119. /* Configure CAN pin: TX */
  120. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//TXRX
  121. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  122. GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  123. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  124. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  125. GPIO_Init(GPIOA, &GPIO_InitStructure);
  126. }
  127. void CanISRHandler(void)
  128. {
  129. /* Clear TIM2 Capture compare interrupt pending bit */
  130. // TIM_ClearITPendingBit(TIM1, TIM_IT_CC4);
  131. /* Get the Input Capture value */
  132. gtCaninfo.captureValuecui= TIM_GetCapture4(TIM1);
  133. if (gtCaninfo.captureValuecui > gtCaninfo.captureValuelast) {
  134. gtCaninfo.icvalue = (gtCaninfo.captureValuecui -gtCaninfo.captureValuelast);
  135. if (gtCaninfo.cancomprevalue[gtCaninfo.comprecnt] > gtCaninfo.icvalue ) {
  136. gtCaninfo.cancomprevalue[gtCaninfo.comprecnt] = gtCaninfo.icvalue ;
  137. }
  138. gtCaninfo.captureValuelast = gtCaninfo.captureValuecui;
  139. } else {
  140. gtCaninfo.captureValuelast =0x00;
  141. gtCaninfo.comprecnt++;
  142. if(gtCaninfo.comprecnt>10) {
  143. gtCaninfo.cancheckflag =1;
  144. gtCaninfo.comprecnt=15;
  145. }
  146. }
  147. }
  148. void M_sort(U08 a[],U08 num) {
  149. static U08 m =0;
  150. static U08 n =0;
  151. U08 i =0;
  152. U08 j = 0;
  153. U08 temp =0;
  154. for(i=0;i<num;i++) //n个数要进行n-1趟比较
  155. {
  156. for(j=0;j<num-i;j++) //每趟比较n-i次
  157. if(a[j]>a[j+1]) //依次比较两个相邻的数,将小数放在前面,大数放在后面
  158. {
  159. temp=a[j]; //temp是局部变量
  160. a[j]=a[j+1];
  161. a[j+1]=temp;
  162. }
  163. }
  164. }
  165. U08 CarCanJudgeDel(U08 ca)
  166. {
  167. if((ca >= 0x0E) && (ca <= 0x11)){//0x0F 0x10
  168. gtCarType.CarType = CARTYPE_HONDA;
  169. return 1;
  170. } else if((ca >= 0x03) && (ca <= 0x06)){ //0x04
  171. gtCarType.CarType = CARTYPE_AUDI;
  172. return 1;
  173. } else if((ca >= 0x39) && (ca <= 0x3F)){ //0x3B 0x3C
  174. gtCarType.CarType = CARTYPE_BUICK;
  175. return 1;
  176. } else{
  177. return 0;
  178. }
  179. }
  180. void CanIdAutoTask(void) {
  181. IWDG->KR = (U16)0xAAAA;
  182. switch (gtCaninfo.canidstate) {
  183. case CANID_RESET:
  184. MEMSET(&gtCaninfo, 0, sizeof(T_Can_Info));
  185. MEMSET(&gtCaninfo.cancomprevalue, 0XFF,10);
  186. gtCaninfo.canidstate = CANID_INIT;
  187. PullUpPowerCfg(RESET);
  188. break;
  189. case CANID_INIT:
  190. if ( !gtCarType.CarTypeOkFlag ) {
  191. TIM1_Config();
  192. GpioTrcv1040StandbyCfg(RESET);
  193. GpioTrcv28056StandbyCfg(SET);
  194. GpioTrcv28056EnableCfg(SET);
  195. gtCaninfo.cancheckflag =0;
  196. gtCaninfo.canidstate = CANID_RUN;
  197. } else {
  198. gtCaninfo.canidstate = CANID_CIROFF;
  199. }
  200. break;
  201. case CANID_RUN:
  202. if (gtCaninfo.cancheckflag ) {
  203. gtCaninfo.canidstate = CANID_STOP;
  204. }
  205. break;
  206. case CANID_STOP:
  207. TIM1_OffConfig();
  208. gtCaninfo.canwaitcount =0;
  209. gtCaninfo.canidstate = CANID_WAIT;
  210. break;
  211. case CANID_WAIT:
  212. gtCaninfo.canwaitcount ++;
  213. if (gtCaninfo.canwaitcount >0xff00) {
  214. gtCaninfo.canidstate = CANID_ACCESS;
  215. }
  216. break;
  217. case CANID_ACCESS:
  218. M_sort(gtCaninfo.cancomprevalue,9);
  219. gtCaninfo.canidstate = CANID_JUDGE;
  220. break;
  221. case CANID_JUDGE:
  222. if (CarCanJudgeDel( gtCaninfo.cancomprevalue[5])) {
  223. gtCaninfo.canidstate = CANID_CIROFF;
  224. PullUpPowerCfg(SET);
  225. } else {
  226. gtCaninfo.canidstate = CANID_RESET;
  227. }
  228. break;
  229. case CANID_CIROFF:
  230. break;
  231. default:
  232. break;
  233. }
  234. }
  235. //==============================================================
  236. // End Of File
  237. //==============================================================