Elm327 trimite comenzi lungi la autobuzul cutie

Shr lnm
Eu conduc un Renault Megane II
Moscova, Rusia

Ceea ce voi scrie mai jos este interesant pentru programatorii care vor scrie ceva pentru a lucra cu autobuzul CAN prin ELM327 sau pentru cei foarte entuziasmați care au încercat deja să lucreze cu ELM prin terminal. Dacă, dragi cititori, sunteți mult mai probabil un utilizator obișnuit, atunci nu este nevoie să vă petreceți timpul citind, pentru că această cunoaștere este greu de folos pentru dvs.







Pe lucruri foarte simple, voi locui mai departe și se concentreze pe descrierea modului de a lucra cu diferite unități de pe magistrala CAN (și nu numai cu calculatorul de injecție) și durata pentru a trimite comenzi și să primească răspunsuri lungi. În același timp, voi descrie pe scurt modul în care cadrele de date de pe magistrala CAN sunt aranjate.

La sfârșitul articolului voi da întregul jurnal, dar pentru moment voi analiza procesul de inițiere al ELM

> [17: 03: 57.524] la ws
<[0.025]at ws

>

Toate jurnalele de mai jos vor fi aproximativ în acest format. Semnul ">" indică comenzile de trimitere și în paranteze pătrate, după cum ați ghicit, indicat timpul de expediere la cea mai apropiată milisecundă, iar indicația "<” отмечены отклики ELM и в квадратных скобках указано время отклика в секундах. Т.е. здесь ответ на команду ATWS пришел через 25 миллисекунд.
ATWS folosesc în loc de ATZ, deoarece ATWS nu reseta setările de viteză port COM și la începutul programului poate fi "atenuat" cu comanda ATBRD

>

Aici pornim ecoul

>

Aici, pentru a salva traficul pe portul COM, dezactivați spațiile inutile

>

Aici oprim emisiunea de anteturi de cadre, pentru că nu este nimic interesant pentru noi

>

Salvăm un pic mai mult pe "feed-ul de linie", de asemenea, nu lucrăm manual prin terminal.

Alte comenzi sunt mai interesante.

>

Comanda ATAL permite transferul la busul CAN nu la 7 octeți, așa cum sa făcut în mod implicit, și 8. Cadrul CAN nu primește mai mult de 8 octeți, primul care are un înțeles special și nu aparține datelor în sine. În mod implicit, acest octet înlocuiește ELM însuși, iar acest proces se numește "CAN autoformatting", care va fi discutat în continuare.
Cele mai vechi 4 biți ai acestui byte pot avea valoarea 0, 1, 2 sau 3 (acest lucru nu se aplică cadrelor de sistem, unde primul octet al cadrului poartă date și, prin urmare, poate avea orice valoare)
"0" înseamnă că acesta este singurul cadru din secvență, iar în cele 4 biți inferior indică lungimea comenzii (dar nu mai mult de 7)
"1" înseamnă că acesta este primul cadru al secvenței care transmite o comandă lungă. Toate cele de mai jos vor începe cu "2". Cele mai mici 4 biți ale acestui octet și întregul octet următor suportă lungimea comenzii. Din aceasta rezultă că o comandă nu poate conține mai mult de 4095 octeți, ceea ce înseamnă că în primul cadru avem doar 6 octeți pentru date
„2“ este plasată la începutul fiecărui cadru următor în secvență, și inferioare 4 biți aici cuprind contoare ciclic de funcționare, care pot fi monitorizate prin pierdere (deși nu este rândul său de cale 16 pierderi consecutive, dar acest lucru este extrem de improbabil)
"3" înseamnă că acest cadru este FlowControl. Nu există date în acesta, ci numai informații despre serviciul de control al fluxului de date.

Aici mă voi concentra imediat asupra conținutului cadrului FlowControl. Există numai 3 octeți semnificativi și sunt trimise de partea care primește.
1 octet - cei 4 biți mai mari conțin "3" (după cum deja știm) și cei 4 biți inferiori pot lua următoarele valori (0 = Clear To Send, 1 = Wait, 2 = Overflow /
2 octeți - numărul de cadre BS (dimensiunea blocului sau dimensiunea de spargere) pe care partea de expediere le poate trimite una după alta fără a aștepta următorul cadru FlowControl din partea de primire
3 octeți - STmin (timpul de separare minim) sau timpul minim permis între următoarele cadre în milisecunde. Acest octet poate lua valori de la 0x00 la 0xF9, iar în cazul în care valoarea este mai mică decât o milisecundă 0xF1-l, iar în cazul în care valoarea 0xF1 la 0xF9, atunci ultima cifră include sute de milisecunde. Deci 0xF1 - 100 ms și 0xF9 - 900 ms. Cu toate acestea, rețineți că aceasta este valoarea minimă cerută de partea care primește, dar puteți trimite cadre mai rar.

> [17: 03: 57.629] la caf0
<[0.016]at caf0
în regulă

>

ATCAF0 dezactivează formatarea automată a cadrelor pentru magistrala CAN. Aceasta înseamnă că pentru a împărți comanda noastră lungă în cadre și a înlocui primul octet, despre care tocmai am vorbit, vom fi de acum încolo noi.

> [17: 03: 57.645] la cfc0
<[0.016]at cfc0
în regulă

ATCFC0 dezactivează procesarea automată a cadrelor FlowControl. În majoritatea cazurilor, nu este necesar să se includă un astfel de mod. În mod normal, ELM corecte face față acestei sarcini, iar trimiterea de comenzi lungi este obișnuită fără acest lucru (dacă partea de primire este suficient de rapidă), dar nu puteți obține un răspuns lung din cauza vitezei limitate a portului COM.







Acum continuați configurarea CAN pentru a lucra cu tabloul de bord.

> [17: 03: 57.677] la Craciun 763
<[0.016]at cra 763
în regulă

>

Personalizate RX Filtru pe ID-CAN = 0h763, acest ID CAN va veni răspunsuri la întrebările noastre de pe tabloul de bord, și astfel încât să nu distragă atenția cadrelor sistem de procesare a ELM ne indică în mod explicit în cazul în care aveți nevoie să așteptați pentru răspunsuri.

> [17: 03: 57.693] la fc sh 743
<[0.016]at fc sh 743
în regulă

Aici am început să configurăm parametrii pentru FlowControl automat. În acest caz, acest lucru este inutil, deoarece am dezactivat anterior funcția de automatizare FC, dar pentru comanda pe care o vom ajusta. ATFCSH stabilește ID-ul CAN pentru trimiterea cadrelor FlowControl și este egal cu ceea ce punem în comanda ATSH

> [17: 03: 57.709] la fc sd 30 00 00
<[0.016]at fc sd 30 00 00
în regulă

Aici este setată valoarea implicită a cadrelor trimise FC. BS = 0 înseamnă că suntem gata să acceptăm orice număr de cadre. STmin = 0 înseamnă că suntem gata să le primim la orice interval, cât mai repede posibil, așa cum poate trimite tabloul de bord.

> [17: 03: 57.725] la fc sm 1
<[0.016]at fc sm 1
în regulă

ATFCSM1 înseamnă că ELM ar trebui să fie ghidată de parametrii FC pe care tocmai l-am instalat.

> [17: 03: 57.741] la st ff
<[0.016]at st ff
în regulă

Setarea cronometrului intern ELM, timp în care așteaptă un răspuns din partea ECU. Valoarea acestui cronometru este ajustată automat de ELM pentru a asigura un timp de răspuns optim. ELM, din anumite motive, nu se uită în interiorul cadrelor, și anume la primul octet, altfel ar ști "când vor fi recepționate toate cadrele de răspuns și când transferul va fi finalizat. În schimb, ELM are acest timer și o optimizează dinamic, deși este posibilă dezactivarea acestei reglări automate și, uneori, este necesară.

> [17: 03: 57.757] la 0
<[0.016]at at 0
în regulă

>

Dezactivați temporizarea adaptivă, adică ajustarea timer-ului st, pe care îl punem mai sus în valoarea maximă. Avem nevoie de aceasta pentru a inițializa protocolul, pe care îl vom face în continuare și doar pentru ao reseta, pe măsură ce trecem la lucrul cu noul bloc.

> [17: 03: 57.773] la sp 6
<[0.016]at sp 6
în regulă

Aici am trecut modulul ELM la modul de funcționare a magistralei CAN cu o viteză de 500 Kbit / s. (În același timp, trebuie să ne amintim că lățimea de bandă reală în ceea ce privește datele utile va fi de aproximativ 280 Kbps)

> [17: 03: 57.789] la ora 1
<[0.016]at at 1
în regulă

Din nou, vom include calendarul adaptiv - acum va fi la îndemână.

Începem să lucrăm direct cu panoul de bord.

Aici, din semnul #, începe jurnalul introdus de programul pyren. În acest caz, înseamnă că după trimiterea comenzii anterioare au trecut mai mult de 5 secunde și, cel mai probabil, sesiunea de diagnosticare a ECU-ului a fost închisă după expirarea timpului - asta fac majoritatea ECU-urilor. În acest caz, trebuie să repetați comanda pentru a deschide sesiunea înainte de a trimite următoarele comenzi.

>

Iată un răspuns lung la comanda 2181. Aceasta este comanda pentru a citi VIN-ul curent din tabloul de bord. Secvența acțiunilor este următoarea:
1) trimiteți comanda 2181, care a cântărit anterior "02" în față și "1" în spatele acesteia
2) se obține un cadru de răspuns primul „1015618131313131“ Aici, în ordinea „1“ este-Indică faptul că răspunsul va fi format din mai multe cadre, următorii 12 biți „015“ - este de așteptat 0h015 răspuns dyne = 21 octeți (2 octeți de răspuns pozitiv 17 bytes + VIN cod + 2 octeți CRC). În primul cadru, avem doar 6 bytes de util „618131313131“ (cum se verifică faptul că acesta este începutul, am văzut un răspuns pozitiv). Rămâne să obțineți (21-6) / 7 = 3 cadre.
3) pentru a continua să primim răspunsul, trebuie să trimitem cadrul FlowControl "300300". Amintește, primul octet „30“ - de fapt, înseamnă că această FC, al doilea octet „03“ - vorbim partea trimiterea, care sunt dispuși să accepte trei cadru rămase, al treilea octet „00“ - înseamnă că suntem gata să primească cadrele rămase la o rată maximă . Ultimul "3", ca și mai înainte, este destinat ELM-ului și îi spune că ar trebui să ne ofere un răspuns imediat ce primește trei cadre.
4) primim cadrele rămase. Toți încep cu "2" și al doilea caracter, avem doar un contor care rulează într-un cerc de la 0 la F. Apoi, în fiecare cadru (cu excepția ultimului), 7 octeți de date. În acest din urmă, numai un octet de date și 6 octeți de umplutură la 8 octeți.

Astfel, am primit răspunsul "618131313131" + "31313131313131" + "3131313131319F" + "B5". După cum puteți vedea, codul VIN am constat din 17 unități în codul ASCII și CRC = "9FB5".

Acum vom forma si vom trimite comanda pentru a inregistra un nou VIN format din 17 perechi. Comanda VIN record în tabloul de bord "3B81". Ar trebui să fie 17 octeți în ASCII și 2 octeți ai noului CRC. În total, trebuie să trimitem comanda "3B8132323232323232323232323232323232327E70". În primul rând, îl împărțim în cadre. Primul se va potrivi cu 6 octeți, în al doilea și al treilea cu 7, iar ultimul va fi 1 octet.

În timp ce lansam comanda la cadre, a durat mai mult de 5 secunde și a trebuit să redeschidem sesiunea.
Acum trimitem primul cadru (adică 1015 la început, deja știm)

Ca răspuns, primim de la tabloul de bord cadrul FC, care ne spune că poate fi trimis un singur cadru și nu mai devreme de 0x14 msec. "8484848484" - ca întotdeauna de umplutură.

>

Am trimis cel de-al doilea cadru și am primit următoarea instrucțiune despre cum să fim în continuare sub forma unui nou FC

>

Am trimis cel de-al treilea cadru al echipei și am primit din nou FC

Apoi a fost trimis ultimul cadru al echipei și, în schimb, a primit "037F3B23". "03" înseamnă că răspunsul la comanda noastră lungă de înregistrare VIN constă în 3 octeți de "7F3B23". Răspunsul începe cu "7F" și acesta este un răspuns negativ, dar este prea devreme pentru a fi supărat. Să descifrăm. Cel de-al doilea octet al răspunsului negativ este egal cu primul octet al comenzii la care aparține acest răspuns negativ. Cel de-al treilea octet "23" este codul de eroare și pyren pentru noi, descifrat

# [0.380845069885] rsp: 7F 3B 23: NR: rutina nu este completă

Un răspuns negativ înseamnă că tabloul de bord a fost acceptat de către echipă și a început să-l descopere, dar până acum lucrările nu au fost finalizate.
Să vedem ce se întâmplă în continuare. Să încercăm să citim noul VIN și pentru asta trimitem din nou comanda 2181

Dar am primit din nou un răspuns negativ "7F2121". Acum, pe comanda "21" și codul de eroare este, de asemenea, "21". Acest cod de eroare înseamnă "NR: Cerere de repetare ocupată". Aceasta înseamnă că tabloul de bord este încă ocupat executând comanda anterioară și ne cere să repetăm ​​comanda după ceva timp.) Pyren așteaptă 500 ms și repetă comanda

>

De data aceasta am primit un răspuns pozitiv și arată că noul nostru VIN din panoul de bord constă în 17 dubluri.

Acum, pentru comoditate, voi repeta întregul jurnal împreună fără comentariile mele plictisitoare







Trimiteți-le prietenilor: