5.3 KiB
5.3 KiB
GB/T + J1939 Debug Flow (CAN ExtId)
Документ для ручного дебага обмена EV <-> EVSE по CAN (J1939 TP + short PGN).
1) Базовая структура CAN Extended ID (29-bit)
В проекте используется формула:
ExtId = (priority << 26) | (PGN << 8) | (SA << 8) | DA
Где:
priority— обычно6или7PGN— Parameter Group NumberSA— Source AddressDA— Destination Address
Адреса в ваших прошивках:
EVSE (SE)=0x56EV=0xF4
Примеры:
0x181056F4-> short PGN0x1000(BCL),SA=0x56,DA=0xF40x1CEC56F4-> TP.CM от0x56к0xF40x1CECF456-> TP.CM от0xF4к0x560x1CEB56F4-> TP.DT от0x56к0xF4
2) Какие PGN short, какие TP
Short (<=8 байт, один CAN кадр):
0x0900BRO0x0A00CRO0x1000BCL (5 байт)0x1200CCS0x1300BSM (7 байт)0x1A00CST
Через TP (>8 байт):
0x0200BRM (49 байт)0x0600BCP (13 байт)0x1100BCS (9 байт)
3) Нормальная последовательность (высокоуровнево)
- Handshake/recognition:
- CHM/CRM/BRM/BCP/CML/BRO/CRO
- Переход в заряд:
- EVSE
S8 -> S9 - EV начинает слать BCL/BSM/BCS
- EVSE принимает BCL и переходит
S9 -> S10
- Во время зарядки:
- EV регулярно шлет:
- BCL (short)
- BSM (short)
- BCS (TP,
PGN=0x1100)
- EVSE регулярно шлет CCS
4) Нормальная TP-сессия для BCS (PGN=0x1100, size=9, packets=2)
Шаг 1: RTS (originator -> responder)
ID:
- от EV к EVSE:
1CEC F4 56(0x1CECF456)
Data (TP.CM_RTS):
byte0 = 0x10(RTS)byte1..2 = total_size(LSB/MSB), для BCS:0x09 0x00byte3 = total_packets, для BCS:0x02byte4 = max_packets_per_CTS(часто0x02)byte5..7 = PGNв little-endian (00 11 00для0x1100)
Шаг 2: CTS (responder -> originator)
ID:
- от EVSE к EV:
1CEC 56 F4(0x1CEC56F4)
Data (TP.CM_CTS):
byte0 = 0x11(CTS)byte1 = allowed_packet_countbyte2 = next_packet_number(обычно1для новой сессии)byte3..4 = 0xFFbyte5..7 = PGN(00 11 00)
Шаг 3: DT (originator -> responder)
ID:
1CEB F4 56(EV -> EVSE)
Data (TP.DT):
byte0 = seq(1, потом2)byte1..7 = payload chunk
Для 9 байт:
- DT#1 несет первые 7 байт
- DT#2 несет оставшиеся 2 байта + заполнение
0xFF
Шаг 4: ACK (responder -> originator)
ID:
1CEC 56 F4(EVSE -> EV)
Data (TP.CM_EndOfMsgACK):
byte0 = 0x13(ACK)byte1..2 = total_size(09 00)byte3 = total_packets(02)byte4 = 0xFFbyte5..7 = PGN(00 11 00)
5) Как понять по логу, что сессия "правильная"
Для каждого RTS(0x1100) должен быть полный шаблон:
RTS->CTS->DT #1->DT #2->ACK
Если есть RTS, но нет CTS:
- проблема на стороне responder (EVSE) TX/фильтр/перегрузка
Если есть CTS, но нет DT:
- проблема на стороне originator (EV) RX/парсинг/состояние
Если есть DT, но нет ACK:
- проблема на стороне responder reassembly/timeout
6) Поля основных GB/T пакетов (payload)
BCL (PGN 0x1000, short, 5 bytes)
Структура:
requestedVoltage(uint16, 0.1V/bit)requestedCurrent(uint16, 0.1A/bit, в вашем коде может интерпретироваться как4000 - value)chargingMode(uint8,0x01CV,0x02CC)
BCS (PGN 0x1100, TP, 9 bytes)
Структура:
measuredChargingVoltage(uint16)measuredChargingCurrent(uint16)highestVoltageOfBatteryCell(uint16)currentChargeState(uint8)estimatedRemainingChargingTime(uint16)
BSM (PGN 0x1300, short, 7 bytes)
Структура:
- max/temperature индексы и статусы:
singleBatteryHighestVoltageSerNobatteryHighestTempbatteryHighestTempSerNobatteryLowestTempbatteryLowestTempSerNobatteryCellVoltageStatebatteryStatus
7) Тайминги TP из J1939 (важное для дебага)
Ключевые reference значения:
Tr = 200 msTh = 500 msT1 = 750 msT2 = 1250 msT3 = 1250 msT4 = 1050 ms
Практически:
- если responder выдал CTS, originator не должен задерживать DT дольше допусков
- если originator отправил RTS/DT, responder должен ответить CTS/ACK в окне таймаутов
8) Мини-чеклист при "вдруг стопнулось"
- Найти последний
RTSпоPGN=0x1100. - Проверить, был ли
CTSна шине с тем жеPGN. - Проверить наличие
DT#1/#2. - Проверить
ACK. - Если цепочка оборвалась:
- зафиксировать на каком шаге;
- сопоставить с UART логом state machine (
S9/S10,TP timeout,BCS timeout).