@@ -467,9 +467,10 @@ void ADBMS6830B_rdcfga(uint8_t total_ic, // The number of ICs being written to
467467 memcpy (& (ic [bank ].configa .rx_data ), ic_data , 6 );
468468
469469 /* Calculate PEC for this IC's 6 data bytes */
470- /* PEC is big-endian: ic_data[6] is MSB, ic_data[7] is LSB */
471- uint16_t calc_pec = Pec10_calc (false, 6 , ic_data );
472- uint16_t rx_pec = ((uint16_t )ic_data [6 ] << 8 ) | ic_data [7 ];
470+ /* On-wire layout: byte 6 = {CC[5:0], PEC[9:8]}, byte 7 = PEC[7:0].
471+ * Mask 0x03 strips the command counter so only PEC[9:0] is compared. */
472+ uint16_t calc_pec = Pec10_calc (true, 6 , ic_data );
473+ uint16_t rx_pec = ((uint16_t )(ic_data [6 ] & 0x03 ) << 8 ) | ic_data [7 ];
473474 ic [bank ].configa .rx_pec_match = (calc_pec != rx_pec ) ? 1 : 0 ;
474475 }
475476
@@ -522,9 +523,10 @@ void ADBMS6830B_rdcfgb(uint8_t total_ic, // The number of ICs being written to
522523 memcpy (& (ic [bank ].configb .rx_data ), ic_data , 6 );
523524
524525 /* Calculate PEC for this IC's 6 data bytes */
525- /* PEC is big-endian: ic_data[6] is MSB, ic_data[7] is LSB */
526- uint16_t calc_pec = Pec10_calc (false, 6 , ic_data );
527- uint16_t rx_pec = ((uint16_t )ic_data [6 ] << 8 ) | ic_data [7 ];
526+ /* On-wire layout: byte 6 = {CC[5:0], PEC[9:8]}, byte 7 = PEC[7:0].
527+ * Mask 0x03 strips the command counter so only PEC[9:0] is compared. */
528+ uint16_t calc_pec = Pec10_calc (true, 6 , ic_data );
529+ uint16_t rx_pec = ((uint16_t )(ic_data [6 ] & 0x03 ) << 8 ) | ic_data [7 ];
528530 ic [bank ].configb .rx_pec_match = (calc_pec != rx_pec ) ? 1 : 0 ;
529531 }
530532
@@ -648,11 +650,12 @@ uint8_t ADBMS6830B_rdaux(uint8_t total_ic, // The number of ICs in the system
648650 uint8_t * ic_data = cell_data + i * NUM_RX_BYT ;
649651 memcpy (& ic [i ].aux .a_codes [0 ], ic_data , 6 );
650652
651- // PEC is big-endian: ic_data[6] is MSB, ic_data[7] is LSB (same layout
652- // as rdcfga/rdcfgb/rdsid). Record per-IC match so downstream consumers
653- // like check_and_report_pec_errors() can drive redundancy failover.
654- uint16_t calc_pec = Pec10_calc (false, 6 , ic_data );
655- uint16_t rx_pec = ((uint16_t )ic_data [6 ] << 8 ) | ic_data [7 ];
653+ // On-wire layout: byte 6 = {CC[5:0], PEC[9:8]}, byte 7 = PEC[7:0].
654+ // Mask 0x03 strips the command counter so only PEC[9:0] is compared.
655+ // Record per-IC match so downstream consumers like
656+ // check_and_report_pec_errors() can drive redundancy failover.
657+ uint16_t calc_pec = Pec10_calc (true, 6 , ic_data );
658+ uint16_t rx_pec = ((uint16_t )(ic_data [6 ] & 0x03 ) << 8 ) | ic_data [7 ];
656659 bool mismatch = (calc_pec != rx_pec );
657660 ic [i ].aux .pec_match [0 ] = mismatch ? 1 : 0 ;
658661 if (mismatch )
@@ -666,8 +669,8 @@ uint8_t ADBMS6830B_rdaux(uint8_t total_ic, // The number of ICs in the system
666669 uint8_t * ic_data = cell_data + i * NUM_RX_BYT ;
667670 memcpy (& ic [i ].aux .a_codes [3 ], ic_data , 6 );
668671
669- uint16_t calc_pec = Pec10_calc (false , 6 , ic_data );
670- uint16_t rx_pec = ((uint16_t )ic_data [6 ] << 8 ) | ic_data [7 ];
672+ uint16_t calc_pec = Pec10_calc (true , 6 , ic_data );
673+ uint16_t rx_pec = ((uint16_t )( ic_data [6 ] & 0x03 ) << 8 ) | ic_data [7 ];
671674 bool mismatch = (calc_pec != rx_pec );
672675 ic [i ].aux .pec_match [1 ] = mismatch ? 1 : 0 ;
673676 if (mismatch )
@@ -706,9 +709,10 @@ uint8_t ADBMS6830B_rdsid(uint8_t total_ic, // The number of ICs in the system
706709 memcpy (ic [i ].sid , ic_data , 6 );
707710
708711 // Validate PEC for this IC (6 data bytes + 2 PEC bytes)
709- // PEC is big-endian: ic_data[6] is MSB, ic_data[7] is LSB
710- uint16_t calc_pec = Pec10_calc (false, 6 , ic_data );
711- uint16_t rx_pec = ((uint16_t )ic_data [6 ] << 8 ) | ic_data [7 ];
712+ // On-wire layout: byte 6 = {CC[5:0], PEC[9:8]}, byte 7 = PEC[7:0].
713+ // Mask 0x03 strips the command counter so only PEC[9:0] is compared.
714+ uint16_t calc_pec = Pec10_calc (true, 6 , ic_data );
715+ uint16_t rx_pec = ((uint16_t )(ic_data [6 ] & 0x03 ) << 8 ) | ic_data [7 ];
712716 if (calc_pec != rx_pec )
713717 {
714718 pec_error ++ ;
0 commit comments