Extend ESP32 CAN bit rates /bus speed support (#5280)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Co-authored-by: mkaiser <mkaiser@techfak.uni-bielefeld.de>
This commit is contained in:
mkaiser 2023-09-05 00:27:58 +02:00 committed by GitHub
parent a9630ac847
commit d382ca2401
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 86 additions and 3 deletions

View file

@ -45,9 +45,13 @@ CanbusTrigger = canbus_ns.class_(
CanSpeed = canbus_ns.enum("CAN_SPEED") CanSpeed = canbus_ns.enum("CAN_SPEED")
CAN_SPEEDS = { CAN_SPEEDS = {
"1KBPS": CanSpeed.CAN_1KBPS,
"5KBPS": CanSpeed.CAN_5KBPS, "5KBPS": CanSpeed.CAN_5KBPS,
"10KBPS": CanSpeed.CAN_10KBPS, "10KBPS": CanSpeed.CAN_10KBPS,
"12K5BPS": CanSpeed.CAN_12K5BPS,
"16KBPS": CanSpeed.CAN_16KBPS,
"20KBPS": CanSpeed.CAN_20KBPS, "20KBPS": CanSpeed.CAN_20KBPS,
"25KBPS": CanSpeed.CAN_25KBPS,
"31K25BPS": CanSpeed.CAN_31K25BPS, "31K25BPS": CanSpeed.CAN_31K25BPS,
"33KBPS": CanSpeed.CAN_33KBPS, "33KBPS": CanSpeed.CAN_33KBPS,
"40KBPS": CanSpeed.CAN_40KBPS, "40KBPS": CanSpeed.CAN_40KBPS,
@ -60,9 +64,9 @@ CAN_SPEEDS = {
"200KBPS": CanSpeed.CAN_200KBPS, "200KBPS": CanSpeed.CAN_200KBPS,
"250KBPS": CanSpeed.CAN_250KBPS, "250KBPS": CanSpeed.CAN_250KBPS,
"500KBPS": CanSpeed.CAN_500KBPS, "500KBPS": CanSpeed.CAN_500KBPS,
"800KBPS": CanSpeed.CAN_800KBPS,
"1000KBPS": CanSpeed.CAN_1000KBPS, "1000KBPS": CanSpeed.CAN_1000KBPS,
} }
CANBUS_SCHEMA = cv.Schema( CANBUS_SCHEMA = cv.Schema(
{ {
cv.GenerateID(): cv.declare_id(CanbusComponent), cv.GenerateID(): cv.declare_id(CanbusComponent),

View file

@ -19,9 +19,13 @@ enum Error : uint8_t {
}; };
enum CanSpeed : uint8_t { enum CanSpeed : uint8_t {
CAN_1KBPS,
CAN_5KBPS, CAN_5KBPS,
CAN_10KBPS, CAN_10KBPS,
CAN_12K5BPS,
CAN_16KBPS,
CAN_20KBPS, CAN_20KBPS,
CAN_25KBPS,
CAN_31K25BPS, CAN_31K25BPS,
CAN_33KBPS, CAN_33KBPS,
CAN_40KBPS, CAN_40KBPS,
@ -34,6 +38,7 @@ enum CanSpeed : uint8_t {
CAN_200KBPS, CAN_200KBPS,
CAN_250KBPS, CAN_250KBPS,
CAN_500KBPS, CAN_500KBPS,
CAN_800KBPS,
CAN_1000KBPS CAN_1000KBPS
}; };

View file

@ -5,6 +5,15 @@ from esphome.components import canbus
from esphome.const import CONF_ID, CONF_RX_PIN, CONF_TX_PIN from esphome.const import CONF_ID, CONF_RX_PIN, CONF_TX_PIN
from esphome.components.canbus import CanbusComponent, CanSpeed, CONF_BIT_RATE from esphome.components.canbus import CanbusComponent, CanSpeed, CONF_BIT_RATE
from esphome.components.esp32 import get_esp32_variant
from esphome.components.esp32.const import (
VARIANT_ESP32,
VARIANT_ESP32S2,
VARIANT_ESP32S3,
VARIANT_ESP32C3,
VARIANT_ESP32H2,
)
CODEOWNERS = ["@Sympatron"] CODEOWNERS = ["@Sympatron"]
DEPENDENCIES = ["esp32"] DEPENDENCIES = ["esp32"]
@ -12,19 +21,57 @@ esp32_can_ns = cg.esphome_ns.namespace("esp32_can")
esp32_can = esp32_can_ns.class_("ESP32Can", CanbusComponent) esp32_can = esp32_can_ns.class_("ESP32Can", CanbusComponent)
# Currently the driver only supports a subset of the bit rates defined in canbus # Currently the driver only supports a subset of the bit rates defined in canbus
CAN_SPEEDS = { # The supported bit rates differ between ESP32 variants.
# See ESP-IDF Programming Guide --> API Reference --> Two-Wire Automotive Interface (TWAI)
CAN_SPEEDS_ESP32 = {
"25KBPS": CanSpeed.CAN_25KBPS,
"50KBPS": CanSpeed.CAN_50KBPS, "50KBPS": CanSpeed.CAN_50KBPS,
"100KBPS": CanSpeed.CAN_100KBPS, "100KBPS": CanSpeed.CAN_100KBPS,
"125KBPS": CanSpeed.CAN_125KBPS, "125KBPS": CanSpeed.CAN_125KBPS,
"250KBPS": CanSpeed.CAN_250KBPS, "250KBPS": CanSpeed.CAN_250KBPS,
"500KBPS": CanSpeed.CAN_500KBPS, "500KBPS": CanSpeed.CAN_500KBPS,
"800KBPS": CanSpeed.CAN_800KBPS,
"1000KBPS": CanSpeed.CAN_1000KBPS, "1000KBPS": CanSpeed.CAN_1000KBPS,
} }
CAN_SPEEDS_ESP32_S2 = {
"1KBPS": CanSpeed.CAN_1KBPS,
"5KBPS": CanSpeed.CAN_5KBPS,
"10KBPS": CanSpeed.CAN_10KBPS,
"12K5BPS": CanSpeed.CAN_12K5BPS,
"16KBPS": CanSpeed.CAN_16KBPS,
"20KBPS": CanSpeed.CAN_20KBPS,
**CAN_SPEEDS_ESP32,
}
CAN_SPEEDS_ESP32_S3 = {**CAN_SPEEDS_ESP32_S2}
CAN_SPEEDS_ESP32_C3 = {**CAN_SPEEDS_ESP32_S2}
CAN_SPEEDS_ESP32_H2 = {**CAN_SPEEDS_ESP32_S2}
CAN_SPEEDS = {
VARIANT_ESP32: CAN_SPEEDS_ESP32,
VARIANT_ESP32S2: CAN_SPEEDS_ESP32_S2,
VARIANT_ESP32S3: CAN_SPEEDS_ESP32_S3,
VARIANT_ESP32C3: CAN_SPEEDS_ESP32_C3,
VARIANT_ESP32H2: CAN_SPEEDS_ESP32_H2,
}
def validate_bit_rate(value):
variant = get_esp32_variant()
if variant not in CAN_SPEEDS:
raise cv.Invalid(f"{variant} is not supported by component {esp32_can_ns}")
value = value.upper()
if value not in CAN_SPEEDS[variant]:
raise cv.Invalid(f"Bit rate {value} is not supported on {variant}")
return cv.enum(CAN_SPEEDS[variant])(value)
CONFIG_SCHEMA = canbus.CANBUS_SCHEMA.extend( CONFIG_SCHEMA = canbus.CANBUS_SCHEMA.extend(
{ {
cv.GenerateID(): cv.declare_id(esp32_can), cv.GenerateID(): cv.declare_id(esp32_can),
cv.Optional(CONF_BIT_RATE, default="125KBPS"): cv.enum(CAN_SPEEDS, upper=True), cv.Optional(CONF_BIT_RATE, default="125KBPS"): validate_bit_rate,
cv.Required(CONF_RX_PIN): pins.internal_gpio_input_pin_number, cv.Required(CONF_RX_PIN): pins.internal_gpio_input_pin_number,
cv.Required(CONF_TX_PIN): pins.internal_gpio_output_pin_number, cv.Required(CONF_TX_PIN): pins.internal_gpio_output_pin_number,
} }

View file

@ -16,6 +16,30 @@ static const char *const TAG = "esp32_can";
static bool get_bitrate(canbus::CanSpeed bitrate, twai_timing_config_t *t_config) { static bool get_bitrate(canbus::CanSpeed bitrate, twai_timing_config_t *t_config) {
switch (bitrate) { switch (bitrate) {
#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32C3) || \
defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32H6)
case canbus::CAN_1KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1KBITS();
return true;
case canbus::CAN_5KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_5KBITS();
return true;
case canbus::CAN_10KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_10KBITS();
return true;
case canbus::CAN_12K5BPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_12_5KBITS();
return true;
case canbus::CAN_16KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_16KBITS();
return true;
case canbus::CAN_20KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_20KBITS();
return true;
#endif
case canbus::CAN_25KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_25KBITS();
return true;
case canbus::CAN_50KBPS: case canbus::CAN_50KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_50KBITS(); *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_50KBITS();
return true; return true;
@ -31,6 +55,9 @@ static bool get_bitrate(canbus::CanSpeed bitrate, twai_timing_config_t *t_config
case canbus::CAN_500KBPS: case canbus::CAN_500KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_500KBITS(); *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_500KBITS();
return true; return true;
case canbus::CAN_800KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_800KBITS();
return true;
case canbus::CAN_1000KBPS: case canbus::CAN_1000KBPS:
*t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1MBITS(); *t_config = (twai_timing_config_t) TWAI_TIMING_CONFIG_1MBITS();
return true; return true;