first CAN test works
This commit is contained in:
@ -7,6 +7,7 @@ edition = "2021"
|
||||
cortex-m-rt = "0.7"
|
||||
cfg-if = "1"
|
||||
embedded-io = "0.6"
|
||||
embedded-can = "0.4"
|
||||
embedded-hal-async = "1"
|
||||
embedded-io-async = "0.6"
|
||||
|
||||
|
@ -31,26 +31,66 @@ async fn main(_spawner: Spawner) {
|
||||
va416xx_embassy::init(dp.tim15, dp.tim14, &clocks);
|
||||
defmt::info!("creating CAN peripheral driver");
|
||||
defmt::info!("clocks: {}", clocks);
|
||||
let clk_config = ClockConfig::from_bitrate_and_segments(&clocks, 250.kHz(), 4, 14, 5)
|
||||
let clk_config = ClockConfig::from_bitrate_and_segments(&clocks, 250.kHz(), 14, 5, 4)
|
||||
.expect("CAN clock config error");
|
||||
let mut can = Can::new(dp.can0, clk_config);
|
||||
can.set_loopback(true);
|
||||
can.set_bufflock(true);
|
||||
can.modify_control(|mut val| {
|
||||
val.set_loopback(true);
|
||||
val.set_ignore_ack(true);
|
||||
val.set_internal(true);
|
||||
val.set_bufflock(true);
|
||||
val.set_diag_enable(true);
|
||||
val
|
||||
});
|
||||
can.set_base_mask_for_all_match();
|
||||
can.enable();
|
||||
let err_counter = can.read_error_counters();
|
||||
defmt::info!(
|
||||
"error count tx {}, error count rx {}",
|
||||
err_counter.transmit(),
|
||||
err_counter.receive()
|
||||
);
|
||||
let mut channels = can.take_channels().unwrap();
|
||||
// Transmit channel.
|
||||
let mut tx = CanTx::new(channels.take(0).unwrap(), None);
|
||||
// Base channel which has dedicated mask.
|
||||
let mut rx = CanRx::new(channels.take(14).unwrap());
|
||||
let send_frame = CanFrame::Normal(CanFrameNormal::new(
|
||||
can::Id::Standard(can::StandardId::new(0x1).unwrap()),
|
||||
&[1, 2, 3, 4],
|
||||
));
|
||||
let mut rx_dedicated = CanRx::new(channels.take(1).unwrap());
|
||||
// Base channel which has dedicated mask.
|
||||
let mut rx_base = CanRx::new(channels.take(14).unwrap());
|
||||
let standard_id = can::StandardId::new(0x42).unwrap();
|
||||
let send_frame = CanFrame::Normal(
|
||||
CanFrameNormal::new(can::Id::Standard(standard_id), &[1, 2, 3, 4]).unwrap(),
|
||||
);
|
||||
rx_dedicated
|
||||
.configure_for_reception_with_standard_id(standard_id, false)
|
||||
.unwrap();
|
||||
rx_base.configure_for_reception();
|
||||
defmt::info!("sending CAN frame");
|
||||
tx.transmit_frame(send_frame).unwrap();
|
||||
let _frame = nb::block!(rx.receive(true)).expect("invalid CAN rx state");
|
||||
defmt::info!("received CAN frame with data");
|
||||
let frame = nb::block!(rx_dedicated.receive(true)).expect("invalid CAN rx state");
|
||||
let err_counter = can.read_error_counters();
|
||||
defmt::info!(
|
||||
"error count tx {}, error count rx {}",
|
||||
err_counter.transmit(),
|
||||
err_counter.receive()
|
||||
);
|
||||
let diag = can.read_error_diagnostics();
|
||||
defmt::info!("EFID: {}, EBID: {}", diag.efid(), diag.ebid());
|
||||
match frame {
|
||||
CanFrame::Normal(can_frame_normal) => match can_frame_normal.id() {
|
||||
can::Id::Standard(standard_id) => {
|
||||
defmt::info!(
|
||||
"received CAN frame with ID {} and data {}",
|
||||
standard_id.as_raw(),
|
||||
can_frame_normal.data()
|
||||
);
|
||||
}
|
||||
can::Id::Extended(_) => (),
|
||||
},
|
||||
_ => {
|
||||
defmt::error!("received unexpected CAN remote frame");
|
||||
}
|
||||
}
|
||||
loop {}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user