Merge pull request #1685 from chemicstry/bxcan_async_enable
stm32/can: bxcan async enable
This commit is contained in:
commit
9f898c460f
@ -161,6 +161,18 @@ impl<'d, T: Instance> Can<'d, T> {
|
|||||||
.leave_disabled();
|
.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
|
/// Queues the message to be sent but exerts backpressure
|
||||||
pub async fn write(&mut self, frame: &Frame) -> bxcan::TransmitStatus {
|
pub async fn write(&mut self, frame: &Frame) -> bxcan::TransmitStatus {
|
||||||
poll_fn(|cx| {
|
poll_fn(|cx| {
|
||||||
|
@ -40,10 +40,13 @@ async fn main(_spawner: Spawner) {
|
|||||||
|
|
||||||
can.as_mut()
|
can.as_mut()
|
||||||
.modify_config()
|
.modify_config()
|
||||||
.set_bit_timing(0x001c0003) // http://www.bittiming.can-wiki.info/
|
|
||||||
.set_loopback(true) // Receive own frames
|
.set_loopback(true) // Receive own frames
|
||||||
.set_silent(true)
|
.set_silent(true)
|
||||||
.enable();
|
.leave_disabled();
|
||||||
|
|
||||||
|
can.set_bitrate(1_000_000);
|
||||||
|
|
||||||
|
can.enable().await;
|
||||||
|
|
||||||
let mut i: u8 = 0;
|
let mut i: u8 = 0;
|
||||||
loop {
|
loop {
|
||||||
|
Loading…
Reference in New Issue
Block a user