stm32: can: fd: write: if in TX FIFO mode & bufs full, then abort
This commit is contained in:
parent
30606f9782
commit
befbb2845a
2 changed files with 24 additions and 8 deletions
|
@ -288,7 +288,7 @@ impl Default for GlobalFilter {
|
|||
}
|
||||
|
||||
/// TX buffer operation mode
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
|
||||
pub enum TxBufferMode {
|
||||
/// TX FIFO operation
|
||||
Fifo,
|
||||
|
@ -305,6 +305,15 @@ impl From<TxBufferMode> for crate::pac::can::vals::Tfqm {
|
|||
}
|
||||
}
|
||||
|
||||
impl From<crate::pac::can::vals::Tfqm> for TxBufferMode {
|
||||
fn from(value: crate::pac::can::vals::Tfqm) -> Self {
|
||||
match value {
|
||||
crate::pac::can::vals::Tfqm::QUEUE => Self::Queue,
|
||||
crate::pac::can::vals::Tfqm::FIFO => Self::Fifo,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// FdCan Config Struct
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct FdCanConfig {
|
||||
|
|
|
@ -114,6 +114,12 @@ impl Registers {
|
|||
self.regs.txfqs().read().tfqf()
|
||||
}
|
||||
|
||||
/// Returns the current TX buffer operation mode (queue or FIFO)
|
||||
#[inline]
|
||||
pub fn tx_queue_mode(&self) -> TxBufferMode {
|
||||
self.regs.txbc().read().tfqm().into()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn has_pending_frame(&self, idx: usize) -> bool {
|
||||
self.regs.txbrp().read().trp(idx)
|
||||
|
@ -197,13 +203,14 @@ impl Registers {
|
|||
}
|
||||
|
||||
pub fn write<F: embedded_can::Frame + CanHeader>(&self, frame: &F) -> nb::Result<Option<F>, Infallible> {
|
||||
let queue_is_full = self.tx_queue_is_full();
|
||||
|
||||
let id = frame.header().id();
|
||||
|
||||
// If the queue is full,
|
||||
// Discard the first slot with a lower priority message
|
||||
let (idx, pending_frame) = if queue_is_full {
|
||||
let (idx, pending_frame) = if self.tx_queue_is_full() {
|
||||
if self.tx_queue_mode() == TxBufferMode::Fifo {
|
||||
// Does not make sense to cancel a pending frame when using FIFO
|
||||
return Err(nb::Error::WouldBlock);
|
||||
}
|
||||
// If the queue is full,
|
||||
// Discard the first slot with a lower priority message
|
||||
let id = frame.header().id();
|
||||
if self.is_available(0, id) {
|
||||
(0, self.abort_pending_mailbox_generic(0))
|
||||
} else if self.is_available(1, id) {
|
||||
|
|
Loading…
Reference in a new issue