@@ -704,7 +704,26 @@ int can_write(can_t *obj, CAN_Message msg)
704704 }
705705
706706 TxHeader .TxFrameType = FDCAN_DATA_FRAME ;
707- TxHeader .DataLength = msg .len << 16 ;
707+ switch (msg .len )
708+ {
709+ default :
710+ case 0 : TxHeader .DataLength = FDCAN_DLC_BYTES_0 ; break ;
711+ case 1 : TxHeader .DataLength = FDCAN_DLC_BYTES_1 ; break ;
712+ case 2 : TxHeader .DataLength = FDCAN_DLC_BYTES_2 ; break ;
713+ case 3 : TxHeader .DataLength = FDCAN_DLC_BYTES_3 ; break ;
714+ case 4 : TxHeader .DataLength = FDCAN_DLC_BYTES_4 ; break ;
715+ case 5 : TxHeader .DataLength = FDCAN_DLC_BYTES_5 ; break ;
716+ case 6 : TxHeader .DataLength = FDCAN_DLC_BYTES_6 ; break ;
717+ case 7 : TxHeader .DataLength = FDCAN_DLC_BYTES_7 ; break ;
718+ case 8 : TxHeader .DataLength = FDCAN_DLC_BYTES_8 ; break ;
719+ case 12 : TxHeader .DataLength = FDCAN_DLC_BYTES_12 ; break ;
720+ case 16 : TxHeader .DataLength = FDCAN_DLC_BYTES_16 ; break ;
721+ case 20 : TxHeader .DataLength = FDCAN_DLC_BYTES_20 ; break ;
722+ case 24 : TxHeader .DataLength = FDCAN_DLC_BYTES_24 ; break ;
723+ case 32 : TxHeader .DataLength = FDCAN_DLC_BYTES_32 ; break ;
724+ case 48 : TxHeader .DataLength = FDCAN_DLC_BYTES_48 ; break ;
725+ case 64 : TxHeader .DataLength = FDCAN_DLC_BYTES_64 ; break ;
726+ }
708727 TxHeader .ErrorStateIndicator = FDCAN_ESI_ACTIVE ;
709728 TxHeader .BitRateSwitch = FDCAN_BRS_OFF ;
710729 TxHeader .FDFormat = FDCAN_CLASSIC_CAN ;
@@ -985,4 +1004,4 @@ void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable)
9851004 NVIC_EnableIRQ (FDCAN3_IT1_IRQn );
9861005#endif
9871006#endif
988- }
1007+ }
0 commit comments