stm32/can: bxcan async enable

This commit is contained in:
chemicstry 2023-07-24 17:46:03 +03:00
parent 18b9b6c780
commit 2a0fe73045
2 changed files with 17 additions and 2 deletions

View file

@ -161,6 +161,18 @@ impl<'d, T: Instance> Can<'d, T> {
.leave_disabled();
}
/// Enables the peripheral and synchronizes with the bus.
///
/// This will wait for 11 consecutive recessive bits (bus idle state).
/// Contrary to enable method from bxcan library, this will not freeze the executor while waiting.
pub async fn enable(&mut self) {
while self.borrow_mut().enable_non_blocking().is_err() {
// SCE interrupt is only generated for entering sleep mode, but not leaving.
// Yield to allow other tasks to execute while can bus is initializing.
embassy_futures::yield_now().await;
}
}
/// Queues the message to be sent but exerts backpressure
pub async fn write(&mut self, frame: &Frame) -> bxcan::TransmitStatus {
poll_fn(|cx| {

View file

@ -40,10 +40,13 @@ async fn main(_spawner: Spawner) {
can.as_mut()
.modify_config()
.set_bit_timing(0x001c0003) // http://www.bittiming.can-wiki.info/
.set_loopback(true) // Receive own frames
.set_silent(true)
.enable();
.leave_disabled();
can.set_bitrate(1_000_000);
can.enable().await;
let mut i: u8 = 0;
loop {