Add ability to invert UART pins
This is useful in some cases where the surrounding circuit for some reason inverts the UART signal, for instance if you're talking to a device via an optocoupler.
This commit is contained in:
parent
a3ecf5caf6
commit
b9fc2a6b33
@ -6,6 +6,7 @@ use crate::dma::{AnyChannel, Channel};
|
|||||||
use crate::gpio::sealed::Pin;
|
use crate::gpio::sealed::Pin;
|
||||||
use crate::gpio::AnyPin;
|
use crate::gpio::AnyPin;
|
||||||
use crate::{pac, peripherals, Peripheral};
|
use crate::{pac, peripherals, Peripheral};
|
||||||
|
use crate::pac::io::vals::Inover;
|
||||||
|
|
||||||
#[cfg(feature = "nightly")]
|
#[cfg(feature = "nightly")]
|
||||||
mod buffered;
|
mod buffered;
|
||||||
@ -53,6 +54,14 @@ pub struct Config {
|
|||||||
pub data_bits: DataBits,
|
pub data_bits: DataBits,
|
||||||
pub stop_bits: StopBits,
|
pub stop_bits: StopBits,
|
||||||
pub parity: Parity,
|
pub parity: Parity,
|
||||||
|
/// Invert the tx pin output
|
||||||
|
pub invert_tx: bool,
|
||||||
|
/// Invert the rx pin input
|
||||||
|
pub invert_rx: bool,
|
||||||
|
// Invert the rts pin
|
||||||
|
pub invert_rts: bool,
|
||||||
|
// Invert the cts pin
|
||||||
|
pub invert_cts: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Config {
|
impl Default for Config {
|
||||||
@ -62,6 +71,10 @@ impl Default for Config {
|
|||||||
data_bits: DataBits::DataBits8,
|
data_bits: DataBits::DataBits8,
|
||||||
stop_bits: StopBits::STOP1,
|
stop_bits: StopBits::STOP1,
|
||||||
parity: Parity::ParityNone,
|
parity: Parity::ParityNone,
|
||||||
|
invert_rx: false,
|
||||||
|
invert_tx: false,
|
||||||
|
invert_rts: false,
|
||||||
|
invert_cts: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -381,19 +394,31 @@ impl<'d, T: Instance + 'd, M: Mode> Uart<'d, T, M> {
|
|||||||
let r = T::regs();
|
let r = T::regs();
|
||||||
unsafe {
|
unsafe {
|
||||||
if let Some(pin) = &tx {
|
if let Some(pin) = &tx {
|
||||||
pin.io().ctrl().write(|w| w.set_funcsel(2));
|
pin.io().ctrl().write(|w| {
|
||||||
|
w.set_funcsel(2);
|
||||||
|
w.set_inover(if config.invert_tx { Inover::INVERT } else { Inover::NORMAL });
|
||||||
|
});
|
||||||
pin.pad_ctrl().write(|w| w.set_ie(true));
|
pin.pad_ctrl().write(|w| w.set_ie(true));
|
||||||
}
|
}
|
||||||
if let Some(pin) = &rx {
|
if let Some(pin) = &rx {
|
||||||
pin.io().ctrl().write(|w| w.set_funcsel(2));
|
pin.io().ctrl().write(|w| {
|
||||||
|
w.set_funcsel(2);
|
||||||
|
w.set_inover(if config.invert_rx { Inover::INVERT } else { Inover::NORMAL });
|
||||||
|
});
|
||||||
pin.pad_ctrl().write(|w| w.set_ie(true));
|
pin.pad_ctrl().write(|w| w.set_ie(true));
|
||||||
}
|
}
|
||||||
if let Some(pin) = &cts {
|
if let Some(pin) = &cts {
|
||||||
pin.io().ctrl().write(|w| w.set_funcsel(2));
|
pin.io().ctrl().write(|w| {
|
||||||
|
w.set_funcsel(2);
|
||||||
|
w.set_inover(if config.invert_cts { Inover::INVERT } else { Inover::NORMAL });
|
||||||
|
});
|
||||||
pin.pad_ctrl().write(|w| w.set_ie(true));
|
pin.pad_ctrl().write(|w| w.set_ie(true));
|
||||||
}
|
}
|
||||||
if let Some(pin) = &rts {
|
if let Some(pin) = &rts {
|
||||||
pin.io().ctrl().write(|w| w.set_funcsel(2));
|
pin.io().ctrl().write(|w| {
|
||||||
|
w.set_funcsel(2);
|
||||||
|
w.set_inover(if config.invert_rts { Inover::INVERT } else { Inover::NORMAL });
|
||||||
|
});
|
||||||
pin.pad_ctrl().write(|w| w.set_ie(true));
|
pin.pad_ctrl().write(|w| w.set_ie(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user