continue CAN
This commit is contained in:
parent
a6c9a6fcdc
commit
125619e485
@ -1,6 +1,6 @@
|
|||||||
use arbitrary_int::{u2, u3, u4, u7};
|
use arbitrary_int::{u2, u3, u4, u7, Number};
|
||||||
|
|
||||||
use crate::{clock::Clocks, enable_peripheral_clock, PeripheralSelect};
|
use crate::{clock::Clocks, enable_peripheral_clock, time::Hertz, PeripheralSelect};
|
||||||
|
|
||||||
pub mod regs;
|
pub mod regs;
|
||||||
|
|
||||||
@ -38,16 +38,62 @@ pub struct ClockConfig {
|
|||||||
sjw: u2,
|
sjw: u2,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
#[error("sjw must be less than or equal to the smaller tseg value")]
|
||||||
|
pub struct InvalidSjwError(u2);
|
||||||
|
|
||||||
|
/// Sample point between 0 and 1.0 for the given time segments.
|
||||||
|
pub const fn sample_point(tseg1: u4, tseg2: u3) -> f32 {
|
||||||
|
let tseg1_val = tseg1.value() as f32;
|
||||||
|
(tseg1_val + 1.0) / (1.0 + tseg1_val + tseg2.value() as f32)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
#[error("invalid sample point {sample_point} for tseg1 {tseg1} and tseg2 {tseg2}.")]
|
||||||
|
pub struct InvalidSamplePointError {
|
||||||
|
tseg1: u4,
|
||||||
|
tseg2: u3,
|
||||||
|
/// Sample point, should be larger than 0.5 (50 %) but was not.
|
||||||
|
sample_point: f32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
pub enum ClockConfigError {
|
||||||
|
#[error("invalid sjw: {0}")]
|
||||||
|
InvalidSjw(#[from] InvalidSjwError),
|
||||||
|
#[error("invalid sample point: {0}")]
|
||||||
|
InvalidSamplePoint(#[from] InvalidSamplePointError),
|
||||||
|
}
|
||||||
|
|
||||||
impl ClockConfig {
|
impl ClockConfig {
|
||||||
/// New clock configuration from the raw configuration values.
|
/// New clock configuration from the raw configuration values.
|
||||||
pub fn new(prescaler: u7, tseg1: u4, tseg2: u3, sjw: u2) -> Self {
|
///
|
||||||
Self {
|
/// The synchronization jump width MUST be smaller than the smaller of the time segment
|
||||||
|
/// configuration values. The sample point must also be larger than 50 %.
|
||||||
|
pub fn new(prescaler: u7, tseg1: u4, tseg2: u3, sjw: u2) -> Result<Self, ClockConfigError> {
|
||||||
|
let smaller_tseg = core::cmp::min(tseg1.value(), tseg2.value());
|
||||||
|
if sjw.value() > smaller_tseg {
|
||||||
|
return Err(InvalidSjwError(sjw).into());
|
||||||
|
}
|
||||||
|
let sample_point = sample_point(tseg1, tseg2);
|
||||||
|
if sample_point < 0.5 {
|
||||||
|
return Err(InvalidSamplePointError {
|
||||||
|
tseg1,
|
||||||
|
tseg2,
|
||||||
|
sample_point,
|
||||||
|
}.into());
|
||||||
|
}
|
||||||
|
Ok(Self {
|
||||||
prescaler,
|
prescaler,
|
||||||
tseg1,
|
tseg1,
|
||||||
tseg2,
|
tseg2,
|
||||||
sjw,
|
sjw,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn from_bitrate(clocks: &Clocks, bitrate: Hertz, prescaler: u7, tseg1: u4, tseg2: u3, sjw: u2) {}
|
||||||
|
|
||||||
|
pub fn from_sample_point(clocks: &Clocks, bitrate: Hertz, sample_point: f32) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Can {
|
impl Can {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user