04-03-2025, 12:27 AM
Ovo je bitna stvar za ovu priču, vreme procesiranja CAN frejmova/poruka.
Ovde se vide frejmovi, dva ili više vezanih koji se pojavljuju nekom brzinom vidi se u gornjem delu svakih 13ms, nije popunjen kompletan "bandwith" mreže vidite procentulano koliko je zauzeto može da bude potpuno zauzeto u nekim situacijama.
Drugi kanal je LED/GPIO koji samo služi za odmeravanje vremena i to upali izlaz kada udje u ISR rutinu i ugasi kada izadje.
Vidite u donjem delu da se interapt aktivira nakon završetka prijema poruke (za zakašnjenem oko 20us dok stigne u tu tačku) i u toj ISR rutini koja radi neko bazično formatiranje i slanje na USB VCP je proveo svega 17us!
To praiktično znači da može da hendluje full-speed ODB saobraćaj jer mu je procesiranje/slanje kraće od vremena trajanja jednog frejma, radi u real-time i još ima rezerve za razne dodatne stvari.
Ovi drugi adapteri/kontroleri "posustaju" pri tim brzinama jer su im trasportni kanali dosta sporiji i onda moraju da rade "filtriranje" frejmova. Tačno postoje kao što vidite ID sa 0x110 0x120 koji su bazične "broadcast" informacije poput brzine, rpm i ostalo koje "slušaju razni uredjaji" ali recimo smetaju kod prenosa jer ne može kontroler sve da pošalje a dodatno i ne trebaju svima te informacije pa se onda to filtriranje radi na samo kontroleru i tako on šalje samo recimo >= 0x501 gde su dodatne/extended servisne infomracije.
Sve u svemu ovaj kontroler to radi u real-time sa/bez filtera i HVATA SVE frejmove maksimalnom brzinom i prosleduje na USB VCP.
I tu sad ima dodatna caka, Baud-rate od tog VCP, hehe, praktično NEMA jer ne radim sa fizičkom seriskom vezom, koliko god da postavite u seriskom terminalu IMA DA RADI, i radi sa bilo kojom brzinom!
Praktično znači da možete da prosledite neke "dodatne instrukcije" preko podešavanja Baud-rate tog interfejsa, recimo 115200 je standardni neki DEBUG-MOD, 14400 je recimo prošireni Debug-mode, recimo 4800 je "filtrirani CAN mode"!!! i tako dalje, može u letu da se menja! ;-)
PHP Code:
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK) {
msglen=0;
if (vcp_baudrate == 9600) {
msglen = snprintf(msgbuff, sizeof(msgbuff),
"DBG RX-%06d | 0x%03lX: %02X %02X %02X %02X %02X %02X %02X %02X \r\n", cnt++,
RxHeader.StdId,
RxData[0], RxData[1], RxData[2], RxData[3],
RxData[4], RxData[5], RxData[6], RxData[7]);
}
else if (vcp_baudrate == 115200) {
msglen = fast_format_rx_msg(msgbuff, cnt++, RxHeader.StdId, RxData);
}
else if (vcp_baudrate == 14400) {
msglen = snprintf(msgbuff, sizeof(msgbuff), "vcp_baudrate=%ld\r\n", vcp_baudrate);
}
else if (vcp_baudrate == 4800) {
if (RxHeader.StdId > 0x510) {
msglen = fast_format_rx_msg(msgbuff, cnt++, RxHeader.StdId, RxData);
}
}
CDC_Transmit_FS((uint8_t *) msgbuff, msglen);
}
}