@@ -637,18 +637,41 @@ uint8_t ADBMS6830B_rdaux(uint8_t total_ic, // The number of ICs in the system
637637 return 1 ;
638638 }
639639
640+ // Match rdcv/rdsv/rdsid: ensure the daisy chain is awake before the first
641+ // command or the leading frames can be dropped on a sleeping chain.
642+ wakeup_sleep (total_ic );
643+
640644 // RDAUXA: GPIO1-3 -> a_codes[0..2]
641645 transmitCMDR (RDAUXA , cell_data , NUM_RX_BYT * total_ic );
642646 for (int i = 0 ; i < total_ic ; i ++ )
643647 {
644- memcpy (& ic [i ].aux .a_codes [0 ], cell_data + i * NUM_RX_BYT , 6 );
648+ uint8_t * ic_data = cell_data + i * NUM_RX_BYT ;
649+ memcpy (& ic [i ].aux .a_codes [0 ], ic_data , 6 );
650+
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 ];
656+ bool mismatch = (calc_pec != rx_pec );
657+ ic [i ].aux .pec_match [0 ] = mismatch ? 1 : 0 ;
658+ if (mismatch )
659+ pec_error ++ ;
645660 }
646661
647662 // RDAUXB: GPIO4-6 -> a_codes[3..5]
648663 transmitCMDR (RDAUXB , cell_data , NUM_RX_BYT * total_ic );
649664 for (int i = 0 ; i < total_ic ; i ++ )
650665 {
651- memcpy (& ic [i ].aux .a_codes [3 ], cell_data + i * NUM_RX_BYT , 6 );
666+ uint8_t * ic_data = cell_data + i * NUM_RX_BYT ;
667+ memcpy (& ic [i ].aux .a_codes [3 ], ic_data , 6 );
668+
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 ];
671+ bool mismatch = (calc_pec != rx_pec );
672+ ic [i ].aux .pec_match [1 ] = mismatch ? 1 : 0 ;
673+ if (mismatch )
674+ pec_error ++ ;
652675 }
653676
654677 vPortFree (cell_data );
0 commit comments