hal_can.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. #include "hal_can.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "board.h"
  5. #include "sys_log.h"
  6. #include "sys_common.h"
  7. #include "string.h"
  8. #define CAN_RX_IRQn CAN1_RX0_IRQn
  9. #define CAN_TX_IRQn CAN1_TX_IRQn
  10. #define FIX_TIME_SEG 1
  11. #define CAN_TX_RETRY_CNT 2
  12. static can_rcv_cb_def g_s_can_rcv_cb = NULL;
  13. static can_send_suc_cb_def g_s_can_send_suc_cb = NULL;
  14. static can_err_cb_def g_s_can_err_cb = NULL;
  15. static uint32_t g_s_tx_mailbox;
  16. static uint8_t g_s_can_tx_payload[8];
  17. static uint8_t g_s_can_tx_cnt;
  18. CAN_HandleTypeDef g_s_can1_handler;
  19. CAN_TxHeaderTypeDef g_s_can_tx_header;
  20. CAN_RxHeaderTypeDef g_s_can_rx_header;
  21. int HAL_CanInit(void)
  22. {
  23. int err_code;
  24. g_s_can1_handler.Instance = CAN1;
  25. g_s_can1_handler.Init.TimeTriggeredMode = DISABLE;
  26. g_s_can1_handler.Init.AutoBusOff = DISABLE;
  27. g_s_can1_handler.Init.AutoWakeUp = DISABLE;
  28. g_s_can1_handler.Init.AutoRetransmission = DISABLE;
  29. g_s_can1_handler.Init.ReceiveFifoLocked = DISABLE;
  30. g_s_can1_handler.Init.TransmitFifoPriority = DISABLE;
  31. g_s_can1_handler.Init.Mode = CAN_MODE_NORMAL;
  32. g_s_can1_handler.Init.SyncJumpWidth = CAN_SJW_1TQ;
  33. g_s_can1_handler.Init.Prescaler = 4;
  34. g_s_can1_handler.Init.TimeSeg1 = CAN_BS1_9TQ;
  35. g_s_can1_handler.Init.TimeSeg2 = CAN_BS2_8TQ;
  36. err_code = HAL_CAN_Init(&g_s_can1_handler);
  37. if (err_code != HAL_OK) //
  38. {
  39. return -1;
  40. }
  41. err_code = HAL_CanFilterConfig();
  42. if (err_code != HAL_OK) //
  43. {
  44. return -2;
  45. }
  46. /*##-4- Activate CAN RX notification #######################################*/
  47. if (HAL_CAN_ActivateNotification(&g_s_can1_handler, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK){
  48. /* Initialization Error */
  49. return -3;
  50. }
  51. if (HAL_CAN_ActivateNotification(&g_s_can1_handler, CAN_IT_TX_MAILBOX_EMPTY) != HAL_OK){
  52. /* Initialization Error */
  53. return -3;
  54. }
  55. if (HAL_CAN_ActivateNotification(&g_s_can1_handler, CAN_IT_BUSOFF) != HAL_OK){
  56. /* Initialization Error */
  57. return -3;
  58. }
  59. if (HAL_CAN_ActivateNotification(&g_s_can1_handler, CAN_IT_ERROR_WARNING) != HAL_OK){
  60. /* Initialization Error */
  61. return -3;
  62. }
  63. if (HAL_CAN_ActivateNotification(&g_s_can1_handler, CAN_IT_ERROR_PASSIVE) != HAL_OK){
  64. /* Initialization Error */
  65. return -3;
  66. }
  67. if (HAL_CAN_ActivateNotification(&g_s_can1_handler, CAN_IT_ERROR) != HAL_OK){
  68. /* Initialization Error */
  69. return -3;
  70. }
  71. return 0;
  72. }
  73. void HAL_CAN_MspInit(CAN_HandleTypeDef *hcan)
  74. {
  75. GPIO_InitTypeDef GPIO_Initure;
  76. __HAL_RCC_CAN1_CLK_ENABLE();
  77. __HAL_RCC_GPIOA_CLK_ENABLE();
  78. GPIO_Initure.Pin = CAN_H_PIN;
  79. GPIO_Initure.Mode = GPIO_MODE_AF_PP;
  80. GPIO_Initure.Pull = GPIO_PULLUP;
  81. GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
  82. HAL_GPIO_Init(CAN_GPIO, &GPIO_Initure);
  83. GPIO_Initure.Pin = CAN_L_PIN;
  84. GPIO_Initure.Mode = GPIO_MODE_AF_INPUT;
  85. GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH;
  86. HAL_GPIO_Init(CAN_GPIO, &GPIO_Initure);
  87. /*##-2- Configure the NVIC*/
  88. /* NVIC configuration for CAN1 Reception complete interrupt */
  89. HAL_NVIC_SetPriority(CAN_RX_IRQn, 8, 0);
  90. HAL_NVIC_EnableIRQ(CAN_RX_IRQn);
  91. HAL_NVIC_SetPriority(CAN_TX_IRQn, 8, 0);
  92. HAL_NVIC_EnableIRQ(CAN_TX_IRQn);
  93. }
  94. static int HAL_CanFilterConfig(void)
  95. {
  96. CAN_FilterTypeDef sFilterConfig;
  97. int err_code;
  98. sFilterConfig.FilterBank = 0; //
  99. sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  100. sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  101. sFilterConfig.FilterIdHigh = 0x0000; //32λID
  102. sFilterConfig.FilterIdLow = 0x0000;
  103. sFilterConfig.FilterMaskIdHigh = 0x0000; //32λMASK
  104. sFilterConfig.FilterMaskIdLow = 0x0000;
  105. sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;//
  106. sFilterConfig.FilterActivation = ENABLE; //
  107. sFilterConfig.SlaveStartFilterBank = 14;
  108. err_code = HAL_CAN_ConfigFilter(&g_s_can1_handler, &sFilterConfig);
  109. if (err_code != HAL_OK)
  110. {
  111. return -1;
  112. }
  113. return 0;
  114. }
  115. int HAL_CanStart(void)
  116. {
  117. if (HAL_CAN_Start(&g_s_can1_handler) != HAL_OK)
  118. {
  119. return -1;
  120. }
  121. return 0;
  122. }
  123. static int HAL_CanTx(CAN_TxHeaderTypeDef *pHeader, uint8_t* can_data)
  124. {
  125. if (HAL_CAN_AddTxMessage(&g_s_can1_handler, pHeader, can_data, &g_s_tx_mailbox) != HAL_OK) //����
  126. {
  127. return -1;
  128. }
  129. return 0;
  130. }
  131. int8_t HAL_CanTxData(uint8_t can_id_type, uint32_t can_id, uint8_t *data, uint8_t data_len)
  132. {
  133. uint8_t payload_len;
  134. if(NULL == data)
  135. {
  136. return -1;
  137. }
  138. g_s_can_tx_cnt = 0;
  139. DLOG_I("tx can_id_type:%d,can_id,0x%x,payload_len:%d,payload:%s", can_id_type, can_id, data_len, SYS_Hex2str(data,data_len));
  140. if(0x00 == can_id_type)
  141. {
  142. g_s_can_tx_header.IDE = CAN_ID_STD;
  143. g_s_can_tx_header.StdId = can_id;
  144. g_s_can_tx_header.ExtId = 0;
  145. }
  146. else if (0x04 == can_id_type)
  147. {
  148. g_s_can_tx_header.IDE = CAN_ID_EXT;
  149. g_s_can_tx_header.StdId = 0;
  150. g_s_can_tx_header.ExtId = can_id;
  151. }
  152. else
  153. {
  154. return -2;
  155. }
  156. payload_len = data_len>8?8:data_len;
  157. g_s_can_tx_header.RTR = CAN_RTR_DATA;
  158. g_s_can_tx_header.DLC = payload_len;
  159. g_s_can_tx_header.TransmitGlobalTime = DISABLE;
  160. memset(g_s_can_tx_payload, 0, 8);
  161. memcpy(g_s_can_tx_payload, data, payload_len);
  162. if(0 != HAL_CanTx(&g_s_can_tx_header, g_s_can_tx_payload))
  163. {
  164. DLOG_E("HAL_CanTx error");
  165. return -3;
  166. }
  167. return 0;
  168. }
  169. void CAN1_RX0_IRQHandler(void)
  170. {
  171. HAL_CAN_IRQHandler(&g_s_can1_handler);
  172. }
  173. void CAN1_TX_IRQHandler(void)
  174. {
  175. HAL_CAN_IRQHandler(&g_s_can1_handler);
  176. }
  177. void HAL_CanCallbackRegister(can_rcv_cb_def rcv_cb, can_send_suc_cb_def send_cb, can_err_cb_def err_cb)
  178. {
  179. if((NULL == rcv_cb) || (NULL == send_cb) || (NULL == err_cb))
  180. {
  181. return;
  182. }
  183. g_s_can_rcv_cb = rcv_cb;
  184. g_s_can_send_suc_cb = send_cb;
  185. g_s_can_err_cb = err_cb;
  186. }
  187. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
  188. {
  189. CAN_RxHeaderTypeDef rx_msg_header = {0};
  190. uint8_t rx_buf[8] = {0};
  191. if(HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &rx_msg_header, rx_buf) == HAL_OK)
  192. {
  193. if(g_s_can_rcv_cb != NULL)
  194. {
  195. if(CAN_ID_STD == rx_msg_header.IDE)
  196. {
  197. g_s_can_rcv_cb(rx_msg_header.IDE, rx_msg_header.StdId, rx_buf, rx_msg_header.DLC);
  198. }
  199. else if(CAN_ID_EXT == rx_msg_header.IDE)
  200. {
  201. g_s_can_rcv_cb(rx_msg_header.IDE, rx_msg_header.ExtId, rx_buf, rx_msg_header.DLC);
  202. }
  203. }
  204. }
  205. else
  206. {
  207. /* Reception Error */
  208. DLOG_E("Get Rx Msg ERR");
  209. }
  210. }
  211. void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan)
  212. {
  213. if(NULL != g_s_can_send_suc_cb)
  214. {
  215. g_s_can_send_suc_cb();
  216. }
  217. }
  218. void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan)
  219. {
  220. if(NULL != g_s_can_send_suc_cb)
  221. {
  222. g_s_can_send_suc_cb();
  223. }
  224. }
  225. void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan)
  226. {
  227. if(NULL != g_s_can_send_suc_cb)
  228. {
  229. g_s_can_send_suc_cb();
  230. }
  231. }
  232. void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan)
  233. {
  234. char REC = hcan->Instance->ESR >> 24;
  235. char TEC = (hcan->Instance->ESR >> 16);
  236. char LEC = (hcan->Instance->ESR >> 4) & 0x07;
  237. char EWGF = hcan->Instance->ESR & 0x01;
  238. char EPVF = (hcan->Instance->ESR & 0x02) >> 1;
  239. char BOFF = (hcan->Instance->ESR & 0x04) >> 2;
  240. DLOG_E("can_error,code:0x%x, REC:%d, TEC:%d, LEC:0x%x, EWGF:%d, EPVF:%d, BOFF:%d", hcan->ErrorCode,REC,TEC,LEC,EWGF,EPVF,BOFF);
  241. g_s_can_tx_cnt += 1;
  242. if(g_s_can_tx_cnt < CAN_TX_RETRY_CNT)
  243. {
  244. HAL_CanTx(&g_s_can_tx_header, g_s_can_tx_payload);
  245. }
  246. if(NULL != g_s_can_err_cb)
  247. {
  248. g_s_can_err_cb(hcan->ErrorCode);
  249. }
  250. }