SN65H und Nano ESP32, auf der Gegenseite kommt nichts an

Fortsetzung der Diskussion von CANbus, TWAI using ESP32 Nano and TJA1051:

sorry wenn ich mich hier noch mal einklinke. ich habe auch das problem mit dem Can. aber nicht mit dem TJA, ich benutze ein SN65H und 2 eigendlich 3 NanoESP32.
den TWAI treiber konnte ich zum laufen bringen und auch ohne Fehlermeldungen zu bekommen. Das senden sagt er Nachricht gesendet, aber auf der Gegenseite kommt nichts an. Habe auch die Bautrate auf 125Kbits runtergeschraubt, aber trotzdem nicht. Sollte es am Code auf der Empfängerseite liegen?

SendeTeil

/************************
  Arduino IDE Ver.2.3.2 *
************************/

// Canbus Schnittstelle Senden
  
#include "driver/twai.h"

#define CanRX 2 // Data in
#define CanTX 3 // Data out
// Interval:
#define TRANSMIT_RATE_MS 1000
#define POLLING_RATE_MS 1000
  static bool driver_installed = false;
  unsigned long previousMillis = 0;  // Speichert den letzten Zeitwert

void CanBus();

void setup() {
  Serial.begin(115200);

 // Initialize configuration structures using macro initia lizers Twai-Canbustreiber
    twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)CanTX, (gpio_num_t)CanRX, TWAI_MODE_NORMAL);
    twai_timing_config_t t_config = TWAI_TIMING_CONFIG_125KBITS();  //Look in the api-reference for other speed sets.
    twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();
 // Install TWAI driver CANBUS Verbindung
    if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
        Serial.println("Driver installed");
    } else {
        Serial.println("Failed to install driver");
        return;
    }
 // Start TWAI driver
    if (twai_start() == ESP_OK) {
      Serial.println("Driver started");
    } else {
      Serial.println("Failed to start driver");
      return;
    }
 // Reconfigure alerts to detect frame receive, Bus-Off error and RX queue full states
    uint32_t alerts_to_enable = TWAI_ALERT_RX_DATA | TWAI_ALERT_ERR_PASS | TWAI_ALERT_BUS_ERROR | TWAI_ALERT_RX_QUEUE_FULL;
    if (twai_reconfigure_alerts(alerts_to_enable, NULL) == ESP_OK) {
      Serial.println("CAN Alerts reconfigured");
    } else {
      Serial.println("Failed to reconfigure alerts");
      return;
    }
 // TWAI driver is now successfully installed and started
    driver_installed = true;
 // If initialization succeeds
    Serial.println("Initialization successful!");
}

void loop() {
 CanBus();
 }

void CanBus() {
      twai_message_t message;
      message.identifier = 0x120;  // Test-Nachricht mit ID 0x120
      message.data_length_code = 5;
      message.data[0] = 'H';
      message.data[1] = 'A';
      message.data[2] = 'L';
      message.data[3] = 'L';
      message.data[4] = 'O';
      message.extd = 0;  // Standard-Frame
      message.rtr = 0;   // Kein Remote Frame

  if (twai_initiate_recovery() == ESP_OK) {
      Serial.println("Bus Recovery gestartet...");
  }

  twai_clear_transmit_queue();
  Serial.println("TX-Warteschlange geleert!");

  twai_status_info_t status;
  twai_get_status_info(&status);

  Serial.print("CAN-Status: ");
  Serial.println(status.state);  // Sollte TWAI_STATE_RUNNING sein

  Serial.print("TX errors: ");
  Serial.println(status.tx_error_counter);

  Serial.print("RX errors: ");
  Serial.println(status.rx_error_counter);

  Serial.print("Bus errors: ");
  Serial.println(status.bus_error_count);
     if (twai_transmit(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
      Serial.println("Bus OK Nachricht gesendet");
      } else {
          Serial.println("---------Fehler beim Senden!--------");
      }
  esp_err_t result = twai_transmit(&message, pdMS_TO_TICKS(1000));
  if (result == ESP_OK) {
      Serial.println("Nachricht gesendet!");
  } else {
      Serial.print("-------Fehler beim Senden!--- Fehlercode: ---");
      Serial.println(result);
 }
   vTaskDelay(1000 / portTICK_PERIOD_MS);  // 1s warten
}

Empfänger

/************************
  Arduino IDE Ver.2.3.2 *
************************/

// Canbus Schnittstelle Empfangen
#include "driver/twai.h"
#define CanRX 1   // GPIO44 RX
#define CanTX 0   // GPIO43 TX
// Interval:
#define POLLING_RATE_MS 1000
static bool driver_installed = false;

void Canbus();

void setup() {
  // Initialize configuration structures using macro initializers
  twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)CanTX, (gpio_num_t)CanRX, TWAI_MODE_NORMAL);
  twai_timing_config_t t_config = TWAI_TIMING_CONFIG_125KBITS();  //Look in the api-reference for other speed sets.
  twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();

  // Install TWAI driver
  if (twai_driver_install(&g_config, &t_config, &f_config) == ESP_OK) {
    Serial.println("Driver installed");
  } else {
    Serial.println("Failed to install driver");
    return;
  }

  // Start TWAI driver
  if (twai_start() == ESP_OK) {
    Serial.println("Driver started");
  } else {
    Serial.println("Failed to start driver");
    return;
  }

  // Reconfigure alerts to detect frame receive, Bus-Off error and RX queue full states
  uint32_t alerts_to_enable = TWAI_ALERT_RX_DATA | TWAI_ALERT_ERR_PASS | TWAI_ALERT_BUS_ERROR | TWAI_ALERT_RX_QUEUE_FULL;
  if (twai_reconfigure_alerts(alerts_to_enable, NULL) == ESP_OK) {
    Serial.println("CAN Alerts reconfigured");
  } else {
    Serial.println("Failed to reconfigure alerts");
    return;
  }
  // TWAI driver is now successfully installed and started
  driver_installed = true;
 }

void loop() {
  Canbus();             // Schnittstelle zum Canbus
}

void Canbus() {
  if (!driver_installed) {
    // Driver not installed
    delay(1000);
    return;
  }
  // Check if alert happened
  uint32_t alerts_triggered;
  twai_read_alerts(&alerts_triggered, pdMS_TO_TICKS(POLLING_RATE_MS));
  twai_status_info_t twaistatus;
  twai_get_status_info(&twaistatus);

  // Handle alerts
  if (alerts_triggered & TWAI_ALERT_ERR_PASS) {
    Serial.println("Alert: TWAI controller has become error passive.");
  }
  if (alerts_triggered & TWAI_ALERT_BUS_ERROR) {
    Serial.println("Alert: A (Bit, Stuff, CRC, Form, ACK) error has occurred on the bus.");
    Serial.printf("Bus error count: %d\n", twaistatus.bus_error_count);
  }
  if (alerts_triggered & TWAI_ALERT_RX_QUEUE_FULL) {
    Serial.println("Alert: The RX queue is full causing a received frame to be lost.");
    Serial.printf("RX buffered: %d\t", twaistatus.msgs_to_rx);
    Serial.printf("RX missed: %d\t", twaistatus.rx_missed_count);
    Serial.printf("RX overrun %d\n", twaistatus.rx_overrun_count);
  }

  // Check if message is received
  if (alerts_triggered & TWAI_ALERT_RX_DATA) {
    // One or more messages received. Handle all.
    twai_message_t message;
    while (twai_receive(&message, 0) == ESP_OK) {
      handle_rx_message(message);
  Serial.println("Lese Status OK:");
    }
  }
  twai_status_info_t status;
  twai_get_status_info(&status);

  Serial.print("CAN-Status: ");
  Serial.println(status.state);  // Sollte TWAI_STATE_RUNNING sein

  Serial.print("TX errors: ");
  Serial.println(status.tx_error_counter);

  Serial.print("RX errors: ");
  Serial.println(status.rx_error_counter);
 }

static void receive_message() {
    Serial.println("Message received OK:");
    twai_message_t message;

    // Try to receive a message (blocking with timeout)
    if (twai_receive(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
        Serial.println("Message received:");

        // Extract data into variables
        uint32_t message_id = message.identifier;
        uint8_t data_length = message.data_length_code;
        uint8_t data[8] = {};
        memcpy(data, message.data, data_length);

        // Print message details
        Serial.printf("ID: 0x%03X\n", message_id);
        Serial.printf("Data length: %u\n", data_length);
        Serial.print("Data: ");
        for (int i = 0; i < data_length; i++) {
            Serial.printf("0x%02X ", data[i]);
        }
        Serial.println();

        // Beispiel: Daten in spezifische Variablen schreiben
        if (message_id == 0x0F6) {  // Überprüfe die ID der Nachricht
            uint8_t variable1 = data[0];  // Erster Datenwert
            uint8_t variable2 = data[1];  // Zweiter Datenwert
            uint16_t variable3 = (data[2] << 8) | data[3];  // 16-Bit-Wert aus zwei Bytes

            // Ausgabe der Variablen
            Serial.printf("Variable 1: %u\n", variable1);
            Serial.printf("Variable 2: %u\n", variable2);
            Serial.printf("Variable 3: %u\n", variable3);
        }
    } else {
        Serial.println("No message received or timeout.");
    }
 }

static void handle_rx_message(twai_message_t& message) {
  // Process received message
  if (message.extd) {
    Serial.println("Message is in Extended Format");
  } else {
    Serial.println("Message is in Standard Format");
  }
  Serial.printf("ID: %x\nByte:", message.identifier);
  if (!(message.rtr)) {
    for (int i = 0; i < message.data_length_code; i++) {
      Serial.printf(" %d = %02x,", i, message.data[i]);
    }
    Serial.println("");
  }
 }

Vieleicht geht das ja auch mit einem TJA? Wäre nett wenn einer noch ein Testaufbau hat um das einmal zu testen, damit ich ein Fehler in der Verdrahtung ausschließen kann. die 120R wiederstände sind jeweils am Ende vorhanden. und ich benutze auch extra CanBus Kabel dafür, da der weg doch schon 2 Meter voneinander getrennt ist.

Gru euch allen

Wenn ich danach suche, finde ich unterschiedliche ICs. Welche nutzt Du?

SN65HVD230DR 3,3V

https://shop.schukat.com/de/de/EUR/Texas-Instruments/SN65HVD230DR/p/40494

ich habe den code noche ein wenig verädert so das ich mehr ausgaben bekomme. Das ergbinss war ernüchternd und nicht gerade sehr zu meiner Freude.

der Sender fängt zwar an zu senden mit einer Testnachricht an die Station 0x100, aber nach 10 übertagungen bricht er mit fehler 259 ab.

22:13:24.200 -> Schnittstelle OK
22:13:24.200 -> Driver installed
22:13:24.200 -> Driver started
22:13:24.200 -> CAN Alerts reconfigured
22:13:24.200 -> Initialization successful!
22:13:24.200 -> Message sent successfully!
22:13:24.200 -> Sent Message ID: 0x100
22:13:24.200 -> Data: 48 
22:13:25.225 -> Message sent successfully!
22:13:25.225 -> Sent Message ID: 0x100
22:13:25.225 -> Data: 48 
22:13:26.188 -> Message sent successfully!
22:13:26.188 -> Sent Message ID: 0x100
22:13:26.188 -> Data: 48 
22:13:27.188 -> Message sent successfully!
22:13:27.188 -> Sent Message ID: 0x100
22:13:27.188 -> Data: 48 
22:13:28.199 -> Message sent successfully!
22:13:28.199 -> Sent Message ID: 0x100
22:13:28.199 -> Data: 48 
22:13:29.187 -> Data: 48 
22:13:30.211 -> Message sent successfully!
22:13:30.211 -> Sent Message ID: 0x100
22:13:30.211 -> Data: 48 
22:13:31.192 -> Message sent successfully!
22:13:31.192 -> Sent Message ID: 0x100
22:13:31.192 -> Data: 48 
22:13:32.217 -> Message sent successfully!
22:13:32.217 -> Sent Message ID: 0x100
22:13:32.217 -> Data: 48 
22:13:33.209 -> Message sent successfully!
22:13:33.209 -> Sent Message ID: 0x100
22:13:33.209 -> Data: 48 
22:13:33.209 -> CAN-Status: 1
22:13:33.209 -> TX errors: 208
22:13:33.209 -> RX errors: 0
22:13:34.217 -> Message sent successfully!
22:13:34.217 -> Sent Message ID: 0x100
22:13:34.217 -> Data: 48 
22:13:35.226 -> Message sent successfully!
22:13:35.226 -> Sent Message ID: 0x100
22:13:35.226 -> Data: 48 
22:13:36.187 -> Message sent successfully!
22:13:36.187 -> Sent Message ID: 0x100
22:13:36.187 -> Data: 48 
22:13:37.196 -> Message sent successfully!
22:13:37.196 -> Sent Message ID: 0x100
22:13:37.196 -> Data: 48 
22:13:38.187 -> Message sent successfully!
22:13:38.187 -> Sent Message ID: 0x100
22:13:38.187 -> Data: 48 
22:13:39.208 -> Message sent successfully!
22:13:39.208 -> Sent Message ID: 0x100
22:13:39.208 -> Data: 48 
22:13:40.213 -> Failed to send message, error code: 259
22:13:41.206 -> Failed to send message, error code: 259
22:13:42.187 -> Failed to send message, error code: 259
22:13:43.187 -> Failed to send message, error code: 259
22:13:43.187 -> CAN-Status: 2
22:13:43.187 -> TX errors: 128
22:13:43.187 -> RX errors: 0

Daraufhin habe ich mir das alles noch einmal angeschaut, Verkabelung, Spannung, Endwiedersrände. dies ist alles im Grünen Bereich, Spannnung von 3,2V, Wiederstand von 60,2R jedes ende 120R. Aber was mich nun verwunder hat, es sollten Normal im Ruhezustand zwischen CanH und CanL etwa 2,5V anliegen , beim Senden kann es ein wenig mehr sein. Aber mein Multimeter zeigte mir, das aber bei allen Chips die ich getestet habe, 005.9 an. Dann habe ich die CanSchutzdiode entfernt und noch einmal gemessen. da komme ich 1.004V was auch noch zu wenig ist. Leider habe ich noch kein Ozi um das Signal zu Überprüfen. Sollte es sein das alle 4 Chips einen Defekt haben sollten? Sie sind alle neu.

Nun lässt sich auch erklaren warum auf der Empfängerseite nichts ankommt.

22:00:48.499 -> CAN-Status: 1
22:00:48.499 -> TX errors: 0
22:00:48.499 -> RX errors: 0

Ich glaube nicht das es am Code liegen sollte. Habe verschiedene getestet , aber das Ergebniss war immer das selbe. Vieleicht jemand einen Rat was ich noch testen könnte.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.