Iš archyvo ištraukiau “motininę PCB” su nesupjaustytom schemutėm. Tai husqvarnos išmanios žoliapjovės “loop sensor” plokštė. Dabar tas “loop” visiškai nedomina. Prilituojam USB lizdą ir bandom suprogramuoti CAN protokolo siuntėją ir gavėją.
PCB numatytas maitinimas iš CAN jungties, todėl norint maitinti iš USB, reikia pajugti papildomą laidelį. Visą kitą paliekam kaip buvo. Iš aiškių elementų: Texas Instruments TCAN330 čipas ir SPI EEPROM, toliau komparatorius, analoginis multipleksorius ir keletas tranzistorių. Loop ryšiui- ritė laido juodame korpuse.
Perdaryta plokštė jau su ISP jungtimi ir sujungta į grupę per CAN laidus (laidinio telefono kabelis).
Procesoriukas (STM32F302CCT6) turi “hardwarinį” CAN, tai dar ir panaudojus CubeMX sukurtą skeletą darbo nelieka daug. Ryšiui su išoriniu pasauliu nutariau panaudoti USB CDC (serial) įrenginį. Kad viskas veiktu, procesoriaus CLK turi būti kiek aukštesnis nei pagal nutylėjimą sugeneruoja kubikas. Aš pasirinkau 72MHz, maksimumą. Dar, kad nesipjautų pertraukimai, CAN RX1 kiek pažeminau prioritetuose iki “1”.
Apie softą:
CAN siuntimui naudojam HAL paprogramę HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox)
. TxHeaderyje nurodom kam siunčia ir kokio tipo paketas. TxData- tai max 8 baitai duomenų. TxMailbox- nežinau kas tai, teoriškai “pašto dėžutė” kurioje kabo paketas, kol nėra pristatytas. Kaip jis veikia nežinau ir nesvarbu.
CAN paketo priėmimas kiek įdomesnis. MCU turi kažkiek “hardwarinio” spartinimo, todėl paketų filtrą ir priėmimą galima automatizuoti. Pats priėmimas geriausiai veikia per pertraukimą- gaunam paketą, jį priima ir pakelia vėliavėlę. O toliau jau softas rūpinasi kas bus toliau.
Todėl pirma reikia sukonfiguruoti paketų filtrą:
void can_filter(void) //CAN filtas- tai hardwarinis (softwarinis) paketu filtras, kad duomenys eitu tik reikalingi.
{
CAN_FilterTypeDef canfilterconfig;canfilterconfig.FilterActivation = CAN_FILTER_ENABLE;
canfilterconfig.FilterBank = 10; // which filter bank to use from the assigned ones??? Kodėl?
//canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //Ziureti kuris yra. Šits kažko neveikė
canfilterconfig.FilterFIFOAssignment = CAN_FILTER_FIFO1; //O šitas jau veikia.
canfilterconfig.FilterIdHigh = CAN_ID_RX << 5;
canfilterconfig.FilterIdLow = 0;
canfilterconfig.FilterMaskIdHigh = CAN_ID_RX << 5;
canfilterconfig.FilterMaskIdLow = 0x0000;
canfilterconfig.FilterMode = CAN_FILTERMODE_IDMASK;
canfilterconfig.FilterScale = CAN_FILTERSCALE_32BIT;
canfilterconfig.SlaveStartFilterBank = 0; // how many filters to assign to the CAN1 (master can)
// doesn't matter in single can controllers
HAL_CAN_ConfigFilter(&hcan, &canfilterconfig);
}
Čia yra niuansų- CAN_FILTER_FIFO0 ir FIFO1.
Ir kitas niuansas RX pertraukimo Call-back:
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan) //RX interrupto callbackas. Gali buti "Fifo0", zr. filtrą ir galimus int.
{
HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO1, &RxHeader, RxData);
CAN_MSG_R=1;
}
Matot “CAN_RX_FIFO1” ir “HAL_CAN_RxFifo1MsgPendingCallback”? Fifo0 ar Fifo1 nėra taip paprastai pasirenkamas, o nuo ko priklauso aš pilnai ir nesupratau. Kažkodėl FIFO0 neveikė. Gal buvo per vėlus vakaras ar panašiai. Bet su FIFO1 viskas veikia.
Kitas momentas- pirma sukonfiguruoji, poto paleidi. Jei reikia perkonfiguruoti- pirma stabdom, poto perkonfiguruojam ir poto paleidžiam:
can_filter(); //pirma filtras, poto start
HAL_CAN_Start(&hcan );
HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO1_MSG_PENDING);
Visas veikiantis demo source kodas: STM32F302 USB CAN writer reader source code.
Ten dar yra windows console programėlė filtro konfiguracijos testavimui (su source code, ne mano).
Kiek pamenu iš savo krapštymųsi su CAN, tai FIFO0 ir FIFO1 filtrai skiriasi tuo, kad tiesiog galima paskirstyti žinutes jas hardwariškai atfiltruojant. Kiekvienas FIFO turi po 3 mailbox’us, t.y. gali buferizuot iki trijų įeinančių žinučių, jei softas nespėja jų greitai iškrapštyt. FIFO dar papildomai išbalansuoja žinučių priėmimą per skirtingus filtrus. Nežinau, koks efektas gaunamas, jei ant abiejų FIFO pakabinami vienodi filtrai. Plius, yra ribotas filtrų kiekis, kiek ant vieno FIFO galima išnaudoti, tai su abiem gaunasi dvigubai. Kai reikia doroti daug žinučių tipų, visai praverčia. Tiesa, aš viską kodijau pagal Reference Manual ir su CMSIS biblioteka, tai atidžiai viską skaitant kažkaip ir gavosi. Dabar jau beveik nepamenu visų niuansų, bet priėmimas iš dviejų fifų veikė be problemų.
Gal ir turi veikti abu fifo. Labai jau skubėjau ir nepaskaičiau instrukcijų. Dabar neskubėdamas darau tokį variantą, kad per USB galima perkonfiguruoti visus tuos filtrus ir kitus parametrus. Bėda tame, kad neturiu jokių prietaisu su “žinomu” CAN busu. Nebent vėl kentės mano Honda.
Dydelė PCB nuotrauka.
Biški išanalizuota PCB. Dabar jau panaudojau EEPROM, į kurį surašiau visus parametrus. Ant PCB yra holo jutiklis, trys operaciniai, analoginis jungiklis, Ref įtampa?
peržiūrėjau autošrotą ir radau:
(0 265 005 623) A 216 542 00 18, iš mersiuko. Tačiau panašūs moduliai naudojami kogero visuose šiuolaikiniuose automobiliuose su stabilumo sistema. Šiam modeliui datasheeto neradau, radau kitam- Bosch Motorsport | Yaw Rate Sensor YRS 3.
Pinout:
1-GND
2-CANL
3-CANH
4-Vcc (min 7V)
Šitas modelis dirba 500kbit greičiu. Pumpuoja informaciją be sustojimo:
Skaičiai kaitaliojasi jei krutini modulį. Gaunam 3 pranešimus… Turiu tik 2 aprašymus. Ir jie nelabai tinka.
Teoriškai, jei tai analogiška datašytui:
0 – Yaw rate 1
1 – Yaw rate 1
2 – reserved
3 – reserved
4 – Acc Y-axis
5 – Acc Y-axis
6 – reserved
7 – unused
ir
0 – Yaw Angular Acceleration
1 – Yaw Angular Acceleration
2 – reserved
3 – reserved
4 – Acc X-axis
5 – Acc X-axis
6 – reserved
7 – unused
This sensor is designed to measure the physical effects of yawing, lateral and longitudinal acceleration.
In order to achieve this, the sensor features both a measuring element for yaw rate and two for acceleration, with one appropriate integrated circuit.
A rotation around the third orthogonal axis, a yaw rate, creates a Coriolis force on the accelerometers, which
is detected by the element. Apart from the measuring element for yaw rate, a pure surface micro machined measuring element for acceleration is utilized to measure the vehicles lateral and longitudinal acceleration.
This enables a very precise application.
Pasirašiau kiek pilnesnę versiją. Dabar viskas konfiguruojasi per USB su ATxxx komandomis. T.y ir filtras ir siuntimo parametrai. Yra “fabrikiniai nustatymai” kai atsistato 500kbit “standartinis” CAN su visų paketų gaudymu. Siuntimo id pagal STM32 id arba kokį norim įrašyti. Visi parametrai susirašo į EEPROM ir pasilieka po atjungimo.
Dabar reikia OBD jungties ir galima kankinti Hondą. Dar gal kiek paieškosių kokio nors autošroto, nes tas stabilumo sensorius labai neįdomus. O va parkavimo sensorius papuolė ne CANinis kažkoks…
Ką žadi kankinti hondoje? OBD jungtyje nėra pilno mašinos cano 😀 tai nesitikėk ten rasti viską.. Mašinoje yra bent keli CAN kanalai, į OBD išvesta tik tam tikra dalis per gateway.
taip, aš žinau apie kelis nepriklausomus kanalus. Mano eksperimentams to užteks, jei kur rasiu numesta jungtį.
Hondos user prieinamo CAN BUS dumpas (log failas):
Per kelias minutes sukaupta info. Viduje – užvedimas, lempų, radijos, langų, pečiuko ir panašiai pajunginėjimas, variklio išjungimas: Honda CAN BUS Raw dump/log.
Tas pats failas “excel” (open office, ods) formate: Honda CAN bus log in ODS (linre office, excel) format, kodel jis toks didelis? Tik 251486 CAN pranešimai.