can_link.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #include "can_link.h"
  2. #include <string.h>
  3. #include "soft_can.h"
  4. #include "rkfifo.h"
  5. //fdcan1 外设消息
  6. void HAL_FDCAN_RxFifo0Callback( FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifoITs )
  7. {
  8. //测试受干扰时can数据长度会出错,导致HAL_FDCAN_GetRxMessage接收超过8个字节
  9. uint8_t canRxData[64] = {0};
  10. FDCAN_RxHeaderTypeDef RxHeader = {0};
  11. //FIFO收到新数据
  12. if ( ( RxFifoITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE ) != RESET )
  13. {
  14. //清空rxfifo,每次只保留最新一个。
  15. do
  16. {
  17. /* Retreive Rx messages from RX FIFO0 */
  18. HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO0, &RxHeader, canRxData );
  19. }
  20. while ( HAL_FDCAN_GetRxFifoFillLevel( hfdcan, FDCAN_RX_FIFO0 ) >= 1 );
  21. short len = CanGetHalDataLengthToDec( RxHeader.DataLength );
  22. if ( RxHeader.IdType == FDCAN_EXTENDED_ID )
  23. {
  24. if (len >8)
  25. return;
  26. switch(RxHeader.Identifier)
  27. {
  28. //其余消息直接转发
  29. default:
  30. Can_Txmsg_Target_Init(RxHeader.Identifier, canRxData);
  31. can_send(&hfdcan2);
  32. break;
  33. }
  34. }
  35. }
  36. //CAN数据丢失中断
  37. if ( ( RxFifoITs & FDCAN_IT_RX_FIFO0_MESSAGE_LOST ) != RESET )
  38. {
  39. /* Retreive Rx messages from RX FIFO0 */
  40. HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO0, &RxHeader, canRxData );
  41. }
  42. }
  43. //fdcan2 PMU消息
  44. void HAL_FDCAN_RxFifo1Callback( FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifoITs )
  45. {
  46. //测试受干扰时can数据长度会出错,导致HAL_FDCAN_GetRxMessage接收超过8个字节
  47. uint8_t canRxData[64] = {0};
  48. FDCAN_RxHeaderTypeDef RxHeader = {0};
  49. //FIFO收到新数据
  50. if ( ( RxFifoITs & FDCAN_IT_RX_FIFO1_NEW_MESSAGE ) != RESET )
  51. {
  52. //上电初始化时有可能外设CAN有数据,fifo设置的可保存32组数据,导致RXFIFO累积,程序正常后读取数据一直读取之前的。
  53. //清空rxfifo,每次只保留最新一个。
  54. do
  55. {
  56. /* Retreive Rx messages from RX FIFO0 */
  57. HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO1, &RxHeader, canRxData );
  58. }
  59. while ( HAL_FDCAN_GetRxFifoFillLevel( hfdcan, FDCAN_RX_FIFO1 ) >= 1 );
  60. short len = CanGetHalDataLengthToDec( RxHeader.DataLength );
  61. //扩展帧
  62. if ( RxHeader.IdType == FDCAN_EXTENDED_ID )
  63. {
  64. if (len >8)
  65. return;
  66. switch(RxHeader.Identifier)
  67. {
  68. case WEIGHT_MSG_ID:
  69. {
  70. Can_Rx can_rx;
  71. memcpy(&can_rx.Rxheader , &RxHeader,sizeof(RxHeader));
  72. memcpy(&can_rx.Rxdata, canRxData, 8);
  73. rkfifo_in(&can_rx_kfifo, &can_rx, 1);
  74. }
  75. break;
  76. case PUMP_MSG_ID:
  77. {
  78. short pwm;
  79. memcpy(&pwm, canRxData, 2);
  80. PUMP1_PWM_CONTROL(pwm);
  81. memcpy(&pwm, &canRxData[2], 2);
  82. PUMP2_PWM_CONTROL(pwm);
  83. }
  84. break;
  85. case SPRAY_MSG_ID:
  86. {
  87. short pwm;
  88. memcpy(&pwm, canRxData, 2);
  89. SPRAY1_PWM_CONTROL(pwm);
  90. memcpy(&pwm, &canRxData[2], 2);
  91. SPRAY2_PWM_CONTROL(pwm);
  92. }
  93. break;
  94. //其余消息直接转发
  95. default:
  96. Can_Txmsg_Target_Init(RxHeader.Identifier, canRxData);
  97. can_send(&hfdcan1);
  98. break;
  99. }
  100. }
  101. }
  102. //CAN数据丢失中断
  103. if ( ( RxFifoITs & FDCAN_IT_RX_FIFO1_MESSAGE_LOST ) != RESET )
  104. {
  105. /* Retreive Rx messages from RX FIFO0 */
  106. HAL_FDCAN_GetRxMessage( hfdcan, FDCAN_RX_FIFO1, &RxHeader, canRxData );
  107. }
  108. }
  109. uint32_t CanGetHalDataLengthToDec( uint32_t DataLength )
  110. {
  111. uint32_t dataLen = 0;
  112. if ( DataLength <= FDCAN_DLC_BYTES_8 )
  113. {
  114. dataLen = DataLength;
  115. }
  116. else if ( DataLength == FDCAN_DLC_BYTES_12 )
  117. {
  118. dataLen = 12;
  119. }
  120. else if ( DataLength == FDCAN_DLC_BYTES_16 )
  121. {
  122. dataLen = 16;
  123. }
  124. else if ( DataLength == FDCAN_DLC_BYTES_20 )
  125. {
  126. dataLen = 20;
  127. }
  128. else if ( DataLength == FDCAN_DLC_BYTES_24 )
  129. {
  130. dataLen = 24;
  131. }
  132. else if ( DataLength == FDCAN_DLC_BYTES_32 )
  133. {
  134. dataLen = 32;
  135. }
  136. else if ( DataLength == FDCAN_DLC_BYTES_48 )
  137. {
  138. dataLen = 48;
  139. }
  140. else if ( DataLength == FDCAN_DLC_BYTES_64 )
  141. {
  142. dataLen = 64;
  143. }
  144. return dataLen;
  145. }
  146. uint32_t CanSetDecToHalDataLength( uint32_t dataLen )
  147. {
  148. uint32_t DataLength = FDCAN_DLC_BYTES_0;
  149. if ( dataLen <= 8 )
  150. {
  151. DataLength = dataLen;
  152. }
  153. else if ( dataLen == 12 )
  154. {
  155. DataLength = FDCAN_DLC_BYTES_12;
  156. }
  157. else if ( dataLen == 16 )
  158. {
  159. DataLength = FDCAN_DLC_BYTES_16;
  160. }
  161. else if ( dataLen == 20 )
  162. {
  163. DataLength = FDCAN_DLC_BYTES_20;
  164. }
  165. else if ( dataLen == 24 )
  166. {
  167. DataLength = FDCAN_DLC_BYTES_24;
  168. }
  169. else if ( dataLen == 32 )
  170. {
  171. DataLength = FDCAN_DLC_BYTES_32;
  172. }
  173. else if ( dataLen == 48 )
  174. {
  175. DataLength = FDCAN_DLC_BYTES_48;
  176. }
  177. else if ( dataLen == 64 )
  178. {
  179. DataLength = FDCAN_DLC_BYTES_64;
  180. }
  181. return DataLength;
  182. }
  183. void can_recv_HD_ESC_msg(uint8_t *recv_buf, uint32_t len, uint32_t id)
  184. {
  185. uint8_t TypeID = 0;
  186. //uint8_t SerOrMsg = (id & HD_CANID_SNM_MASK) >> HD_CANID_SNM_POS; // 广播帧OR服务帧
  187. //uint8_t SrcNodeID = (id & HD_CANID_SRCNODE_MASK) >> HD_CANID_SRCNODE_POS;
  188. uint8_t buff[8];
  189. memcpy(buff,recv_buf,8);
  190. uint8_t finish_cnt = 0;
  191. }