Sida 1 av 2

Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 22 juli 2021, 17:53:30
av DanielM
Jag håller på att kommunicera med en motor(ECU) som drivs med CAN-bus protokollet SAE J1939.
Jag har tidigare lyckats kommunicera med motorn via MPC2515 + TJA1050 utan problem. Här användes ett 120 Ohms motstånd som termineringsmotstånd
MPC2515 och TJA1050 transmitter drevs med 5.0V.
MCP2515-CAN-Bus-Module-Schematic.jpg
Nu använder jag TCAN334 och den drivs med 3.3V.
Skärmklipp.PNG
Med detta elschema ovan så kan jag läsa CAN-bus signaler. Inga problem. Men jag kan inte skriva CAN-bus signaler. Jag har korrekt baudrate på 250 kB/s.
Skärmklipp.PNG
Då är min fråga:
Hur vanligt är det att man kan läsa CAN-bus meddelanden, men inte skriva så att andra ECU:er förstår?

För att skriva ett meddelande så använder jag denna kod

Kod: Markera allt

        /* Skapa ID och DATA */
        uint8_t TxData[8];
        uint32_t ID = .....
        
        /* Skriv meddelande */
	CAN_TxHeaderTypeDef TxHeader;
	TxHeader.DLC = 8;											/* Here we are only sending 8 bytes */
	TxHeader.RTR = CAN_RTR_DATA;								/* Data frame */
	TxHeader.IDE = CAN_ID_EXT;									/* We want to send an extended ID */
	TxHeader.TransmitGlobalTime = DISABLE;
	TxHeader.ExtId = ID;
	TxHeader.StdId = 0x00; 										/* Not used */
         uint32_t TxMailbox;
	HAL_CAN_AddTxMessage(can_handler, TxHeader, TxData, &TxMailbox);
Jag har själv kollat med intern feedback på CAN- bus och det är inget fel på mina meddelanden.
Så vad tror ni det kan vara?
Jag kan ju förstås skicka CAN-bus meddelanden. Det är bara att andra enheten inte uppfattar meddelanden.
Tror ni det kan vara för låg spänning?


Så jag tog och mätte upp CAN+ and CAN- hos ECU:n
CAN+
20210722_164108(1).jpg
CAN-
20210722_164308.jpg

Och jag mätte upp CAN+ och CAN- hos min TCAN334:
CAN+
20210722_165347.jpg
CAN-
20210722_165406.jpg

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 22 juli 2021, 23:35:40
av hummel
Byt hastighet till 250 kb/s istället.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 09:20:17
av Klas-Kenny
10 nF på signalledningarna belastar dessa tämligen hårt. Vad är syftet med så stora kondingar där?

Jag hade provat att ta bort dem först.
Du får ju ingen Ack på dina paket, så förmodligen är någonting elektriskt fel.

Kan vara bra med en liten konding på CANH och CANL för EMC, men de bör vara sådär 1000ggr mindre.
De på Tx och Rx ser jag inget positivt alls med, skapar bara stora strömspikar vid varje omslag mellan hög och låg vilket snarare skapar EMC-problem.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 16:02:42
av DanielM
hummel skrev: 22 juli 2021, 23:35:40 Byt hastighet till 250 kb/s istället.
Har jag inte 250 kB/s i baudrate redan?
Klas-Kenny skrev: 23 juli 2021, 09:20:17 10 nF på signalledningarna belastar dessa tämligen hårt. Vad är syftet med så stora kondingar där?

Jag hade provat att ta bort dem först.
Du får ju ingen Ack på dina paket, så förmodligen är någonting elektriskt fel.

Kan vara bra med en liten konding på CANH och CANL för EMC, men de bör vara sådär 1000ggr mindre.
De på Tx och Rx ser jag inget positivt alls med, skapar bara stora strömspikar vid varje omslag mellan hög och låg vilket snarare skapar EMC-problem.
Hur kan du se om jag får ACK eller inte?

Jag vet inte hur stora kondensatorerna ska vara. Det stod inte i databladet. Det stod bara "Ha några kondensatorer här"

Okej. Jag ska testa ta bort 10nF kondensatorerna på RX och TX ledningarna.

Jag har ju split terminal och jag har alltid kört med standard terminal för min ECU.
Jag fick höra att split terminal är något bättre. Men jag har ju möjligheten att ändra på detta igenom att ta bort lite kondensatorer + några resistorer.

Eventuellt har jag ett STM32 kort med CAN uppställning som inte har några skydd, kondensatorer osv. Bara 120 ohms standard terminal.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 16:52:22
av Klas-Kenny
Här kan man se ackarna på de första två bilderna:
Skärmbild 2021-07-23 164947.png
Dessa pulser finns inte i de två senare bilderna. Där är det bara "blankt" (flytande nivå)

I termineringen är 10nF helt ok. Där kan man ha mer också om man så vill.
Men kondingarna som sitter rakt mellan CANH/CANL och jord, bör snarare vara i storleksordningen 10-50 pF.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 17:22:49
av TomasL
Jag vet inte hur stora kondensatorerna ska vara. Det stod inte i databladet. Det stod bara "Ha några kondensatorer här"
Det får man räkna på, eftersom de skall fungera som transientskydd.

I ditt första schema använder du ett komplett CAN-Interface (MCP2515).
I ditt andra schema tolkar jag det som att du använder din processor direkt, frågan är då om du har implementerat CAN-interfacet på rätt sätt i din uC.

Vad har du gjort med pinne 5 och 8, de finns inte med i din symbol.
I symbolen skall du ha med alla pinnar, även sådana som inte används.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 17:42:28
av DanielM
Klas-Kenny skrev: 23 juli 2021, 16:52:22 Här kan man se ackarna på de första två bilderna:
Skärmbild 2021-07-23 164947.png

Dessa pulser finns inte i de två senare bilderna. Där är det bara "blankt" (flytande nivå)

I termineringen är 10nF helt ok. Där kan man ha mer också om man så vill.
Men kondingarna som sitter rakt mellan CANH/CANL och jord, bör snarare vara i storleksordningen 10-50 pF.
Okej. Jadu, jag vet inte hur man får till ett ACK via CAN-bus. Är inte detta något som mjukvaran styr?
Jag trodde att ett ACK är bara till för att få en bekräftelse på något. I SAE J1939 så används ACK om man t.ex. skickar en förfrågan på ett PGN som inte finns. Då kan man få ett ACK t.ex. "Finns inte" eller "Upptagen".

Jag ska testa använda mitt STM32 kort som inte har något skydd alls.
TomasL skrev: 23 juli 2021, 17:22:49
Jag vet inte hur stora kondensatorerna ska vara. Det stod inte i databladet. Det stod bara "Ha några kondensatorer här"
Det får man räkna på, eftersom de skall fungera som transientskydd.

I ditt första schema använder du ett komplett CAN-Interface (MCP2515).
I ditt andra schema tolkar jag det som att du använder din processor direkt, frågan är då om du har implementerat CAN-interfacet på rätt sätt i din uC.

Vad har du gjort med pinne 5 och 8, de finns inte med i din symbol.
I symbolen skall du ha med alla pinnar, även sådana som inte används.
MCP2515 är bara en SPI till CAN_TX och CAN_RX och TJA1050 är bara en CAN-transmitter.

Ja. Jag har CAN inbyggt i STM32F3-serie.

Pinne 5 och pinne 8 är NC på min. Jag har en TCAN332. Har jag sagt något annat så är det fel.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 17:49:30
av TomasL

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 18:27:13
av DanielM
Tackar! Det ska jag göra. Återkommer!

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 18:38:51
av TomasL
Nu använder jag TCAN334 och den drivs med 3.3V.
Men pinnarna bör nog vara med i alla fall.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 19:14:45
av DanielM
Dom är med på riktigt i alla fall :)

Det finns en funktion i KiCAD där man kan gömma alla NC pinnar.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 19:32:02
av TomasL
Väldigt dumt att gömma pinnar, för helt plötsligt missar man något vitalt.
Ta fram dem, och anslut dem till jordplanet.

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 23 juli 2021, 19:47:28
av DanielM
Men står det verkligen att NC ska anslutas till gjordplanet? Jag tror snarare att NC är internt ansluten till Vss.

Angående CAN-bus CAN-ramen som man skickar.

I STM32 så skickar man sin data och för att berätta för STM32's interna CAN-bus modul vad det är för typ av data och vilket ID det är t.ex. om det är utökat ID eller standard ID. STM32 har CAN 2.0B som standard. Det finns säkert CAN FD också på övriga STM32:er.

Kod: Markera allt

/**
  * @brief  CAN Tx message header structure definition
  */
typedef struct
{
  uint32_t StdId;    /*!< Specifies the standard identifier.
                          This parameter must be a number between Min_Data = 0 and Max_Data = 0x7FF. */

  uint32_t ExtId;    /*!< Specifies the extended identifier.
                          This parameter must be a number between Min_Data = 0 and Max_Data = 0x1FFFFFFF. */

  uint32_t IDE;      /*!< Specifies the type of identifier for the message that will be transmitted.
                          This parameter can be a value of @ref CAN_identifier_type */

  uint32_t RTR;      /*!< Specifies the type of frame for the message that will be transmitted.
                          This parameter can be a value of @ref CAN_remote_transmission_request */

  uint32_t DLC;      /*!< Specifies the length of the frame that will be transmitted.
                          This parameter must be a number between Min_Data = 0 and Max_Data = 8. */

  FunctionalState TransmitGlobalTime; /*!< Specifies whether the timestamp counter value captured on start
                          of frame transmission, is sent in DATA6 and DATA7 replacing pData[6] and pData[7].
                          @note: Time Triggered Communication Mode must be enabled.
                          @note: DLC must be programmed as 8 bytes, in order these 2 bytes are sent.
                          This parameter can be set to ENABLE or DISABLE. */

} CAN_TxHeaderTypeDef;
Man skickar ett meddelande så här.
&hcan är CAN-modulens address.
TxHeader kan se ut ungefär så här.

Kod: Markera allt

	CAN_TxHeaderTypeDef TxHeader;
	TxHeader.DLC = 3;											/* Here we are only sending 3 bytes */
	TxHeader.RTR = CAN_RTR_DATA;								/* Data frame */
	TxHeader.IDE = CAN_ID_EXT;									/* We want to send an extended ID */
	TxHeader.TransmitGlobalTime = DISABLE;
	TxHeader.ExtId = ID;
	TxHeader.StdId = 0x00; 										/* Not used */
TxData är alltså en uint8_t array på DLC antal element.
&TxMailbox är alltså en pekare till en uint8_t variabel som är till a vart adressen till meddelandet sparas någonstans.

Kod: Markera allt

HAL_CAN_AddTxMessage(&hcan, TxHeader, TxData, &TxMailbox);
Så jag ser inget att man kan ställa in ACK här. Så jag antar att ST's egna CAN-modul ska skicka ett ACK?

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 24 juli 2021, 00:23:27
av hummel
[/quote]

Har jag inte 250 kB/s i baudrate redan?

[/quote]
Nej, det är skillnad på bit och byte!

Re: Jag kan läsa CAN-bus från ECU, men inte skriva CAN-bus meddelanden till ECU?

Postat: 24 juli 2021, 14:49:13
av Klas-Kenny
Det normala är att CAN-kontrollerns hårdvara skickat ack, på varje paket den ser på bussen. Detta brukar ske helt automatiskt efter att ha initierat CAN-kontrollern.

Att du inte får någon Ack på det du skickar tyder på att ingen annan enhet på bussen uppfattar paketen.