diff --git a/libraries/ESP32/examples/TWAI/TWAItransmit/TWAItransmit.ino b/libraries/ESP32/examples/TWAI/TWAItransmit/TWAItransmit.ino new file mode 100644 index 00000000000..df0f1cfd266 --- /dev/null +++ b/libraries/ESP32/examples/TWAI/TWAItransmit/TWAItransmit.ino @@ -0,0 +1,123 @@ +/* ESP32 TWAI transmit example. + This transmits a message every second. + + Connect a CAN bus transceiver to the RX/TX pins. + For example: SN65HVD230 + + The API gives other possible speeds and alerts: + https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/twai.html + + created 27-06-2023 by Stephan Martin (designer2k2) +*/ + +#include "driver/twai.h" + +// Pins used to connect to CAN bus transceiver: +#define RX_PIN 21 +#define TX_PIN 22 + +// Intervall: +#define TRANSMIT_RATE_MS 1000 + +#define POLLING_RATE_MS 1000 + +static bool driver_installed = false; + +unsigned long previousMillis = 0; // will store last time a message was send + + +void setup() { + // Start Serial: + Serial.begin(115200); + + // Initialize configuration structures using macro initializers + twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT((gpio_num_t)TX_PIN, (gpio_num_t)RX_PIN, TWAI_MODE_NORMAL); + twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS(); //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 TX alerts and Bus-Off errors + uint32_t alerts_to_enable = TWAI_ALERT_TX_IDLE | TWAI_ALERT_TX_SUCCESS | TWAI_ALERT_TX_FAILED | TWAI_ALERT_ERR_PASS | TWAI_ALERT_BUS_ERROR; + 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; +} + +static void send_message() { + // Send message + + // Configure message to transmit + twai_message_t message; + message.identifier = 0x0F6; + message.data_length_code = 4; + for (int i = 0; i < 4; i++) { + message.data[i] = 0; + } + + // Queue message for transmission + if (twai_transmit(&message, pdMS_TO_TICKS(1000)) == ESP_OK) { + printf("Message queued for transmission\n"); + } else { + printf("Failed to queue message for transmission\n"); + } +} + +void loop() { + 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_TX_FAILED) { + Serial.println("Alert: The Transmission failed."); + Serial.printf("TX buffered: %d\t", twaistatus.msgs_to_tx); + Serial.printf("TX error: %d\t", twaistatus.tx_error_counter); + Serial.printf("TX failed: %d\n", twaistatus.tx_failed_count); + } + if (alerts_triggered & TWAI_ALERT_TX_SUCCESS) { + Serial.println("Alert: The Transmission was successful."); + Serial.printf("TX buffered: %d\t", twaistatus.msgs_to_tx); + } + + // Send message + unsigned long currentMillis = millis(); + if (currentMillis - previousMillis >= TRANSMIT_RATE_MS) { + previousMillis = currentMillis; + send_message(); + } +}
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: