ARM45: CAN bus

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ą.
husqvarna loop sensor can usb board

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.

husqvarna loop sensor can usb board
Perdaryta plokštė jau su ISP jungtimi ir sujungta į grupę per CAN laidus (laidinio telefono kabelis).

USB CAN schema STM32F
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).

7 replies on “ARM45: CAN bus”

  1. 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ų.

  2. 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?

  3. peržiūrėjau autošrotą ir radau:
    YAW RATE Sensor Bosch
    (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:

    0151[8]00800000FFFF1BE7
    0156[8]0000000002201B7E
    0150[8]048000FF237F0CCD
    0151[8]00800000FFFF1CB4
    0156[8]0000000004001C5D
    0150[8]018000FF1E7F0D49
    0151[8]00800000FFFF1DA9
    0156[8]0000000002221DA8
    0150[8]018000FF257F0EC6
    0151[8]00800000FFFF1E8E
    0156[8]0000000004211E5E
    0150[8]018000FF257F0FDB
    0151[8]00800000FFFF1F93
    0156[8]0000000006261FB9
    0150[8]018000FF307F00F1

    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.

  4. 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…

  5. 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.

  6. Hondos user prieinamo CAN BUS dumpas (log failas):

    0136[8]000200000000001B
    013A[8]0000000000000019
    013F[8]0000000000006456
    0158[8]0000000000000019
    0164[8]04008015B200003B
    01D0[8]000000000000000A
    01B0[7]0000000000001B
    018E[3]00006B
    01AA[8]7FFF000000007215
    01A4[8]0000000000000018
    00D0[7]0000000000001A
    017C[8]0000000010000021
    0136[8]000200000000002A
    013A[8]0000000000000028
    0039[2]0039
    013F[8]0000000000006465
    0158[8]0000000000000028
    0164[8]04008015B200000E
    01DC[4]0000001D
    03F9[8]0000000000080B9F
    00D0[7]00000000000029
    ...

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *