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