Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 3948d69

Browse files
committedDec 24, 2024·
fix 16bit offset
1 parent c886951 commit 3948d69

File tree

5 files changed

+40
-24
lines changed

5 files changed

+40
-24
lines changed
 

‎src/can/can.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ impl<'d, T: Instance> Can<'d, T> {
5757
let Some(bit_timings) = util::calc_can_timings(T::frequency().0, bitrate) else {
5858
return Err(CanInitError::InvalidTimings);
5959
};
60-
// .expect("Bit timing parameters weren't satisfied for CAN clock rate and desired bitrate.");
60+
6161
Registers(T::regs()).set_bit_timing_and_mode(bit_timings, mode);
6262

6363
Registers(T::regs()).leave_init_mode(); // Exit CAN initialization mode

‎src/can/filter/bit16.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ pub struct Bit16MaskReg<'a> {
1111

1212
impl Bit16IdReg<'_> {
1313
pub fn set(&mut self, id: StandardId, opts: FilterOptions) {
14-
let bits = (id.as_raw() << 3) | ((opts.rtr_enabled as u16) << 2);
15-
*self.0 &= 0x0000;
14+
let bits = (id.as_raw() << 5) | ((opts.rtr_enabled as u16) << 4);
15+
*self.0 = 0x0000;
1616
*self.0 |= bits;
1717
}
1818
}
@@ -22,8 +22,8 @@ impl Bit16MaskReg<'_> {
2222
*self.mask &= 0xFFFF;
2323
*self.id &= 0xFFFF;
2424

25-
*self.mask |= (id << 3) | ((opts.rtr_enabled as u16) << 2);
26-
*self.id |= (mask << 3) | ((opts.rtr_enabled as u16) << 2);
25+
*self.mask |= (id << 5) | ((opts.rtr_enabled as u16) << 4);
26+
*self.id |= (mask << 5) | ((opts.rtr_enabled as u16) << 4);
2727
}
2828
}
2929

‎src/can/filter/bit32.rs

+14-14
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,17 @@ impl<MODE: FilterMode> CanFilter<Bit32Mode, MODE> {
1313
id_value: 0,
1414
mode: self.mode,
1515
bank: self.bank,
16-
bit_mode: PhantomData,
16+
bit_mode: Bit16Mode,
1717
}
1818
}
1919
}
2020

2121
impl CanFilter<Bit32Mode, ListMode> {
22-
/// Creates a filter that accepts all frames
23-
pub fn accept_all() -> Self {
24-
CanFilter {
25-
bank: 0,
26-
mode: ListMode,
27-
id_value: 0,
28-
id_mask: 0,
29-
bit_mode: PhantomData,
30-
}
31-
}
32-
3322
/// Create a filter to configure id list
3423
pub fn new_id_list() -> Self {
3524
Self {
3625
bank: 0,
37-
bit_mode: PhantomData,
26+
bit_mode: Bit32Mode,
3827
mode: ListMode,
3928

4029
id_mask: 0,
@@ -44,10 +33,21 @@ impl CanFilter<Bit32Mode, ListMode> {
4433
}
4534

4635
impl CanFilter<Bit32Mode, MaskMode> {
36+
/// Creates a filter that accepts all frames
37+
pub fn accept_all() -> Self {
38+
CanFilter {
39+
bank: 0,
40+
mode: MaskMode,
41+
id_value: 0,
42+
id_mask: 0,
43+
bit_mode: Bit32Mode,
44+
}
45+
}
46+
4747
pub fn new_id_mask() -> Self {
4848
Self {
4949
bank: 0,
50-
bit_mode: PhantomData,
50+
bit_mode: Bit32Mode,
5151
mode: MaskMode,
5252

5353
id_mask: 0,

‎src/can/filter/mod.rs

+15-4
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,24 @@ impl FilterMode for ListMode {
2424
}
2525
}
2626

27-
pub trait BitMode {}
27+
pub trait BitMode {
28+
fn val_bool(&self) -> bool;
29+
}
2830

2931
pub struct Bit16Mode;
3032
pub struct Bit32Mode;
3133

32-
impl BitMode for Bit16Mode {}
33-
impl BitMode for Bit32Mode {}
34+
impl BitMode for Bit16Mode {
35+
fn val_bool(&self) -> bool {
36+
false
37+
}
38+
}
39+
40+
impl BitMode for Bit32Mode {
41+
fn val_bool(&self) -> bool {
42+
true
43+
}
44+
}
3445

3546
/// See table 24-1 of the reference manual for more details on filtering and modes.
3647
/// Each filter is applied for only one bank and for one register on it bank
@@ -43,7 +54,7 @@ pub struct CanFilter<BIT: BitMode, MODE: FilterMode> {
4354
/// Bit mask to be applied to incoming message before comparing it to a predefined value.
4455
/// In IdList mode, this is used in the same way as `id_value` is.
4556
pub id_mask: u32,
46-
pub bit_mode: PhantomData<BIT>,
57+
pub bit_mode: BIT,
4758
pub mode: MODE,
4859
}
4960

‎src/can/registers.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ impl Registers {
5353
) {
5454
self.0.fctlr().modify(|w| w.set_finit(true)); // Enable filter init mode
5555
self.0.fwr().modify(|w| w.set_fact(filter.bank, true)); // Activate new filter in filter bank
56-
self.0.fscfgr().modify(|w| w.set_fsc(filter.bank, true)); // Set filter scale config to single 32-bit (16-bit not implemented)
56+
self.0.fscfgr().modify(|w| w.set_fsc(filter.bank, filter.bit_mode.val_bool())); // Set filter scale config (32bit or 16bit mode)
5757
self.0
5858
.fr(filter.fr_id_value_reg())
5959
.write_value(crate::pac::can::regs::Fr(filter.id_value)); // Set filter's id value to match/mask
@@ -138,6 +138,11 @@ impl Registers {
138138
self.0.rfifo(fifo.val()).read().fmp() != 0
139139
}
140140

141+
pub fn reset_fifo(&self, fifo: &super::CanFifo) {
142+
self.0.rfifo(fifo.val()).modify(|w| w.set_fmp(0));
143+
self.0.rfifo(fifo.val()).modify(|w| w.set_fovr(false));
144+
}
145+
141146
pub fn read_frame_fifo(&self, fifo: &super::CanFifo) -> super::frame::CanFrame {
142147
let dlc = self.0.rxmdtr(fifo.val()).read().dlc() as usize;
143148
let raw_id = self.0.rxmir(fifo.val()).read().stid();

0 commit comments

Comments
 (0)
Please sign in to comment.