Enable TWAI for ESP32-C6 (#1323)

* Enable TWAI for ESP32-C6

* CHANGELOG.md

* Make Clippy happy, again

* Make Clippy happy. For real this time

* Remove debug code
This commit is contained in:
Björn Quentin 2024-03-21 16:16:44 +01:00 committed by GitHub
parent baea915935
commit 4e5020f83f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 27 additions and 5 deletions

View File

@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `interrupt::enable` now has a direct CPU enable counter part, `interrupt::enable_direct` (#1310)
- `Delay::delay(time: fugit::MicrosDurationU64)`
- Added async support for TWAI (#1320)
- Add TWAI support for ESP32-C6 (#1323)
### Fixed

View File

@ -684,6 +684,14 @@ impl PeripheralClockControl {
system
.twai0_conf()
.modify(|_, w| w.twai0_rst_en().clear_bit());
// use Xtal clk-src
system.twai0_func_clk_conf().modify(|_, w| {
w.twai0_func_clk_en()
.set_bit()
.twai0_func_clk_sel()
.variant(false)
});
}
#[cfg(twai1)]
Peripheral::Twai1 => {

View File

@ -81,6 +81,7 @@ use core::marker::PhantomData;
use embedded_can::{nb::Can, Error, ErrorKind, ExtendedId, Frame, Id, StandardId};
#[cfg(not(feature = "embedded-hal"))] // FIXME
use embedded_hal_02::can::{Can, Error, ErrorKind, ExtendedId, Frame, Id, StandardId};
#[cfg(not(esp32c6))]
use fugit::HertzU32;
use self::filter::{Filter, FilterType};
@ -227,8 +228,11 @@ impl BaudRate {
// {.brp = 4, .tseg_1 = 16, .tseg_2 = 8, .sjw = 3, .triple_sampling = false}
// #define TWAI_TIMING_CONFIG_1MBITS() {.brp = 4, .tseg_1 = 15, .tseg_2 = 4,
// .sjw = 3, .triple_sampling = false}
//
// see https://github.com/espressif/esp-idf/tree/master/components/hal/include/hal/twai_types.h
const fn timing(self) -> TimingConfig {
match self {
#[allow(unused_mut)]
let mut timing = match self {
Self::B125K => TimingConfig {
baud_rate_prescaler: 32,
sync_jump_width: 3,
@ -258,7 +262,15 @@ impl BaudRate {
triple_sample: false,
},
Self::Custom(timing_config) => timing_config,
};
#[cfg(esp32c6)]
{
// clock source on ESP32-C6 is xtal (40MHz)
timing.baud_rate_prescaler /= 2;
}
timing
}
}
@ -298,10 +310,11 @@ where
/// Set the bitrate of the bus.
///
/// Note: The timings currently assume a APB_CLK of 80MHz.
fn set_baud_rate(&mut self, baud_rate: BaudRate, clocks: &Clocks) {
fn set_baud_rate(&mut self, baud_rate: BaudRate, _clocks: &Clocks) {
// TWAI is clocked from the APB_CLK according to Table 6-4 [ESP32C3 Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32-c3_technical_reference_manual_en.pdf)
// Included timings are all for 80MHz so assert that we are running at 80MHz.
assert!(clocks.apb_clock == HertzU32::MHz(80));
#[cfg(not(esp32c6))]
assert!(_clocks.apb_clock == HertzU32::MHz(80));
// Unpack the baud rate timings and convert them to the values needed for the
// register. Many of the registers have a minimum value of 1 which is

View File

@ -10,7 +10,7 @@
//! This example should work with another ESP board running the `twai` example
//! with `IS_SENDER` set to `true`.
//% CHIPS: esp32c3 esp32s2 esp32s3
//% CHIPS: esp32c3 esp32c6 esp32s2 esp32s3
//% FEATURES: async embassy embassy-executor-thread embassy-time-timg0 embassy-generic-timers
#![no_std]

View File

@ -11,7 +11,7 @@
//!
//! `IS_FIRST_SENDER` below must be set to false on one of the ESP's
//% CHIPS: esp32c3 esp32s2 esp32s3
//% CHIPS: esp32c3 esp32c6 esp32s2 esp32s3
//% FEATURES: embedded-hal
#![no_std]