version: 4.0.0 source: project: Seat_Controller_demo specification: firmware/t2g/Seat_Controller_demo/Docs/座椅控制器_CAN_测试规范.md test_status: firmware/t2g/Seat_Controller_demo/Docs/HIL_TEST_STATUS_2026-07-30.md verified_on: 2026-07-30 scope: t2g_primary_seat_four_motor_protocol hardware_execution_allowed: true bit_numbering: lsb0 byte_order: intel_little_endian limitations: - M0/M1/M2/M3 are one physical seat's horizontal, seat-pan, backrest and legrest axes. - Absolute position requires a valid SMV8 position; known-range homing is a separately gated maintenance action. - Current diagnostics are calibrated for observability; production over-current thresholds remain unverified. messages: - name: T2G_Seat_Move_Command_300 frame_id: 0x300 role: command minimum_payload_bytes: 8 hardware_send_allowed: true signals: - {name: Opcode, start_bit: 0, bit_length: 8} - {name: Motor_Selector, start_bit: 8, bit_length: 2} - {name: Direction, start_bit: 10, bit_length: 2} - {name: Protocol_Version, start_bit: 12, bit_length: 2} - {name: Sequence, start_bit: 16, bit_length: 16} - {name: Param_A, start_bit: 32, bit_length: 16} - {name: Param_B, start_bit: 48, bit_length: 16} - name: T2G_Seat_Move_System_Status_301 frame_id: 0x301 role: feedback minimum_payload_bytes: 8 signals: - {name: Ack, start_bit: 0, bit_length: 4} - {name: System_State, start_bit: 4, bit_length: 4} - {name: Reject_Reason, start_bit: 8, bit_length: 8} - {name: Last_Sequence, start_bit: 16, bit_length: 16} - {name: Last_Opcode, start_bit: 32, bit_length: 8} - {name: Active_Mask, start_bit: 40, bit_length: 4} - {name: Safety_Inhibit, start_bit: 44, bit_length: 1} - {name: Calibration_Busy, start_bit: 46, bit_length: 1} - {name: Fault_Summary, start_bit: 47, bit_length: 1} - {name: Faulted_Mask, start_bit: 48, bit_length: 4} - {name: Position_Valid_Mask, start_bit: 52, bit_length: 4} - {name: Alive, start_bit: 56, bit_length: 4} - {name: Firmware_Revision, start_bit: 60, bit_length: 4} - name: T2G_Seat_Move_Motor_Status_302 frame_id: 0x302 role: feedback minimum_payload_bytes: 8 signals: - {name: Motor_Sub_ID, start_bit: 0, bit_length: 8} - {name: Task_State, start_bit: 8, bit_length: 4} - {name: Result, start_bit: 12, bit_length: 4} - {name: Direction, start_bit: 16, bit_length: 2} - {name: Active, start_bit: 18, bit_length: 1} - {name: Position_Valid, start_bit: 19, bit_length: 1} - {name: Near_Endpoint, start_bit: 20, bit_length: 1} - {name: Far_Endpoint, start_bit: 21, bit_length: 1} - {name: Stall, start_bit: 22, bit_length: 1} - {name: Driver_Fault, start_bit: 23, bit_length: 1} - {name: Motor_Sequence, start_bit: 24, bit_length: 16} - {name: Value_X100, start_bit: 40, bit_length: 16} - {name: Duty_Percent, start_bit: 56, bit_length: 8} - name: T2G_Seat_Move_Diagnostic_303 frame_id: 0x303 role: feedback minimum_payload_bytes: 8 signals: - {name: Motor_Sub_ID, start_bit: 0, bit_length: 8} - {name: Last_Motor_Event, start_bit: 8, bit_length: 4} - {name: Fault_Flags, start_bit: 12, bit_length: 4} - {name: Hall_Count, start_bit: 16, bit_length: 16} - {name: Max_Hall_Count, start_bit: 32, bit_length: 16} - {name: Hall_Speed_Half_Pps, start_bit: 48, bit_length: 8} - {name: Retry_Count, start_bit: 56, bit_length: 4} - {name: Diagnostic_Alive, start_bit: 60, bit_length: 4} - name: T2G_Seat_Move_Current_Diagnostic_304 frame_id: 0x304 role: feedback minimum_payload_bytes: 8 signals: - {name: Motor_Sub_ID, start_bit: 0, bit_length: 8} - {name: Current_Sample_Valid, start_bit: 8, bit_length: 1} - {name: Current_Baseline_Valid, start_bit: 9, bit_length: 1} - {name: High_Current, start_bit: 10, bit_length: 1} - {name: Hall_Activity_Low, start_bit: 11, bit_length: 1} - {name: Current_Calibrating, start_bit: 12, bit_length: 1} - {name: Current_Raw, start_bit: 16, bit_length: 16} - {name: Current_Baseline_Raw, start_bit: 32, bit_length: 16} - {name: Stall_Current_Delta_Threshold_Raw, start_bit: 48, bit_length: 16} - name: T2G_Seat_Dynamic_Mode_Status_306 frame_id: 0x306 role: feedback minimum_payload_bytes: 8 signals: - {name: Dynamic_Mode_ID, start_bit: 0, bit_length: 8} - {name: Dynamic_State, start_bit: 8, bit_length: 8} - {name: Dynamic_Phase, start_bit: 16, bit_length: 8} - {name: Dynamic_Active_Mask, start_bit: 24, bit_length: 4} - {name: Dynamic_Fault_Mask, start_bit: 28, bit_length: 4} - {name: Dynamic_Cycle_Index, start_bit: 32, bit_length: 16} - {name: Dynamic_Phase_Elapsed_Ms, start_bit: 48, bit_length: 16} - name: T2G_Seat_Thermal_Current_Diagnostic_305 frame_id: 0x305 role: feedback minimum_payload_bytes: 8 signals: - {name: Fan_Current_Sample_Valid, start_bit: 0, bit_length: 1} - {name: Heater_Current_Sample_Valid, start_bit: 1, bit_length: 1} - {name: Fan_Running, start_bit: 8, bit_length: 1} - {name: Heater_Level, start_bit: 9, bit_length: 2} - {name: Fan_Current_Raw, start_bit: 16, bit_length: 16} - {name: Heater_Current_Raw, start_bit: 32, bit_length: 16} - {name: Fan_Adc_Error_Count, start_bit: 48, bit_length: 8} - {name: Heater_Adc_Error_Count, start_bit: 56, bit_length: 8}