Jag har lite längre kabel nu. Ca 1.3 meter. Det är samma visa här också. Om jag har ECU A och ECU B inkopplade med varandra. Jag mäter resistansen på CANH och CANL så får jag 61 ohm.
Det är alltså 60.9 - kondensator - 60.9 som termineringsmotstånd. Två stycken sådana motstånd parallelt och resistansen halveras. Så resistansen verkar OK.
Edit 1:
Jag testade även ta bort ett termineringsmotstånd. Nu fungerar inte kommunikationen alls. Så termineringsmotstånd måste jag ha i båda endar.
Edit 2:
Jag kopplade tillbaka det.
Men något som jag märker är att hela meddelandet verkar inte komma helt fram.
Jag måste typ skicka flera meddelanden, innan mottagaren får meddelanden.
Jag har LED-lampor på mina ECU enheter. När någon får ett meddelande eller skickar ett meddelande, så blinkar en LED-lampa.
Edit 3:
Uteslutningsvis så är det mina Tx mailboxes som är fulla.
You only have three transmit mailboxes. That means that you can set only three frames pending for transmit by the bxCAN controller. Others have to wait in software buffers.
If you did not implement the error handlers of CAN bus and cancel transmission when they fail (eg: bus full, no acknowledge or arbitation failure) you will eventually use up all mailboxes.
The hardware does not provide a timeout function, you have to keep track of possible mailbox timeouts yourself.
Your code only aborts transmit of box 0 when all mailboxes are full, so your behavior is not strange.
Also, if you did enabled the automatic retransmit feature, mailboxes will never free automatically until transmit is successfully completed.
https://stackoverflow.com/questions/598 ... controller
Detta låter mycket troligt med tanke på att jag får
HAL_CAN_ERROR_PARAM som felkod.
Kod: Markera allt
uint32_t tsr = READ_REG(hcan->Instance->TSR); /*!< CAN transmit status register, Address offset: 0x08 */
/* Check that all the Tx mailboxes are not full */
if (((tsr & CAN_TSR_TME0) != 0U) ||
((tsr & CAN_TSR_TME1) != 0U) ||
((tsr & CAN_TSR_TME2) != 0U))
{
/* Massa kod.... */
}else{
/* Update error code */
hcan->ErrorCode |= HAL_CAN_ERROR_PARAM;
return HAL_ERROR;
}
Skärmbild 2022-11-29 203015.png
Här kan vi verifiera att mina Tx mailboxar är fulla. Orsakerna kan vara:
- Jag skickar för snabba meddelanden.
- Inget ACK skickas (med tanke på att jag får skicka minst 2 meddelanden, innan den uppfattar ett meddelande)
- För låg spänningsnivå (Jag kör ju precis 3.3V så det ska nog inte vara ett problem. Men vem vet...)
Edit 4:
Med tanke på att jag får tsr = 0b10000010000000000000000000000000 = 0x82000000 så betyder det att det är något med min mailbox.
Hur som helst så är ingen av dessa mailbox tomma, vilket är problemet!
Skärmbild 2022-11-29 203015.png
Edit 5:
Nu använder jag denna inställning. Nu kan jag inte alls tala med någon annan ECU enhet. Dessutom om jag bara kör ECU A helt öppet utan att koppla in mig på nätverket, så får jag samma felmeddelande.
Skärmbild 2022-11-29 203015.png
Edit 6:
När jag har min första inställning så fungerar det att köra en ensam ECU enhet.
Då får jag
Vilket indikerar att meddelandet är OK.
Så hur kommer det då sig att om jag har två stycken EXAKT likadana ECU enheter, med exakt samma mjukvara och hårdvara, får problem att tala med varandra? Och allt verkar ligga i inställningarna.
Edit 7:
Lite framsteg nu. Nu kan jag skicka data, utan att min CAN-modul får något fel. Men min mottagare svarar inte på meddelandet.
Det jag har gjort är att jag har ställt in tiderna för min CAN-modul.
http://www.bittiming.can-wiki.info/#bxCAN
Skärmbild 2022-11-29 203015.png
Skärmbild 2022-11-29 203015.png