@@ -254,43 +254,87 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
254254/*_________________________________________以下外设的声明代码均放在了PeriphConfigCore.h的最下面_________________________________________________________*/
255255#if SYSTEM_CAN1_ENABLE
256256
257- CAN_HandleTypeDef CAN1_Handler ;
257+ CAN_HandleTypeDef CAN1_Handler ;
258+
259+ //CAN初始化,默认启用CAN1和FIFO0
260+ //tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1tq~ CAN_SJW_4tq
261+ //tbs2:时间段2的时间单元. 范围:CAN_BS2_1tq~CAN_BS2_8tq;
262+ //tbs1:时间段1的时间单元. 范围:CAN_BS1_1tq ~CAN_BS1_16tq
263+ //brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
264+ //波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
265+ //mode:CAN_Mode_Normal,普通模式;CAN_Mode_LoopBack,回环模式;
266+ //Fpclk1的时钟在初始化的时候设置为42M
267+ //以下两个例子
268+ // CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS1_6TQ,CAN_BS2_7TQ,6,CAN_MODE_NORMAL); //42M外设,500Kbps波特率
269+ // CAN1_Mode_Init(CAN_SJW_1TQ,CAN_BS1_7TQ,CAN_BS2_8TQ,21,CAN_MODE_NORMAL); //42M外设,125Kbps波特率
270+ void CAN1_Mode_Init (uint32_t tsjw , uint32_t tbs1 , uint32_t tbs2 , uint32_t brp , uint32_t mode )
271+ {
272+ CAN_FilterTypeDef CAN_FilterInit_Handler ;
273+
274+ CAN1_Handler .Instance = CAN1 ;
275+ CAN1_Handler .Init .Prescaler = brp ; //分频系数,写几就是分频几倍,分频自APB1 42MHZ
276+ CAN1_Handler .Init .Mode = mode ; //模式设置
258277
259- void sys_CAN1_Init (void )
260- {
278+ CAN1_Handler .Init .SyncJumpWidth = tsjw ; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ ~ CAN_SJW_4TQ
279+ CAN1_Handler .Init .TimeSeg1 = tbs1 ; //CAN_BS1_1TQ ~ CAN_BS1_16TQ
280+ CAN1_Handler .Init .TimeSeg2 = tbs2 ; //CAN_BS2_1TQ ~ CAN_BS2_8TQ
261281
262- CAN1_Handler .Instance = CAN1 ;
263- CAN1_Handler .Init .Prescaler = 6 ; //1~1024,分频自APB1 42MHZ
264- CAN1_Handler .Init .Mode = CAN_MODE_NORMAL ; //无需动
265-
266- //在CAN外设频率为42Mhz时,推荐分频系数(brp+1)为6,三段分别为:1tq\7tq\6tq,CAN1工作在 500Kbps
267- CAN1_Handler .Init .SyncJumpWidth = CAN_SJW_1TQ ; //CAN_SJW_1TQ ~ CAN_SJW_4TQ
268- CAN1_Handler .Init .TimeSeg1 = CAN_BS1_7TQ ; //CAN_BS1_1TQ ~ CAN_BS1_16TQ
269- CAN1_Handler .Init .TimeSeg2 = CAN_BS2_6TQ ; //CAN_BS2_1TQ ~ CAN_BS2_8TQ
270-
271- CAN1_Handler .Init .TimeTriggeredMode = DISABLE ; //非时间触发通信模式
272- CAN1_Handler .Init .AutoBusOff = DISABLE ; //软件自动离线管理
273- CAN1_Handler .Init .AutoWakeUp = DISABLE ; //睡眠模式通过软件唤醒
274- CAN1_Handler .Init .AutoRetransmission = ENABLE ; //报文自动传送,不用动
282+ CAN1_Handler .Init .TimeTriggeredMode = DISABLE ; //非时间触发通信模式 0=时间触发通讯不使用,保持默认
283+ CAN1_Handler .Init .AutoBusOff = DISABLE ; //软件自动离线管理 0=总线断开状态根据软件请求,保持默认
284+ CAN1_Handler .Init .AutoWakeUp = DISABLE ; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位),保持默认
285+ CAN1_Handler .Init .AutoRetransmission = ENABLE ; //报文自动传送,不用动
275286 //ENABLE:CAN hardware will automatically retransmit the message until it has been successfully transmitted according to the CAN standard.
276- CAN1_Handler .Init .ReceiveFifoLocked = DISABLE ; //报文不锁定,新的覆盖旧的
277- CAN1_Handler .Init .TransmitFifoPriority = DISABLE ;//优先级由报文标识符决定
287+ CAN1_Handler .Init .ReceiveFifoLocked = DISABLE ; //报文不锁定,新的覆盖旧的
288+ CAN1_Handler .Init .TransmitFifoPriority = DISABLE ; //优先级由报文标识符决定
278289
279290 HAL_CAN_Init (& CAN1_Handler );
280-
281- }
291+
292+ CAN_FilterInit_Handler .FilterBank = 0 ; //过滤器0
293+ /*For single CAN instance(14 dedicated filter banks),
294+ this parameter must be a number between Min_Data = 0 and Max_Data = 13.
295+ For dual CAN instances(28 filter banks shared),
296+ this parameter must be a number between Min_Data = 0 and Max_Data = 27.*/
297+ CAN_FilterInit_Handler .FilterMode = CAN_FILTERMODE_IDMASK ; //屏蔽位模式
298+ CAN_FilterInit_Handler .FilterScale = CAN_FILTERSCALE_32BIT ;
299+ CAN_FilterInit_Handler .FilterIdHigh = 0x0000 ;
300+ CAN_FilterInit_Handler .FilterIdLow = 0x0000 ;
301+ CAN_FilterInit_Handler .FilterMaskIdHigh = 0x0000 ; //32位MASK (都是0表示不关心特定的接收ID,来者都收或者由接收函数再设定)
302+ CAN_FilterInit_Handler .FilterMaskIdLow = 0x0000 ;
303+ CAN_FilterInit_Handler .FilterFIFOAssignment = CAN_FILTER_FIFO0 ; //过滤器0关联到FIFO0
304+ CAN_FilterInit_Handler .FilterActivation = CAN_FILTER_ENABLE ; //激活过滤器0
305+
306+ HAL_CAN_ConfigFilter (& CAN1_Handler , & CAN_FilterInit_Handler ); //滤波器初始化
307+
308+ #if CAN1_RX0_INT_ENABLE
309+ //FIFO 0 message pending Interrupt
310+ HAL_CAN_ActivateNotification (& CAN1_Handler , CAN_IT_RX_FIFO0_MSG_PENDING );
311+ //CAN1 RX0 Interrupt
312+ HAL_NVIC_SetPriority (CAN1_RX0_IRQn , 2 , 0 );
313+ HAL_NVIC_EnableIRQ (CAN1_RX0_IRQn );
314+ #endif
315+
316+ #if CAN1_TX_INT_ENABLE
317+ //Transmit mailbox empty Interrupt
318+ HAL_CAN_ActivateNotification (& CAN1_Handler , CAN_IT_TX_MAILBOX_EMPTY );
319+ //CAN1 TX Interrupt
320+ HAL_NVIC_SetPriority (CAN1_TX_IRQn , 2 , 0 );
321+ HAL_NVIC_EnableIRQ (CAN1_TX_IRQn );
322+ #endif
323+
324+ //启动CAN1
325+ HAL_CAN_Start (& CAN1_Handler );
282326
283- void CAN_Config ( void );
327+ }
284328
285329void HAL_CAN_MspInit (CAN_HandleTypeDef * canHandle )
286330{
287331
288332 GPIO_InitTypeDef GPIO_InitStruct = {0 };
289- if (canHandle -> Instance == CAN1 )
333+ if (canHandle -> Instance == CAN1 )
290334 {
291335 /* CAN1 clock enable */
292336 __HAL_RCC_CAN1_CLK_ENABLE ();
293-
337+
294338 __HAL_RCC_GPIOB_CLK_ENABLE ();
295339 /**CAN1 GPIO Configuration
296340 PB8 ------> CAN1_RX
@@ -309,16 +353,6 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
309353 GPIO_InitStruct .Speed = GPIO_SPEED_FREQ_VERY_HIGH ;
310354 GPIO_InitStruct .Alternate = GPIO_AF9_CAN1 ;
311355 HAL_GPIO_Init (GPIOB , & GPIO_InitStruct );
312-
313- #if CAN1_RX0_INT_ENABLE
314- /* CAN1 interrupt Init */
315- HAL_NVIC_SetPriority (CAN1_RX0_IRQn , 2 , 0 ); //默认使用FIFO0,所以启用FIFO0接收中断
316- HAL_NVIC_EnableIRQ (CAN1_RX0_IRQn );
317- // HAL_NVIC_SetPriority(CAN1_RX1_IRQn, 2, 0); //默认不启用FIFO1接收中断
318- // HAL_NVIC_EnableIRQ(CAN1_RX1_IRQn);
319- #endif
320-
321- CAN_Config ();
322356 }
323357}
324358
@@ -333,7 +367,7 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
333367 HAL_CAN_IRQHandler (& CAN1_Handler );
334368 }
335369
336- //Receive FIFO 0 message pending interrupt
370+ //Receive FIFO 0 message pending interrupt callback
337371 void HAL_CAN_RxFifo0MsgPendingCallback (CAN_HandleTypeDef * hcan )
338372 {
339373 if (hcan == (& CAN1_Handler ))
@@ -342,97 +376,138 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* canHandle)
342376 HAL_CAN_GetRxMessage (& CAN1_Handler , CAN_RX_FIFO0 , & CAN1_IT_RxMessage , CAN1_IT_Rxdata );
343377 }
344378 }
345-
346-
347379#endif
348380
349381//void CAN1_RX1_IRQHandler(void)
350382//{
351383// HAL_CAN_IRQHandler(&CAN1_Handler);
352384//}
385+
353386
354- void CAN_Config (void )
355- {
356- CAN_FilterTypeDef sFilterConfig ;
357-
358- /*配置CAN过滤器*/
359- sFilterConfig .FilterBank = 0 ; //过滤器0
360- sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ; //屏蔽位模式
361- sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
362- sFilterConfig .FilterIdHigh = 0x0000 ; //32位ID
363- sFilterConfig .FilterIdLow = 0x0000 ;
364- sFilterConfig .FilterMaskIdHigh = 0x0000 ; //32位MASK,都是0表示不关心特定的接收ID
365- sFilterConfig .FilterMaskIdLow = 0x0000 ;
366- sFilterConfig .FilterFIFOAssignment = CAN_RX_FIFO0 ;//过滤器0关联到FIFO0
367- sFilterConfig .FilterActivation = ENABLE ; //激活滤波器0
368- sFilterConfig .SlaveStartFilterBank = 14 ;
369-
370- //过滤器配置
371- HAL_CAN_ConfigFilter (& CAN1_Handler , & sFilterConfig );
372-
373- //启动CAN外围设备
374- HAL_CAN_Start (& CAN1_Handler );
387+ #if CAN1_TX_INT_ENABLE
388+ CAN_TxHeaderTypeDef CAN1_IT_TxMessage ; //CAN1从中断发送数据的结构体
389+ u8 CAN1_IT_TxMessage_flag ; //CAN1发送完毕标志位
390+ u8 CAN1_IT_TxMessage_data [8 ]; //CAN1发送中断的8位数据
391+ u32 CAN1_IT_TxMessage_id ; //CAN1发送中断的id
392+
393+ //Transmit mailbox empty Interrupt
394+ void CAN1_TX_IRQHandler (void )
395+ {
396+ HAL_CAN_IRQHandler (& CAN1_Handler );
397+ }
398+
399+ //Transmission Mailbox 0 complete callback
400+ void HAL_CAN_TxMailbox0CompleteCallback (CAN_HandleTypeDef * hcan )
401+ {
402+ if (hcan == (& CAN1_Handler ))
403+ {
404+ CAN1_IT_TxMessage_flag = 1 ;
405+ //关闭发送中断,等待下一次用户填好数据手动开启
406+ HAL_CAN_DeactivateNotification (& CAN1_Handler ,CAN_IT_TX_MAILBOX_EMPTY );
407+ }
408+ }
409+
410+ //Transmission Mailbox 1 complete callback
411+ void HAL_CAN_TxMailbox1CompleteCallback (CAN_HandleTypeDef * hcan )
412+ {
413+ if (hcan == (& CAN1_Handler ))
414+ {
415+ CAN1_IT_TxMessage_flag = 1 ;
416+ //关闭发送中断,等待下一次用户填好数据手动开启
417+ HAL_CAN_DeactivateNotification (& CAN1_Handler ,CAN_IT_TX_MAILBOX_EMPTY );
418+ }
419+ }
420+
421+ //Transmission Mailbox 2 complete callback
422+ void HAL_CAN_TxMailbox2CompleteCallback (CAN_HandleTypeDef * hcan )
423+ {
424+ if (hcan == (& CAN1_Handler ))
425+ {
426+ CAN1_IT_TxMessage_flag = 1 ;
427+ //关闭发送中断,等待下一次用户填好数据手动开启
428+ HAL_CAN_DeactivateNotification (& CAN1_Handler ,CAN_IT_TX_MAILBOX_EMPTY );
429+ }
430+ }
431+
432+ #endif
375433
376- #if CAN1_RX0_INT_ENABLE
377- //激活RX通知,即使能中断
378- HAL_CAN_ActivateNotification (& CAN1_Handler , CAN_IT_RX_FIFO0_MSG_PENDING );
379- #endif
380- }
381434
382435//设置期望接收特定的类型帧和ID的信息
383436//care:0表示任何ID都接收,1表示只接受与FilterId一致的ID的消息
437+ //FilterNumber:要设置的滤波器编号,It ranges from 0 to 13
384438//frameType:期望接收帧的类型,0为标准帧(ID为11位),1为扩展帧(ID为29位)
385- //FilterId :期望接收的ID
439+ //ExceptId :期望接收的ID
386440//默认消息类型为数据帧
387- void CAN1_setExceptId (u8 care ,u8 frameType ,u32 FilterId )
441+ void CAN1_setExceptId (u8 care ,u8 FilterNumber , u8 frameType ,u32 ExceptId )
388442{
389443 CAN_FilterTypeDef sFilterConfig ; //配置过滤器
390444 if (care == 0 )
391445 {
392- sFilterConfig .FilterBank = 0 ; //过滤器0
393- sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ; //屏蔽位模式
446+ sFilterConfig .FilterBank = FilterNumber ; //过滤器编号
447+ sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ; //屏蔽位模式
394448 sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
395- sFilterConfig .FilterIdHigh = 0x0000 ; //32位ID
449+ sFilterConfig .FilterIdHigh = 0x0000 ; //32位ID
396450 sFilterConfig .FilterIdLow = 0x0000 ;
397- sFilterConfig .FilterMaskIdHigh = 0x0000 ; //32位MASK,都是0表示不关心特定的接收ID
451+ sFilterConfig .FilterMaskIdHigh = 0x0000 ; //32位MASK,都是0表示不关心特定的接收ID
398452 sFilterConfig .FilterMaskIdLow = 0x0000 ;
399- sFilterConfig .FilterFIFOAssignment = CAN_RX_FIFO0 ;//过滤器0关联到FIFO0
400- sFilterConfig .FilterActivation = ENABLE ; //激活滤波器0
401- sFilterConfig .SlaveStartFilterBank = 14 ;
453+ sFilterConfig .FilterFIFOAssignment = CAN_FILTER_FIFO0 ; //过滤器0关联到FIFO0
454+ sFilterConfig .FilterActivation = CAN_FILTER_ENABLE ; //激活滤波器0
402455 HAL_CAN_ConfigFilter (& CAN1_Handler , & sFilterConfig );
456+
403457 }else
404458 {
405459 if (frameType == CAN_ID_STD ) //只接受标准数据帧
406460 {
407- sFilterConfig .FilterBank = 0 ;
461+ sFilterConfig .FilterBank = FilterNumber ;
408462 sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ;
409463 sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
410- sFilterConfig .FilterIdHigh = ((FilterId << 21 ) & 0xffff0000 ) >> 16 ;
411- sFilterConfig .FilterIdLow = ((FilterId << 21 ) | CAN_ID_STD | CAN_RTR_DATA ) & 0xffff ;
464+ sFilterConfig .FilterIdHigh = ((ExceptId << 21 ) & 0xffff0000 ) >> 16 ;
465+ sFilterConfig .FilterIdLow = ((ExceptId << 21 ) | CAN_ID_STD | CAN_RTR_DATA ) & 0xffff ;
412466 sFilterConfig .FilterMaskIdHigh = 0xFFFF ;
413467 sFilterConfig .FilterMaskIdLow = 0xFFFF ;
414- sFilterConfig .FilterFIFOAssignment = CAN_RX_FIFO0 ;
415- sFilterConfig .FilterActivation = ENABLE ;
468+ sFilterConfig .FilterFIFOAssignment = CAN_FILTER_FIFO0 ;
469+ sFilterConfig .FilterActivation = CAN_FILTER_ENABLE ;
416470 HAL_CAN_ConfigFilter (& CAN1_Handler , & sFilterConfig );
417471 }else //只接受扩展数据帧
418472 {
419- sFilterConfig .FilterBank = 0 ;
473+ sFilterConfig .FilterBank = FilterNumber ;
420474 sFilterConfig .FilterMode = CAN_FILTERMODE_IDMASK ;
421475 sFilterConfig .FilterScale = CAN_FILTERSCALE_32BIT ;
422- sFilterConfig .FilterIdHigh = ((FilterId << 3 ) & 0xffff0000 ) >> 16 ;
423- sFilterConfig .FilterIdLow = ((FilterId << 3 ) | CAN_ID_EXT | CAN_RTR_DATA ) & 0xffff ;
476+ sFilterConfig .FilterIdHigh = ((ExceptId << 3 ) & 0xffff0000 ) >> 16 ;
477+ sFilterConfig .FilterIdLow = ((ExceptId << 3 ) | CAN_ID_EXT | CAN_RTR_DATA ) & 0xffff ;
424478 sFilterConfig .FilterMaskIdHigh = 0xFFFF ;
425479 sFilterConfig .FilterMaskIdLow = 0xFFFF ;
426- sFilterConfig .FilterFIFOAssignment = CAN_RX_FIFO0 ;
427- sFilterConfig .FilterActivation = ENABLE ;
480+ sFilterConfig .FilterFIFOAssignment = CAN_FILTER_FIFO0 ;
481+ sFilterConfig .FilterActivation = CAN_FILTER_ENABLE ;
428482 HAL_CAN_ConfigFilter (& CAN1_Handler , & sFilterConfig );
429483 }
430-
431484 }
432485}
433486
487+ /*
488+ 给 *TxMessage设置内容,不发送
489+ 返回:0正确,其他错误
490+ */
491+ u8 CAN1_Set_Msg (CAN_TxHeaderTypeDef * TxMessage ,u8 len ,u8 frameType ,u32 id )
492+ {
493+ if ((len <= 0 ) || (len > 8 ) || (TxMessage == NULL ))return 1 ;
494+
495+ if (frameType == CAN_ID_STD )
496+ {
497+ TxMessage -> IDE = CAN_ID_STD ; // 使用标准标识符
498+ TxMessage -> StdId = id ; // 设置标准标识符 (11位)
499+ }else {
500+ TxMessage -> IDE = CAN_ID_EXT ; // 使用扩展标识符
501+ TxMessage -> ExtId = id ; // 设置扩展标示符 (29位)
502+ }
503+
504+ TxMessage -> RTR = CAN_RTR_DATA ; // 消息类型为数据帧 (数据帧或者遥控帧:CAN_RTR_Data 或者 CAN_RTR_Remote)
505+ TxMessage -> DLC = len ; // 发送几字节信息 (小于等于8)
506+
507+ return 0 ;
508+ }
434509
435- //can发送一组数据
510+ //无中断模式, can发送一组数据
436511//msg:数据指针,最大为8个字节
437512//len:数据长度(最大为8)
438513//frameType:帧类型,0为标准帧(ID为11位),1为扩展帧(ID为29位)
@@ -447,7 +522,7 @@ u8 CAN1_Send_Msg(u8* msg,u8 len,u8 frameType,u32 id)
447522 CAN_TxHeaderTypeDef TxHeader ; //发送数据结构体
448523 u32 TxMailbox ;
449524
450- if ((msg == NULL ) || (len = = 0 ) || (len > 8 )) return HAL_ERROR ;
525+ if ((msg == NULL ) || (len < = 0 ) || (len > 8 )) return HAL_ERROR ;
451526
452527 if (frameType == CAN_ID_STD )
453528 {
@@ -470,44 +545,48 @@ u8 CAN1_Send_Msg(u8* msg,u8 len,u8 frameType,u32 id)
470545 return HAL_ERROR ;
471546 }
472547 i = 0 ;
473- while ((HAL_CAN_GetTxMailboxesFreeLevel (& CAN1_Handler ) != 3 )&& (i < 0xffff )) {i ++ ;}
548+
549+ //Check if a transmission request is pending on the selected Tx Mailboxes
550+ while ( ( HAL_CAN_IsTxMessagePending (& CAN1_Handler , TxMailbox ) ) && ( i < 0xfff ) ) {i ++ ;}
551+ if (i >= 0xfff ) return HAL_TIMEOUT ;
474552 return HAL_OK ;
475553}
476554
477- //can口接收数据查询,不使用中断方式时的使用
478- //buf:数据缓存区,最大为8个字节
479- //len: 数据长度(最大为8)
555+ //无中断模式,can口接收数据查询
556+ //buf:数据缓存区;
557+ //len: 数据长度(字节数,8以内)
480558//frameType:帧类型,0为标准帧(ID为11位),1为扩展帧(ID为29位)
481559//id:ID标识符,若frameType为0,则为标准标识符,若frameType为其他则为扩展标识符
482560//返回值:0,有数据被收到;
483- // 其他,没有接收到数据 ;
484- u8 CAN1_Receive_Msg (u8 * buf ,u8 * len ,u8 * frameType ,u32 * id )
561+ // 其他,无数据接收到 ;
562+ u8 CAN1_Receive_Msg (u8 * buf ,u8 * len , u8 * frameType ,u32 * id )
485563{
486564 CAN_RxHeaderTypeDef RxHeader ;
487565 u8 i ;
488- u8 RxData [8 ];
566+ u8 RxData [8 ];
489567
568+ //Return Number of messages available in Rx FIFO
490569 if (HAL_CAN_GetRxFifoFillLevel (& CAN1_Handler , CAN_RX_FIFO0 ) == 0 ) //没有接收到数据,直接退出
491570 {
492571 return HAL_ERROR ;
493572 }
494-
573+
495574 if (HAL_CAN_GetRxMessage (& CAN1_Handler , CAN_RX_FIFO0 , & RxHeader , RxData ) != HAL_OK )
496575 {
497576 return HAL_ERROR ;
498577 }
499578
500- for (i = 0 ;i < RxHeader .DLC ;i ++ )
501- buf [i ]= RxData [i ];
502-
503579 * len = RxHeader .DLC ;
504580
581+ for (i = 0 ;i < RxHeader .DLC ; i ++ )
582+ buf [i ] = RxData [i ];
583+
505584 if (RxHeader .IDE == CAN_ID_STD )
506585 {
507586 * frameType = CAN_ID_STD ;
508587 * id = RxHeader .StdId ;
509588 }else {
510- * frameType = 1 ;
589+ * frameType = CAN_ID_EXT ;
511590 * id = RxHeader .ExtId ;
512591 }
513592
0 commit comments