stm32/can: bxcan async enable
This commit is contained in:
parent
18b9b6c780
commit
2a0fe73045
2 changed files with 17 additions and 2 deletions
|
@ -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| {
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue