aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-06-17 22:50:13 +0200
committerDario Nieuwenhuis <[email protected]>2024-06-25 23:18:16 +0200
commitc48547b475eb039a9d30f4c1e03d0c9f65cdec18 (patch)
treeb4f389f2f13b96d9aca2f9bcd59cac26342251b8
parente4c4036a46218b3ba4bde28e4e056a439ac7055b (diff)
nrf: fix wrong order configuring gpios.
Docs say "PSEL.RXD, PSEL.RTS, PSEL.RTS, and PSEL.TXD must only be configured when the UARTE is disabled." For some reason nrf52 doesn't care but nrf91 does.
-rw-r--r--embassy-nrf/src/buffered_uarte.rs3
-rw-r--r--embassy-nrf/src/uarte.rs5
2 files changed, 6 insertions, 2 deletions
diff --git a/embassy-nrf/src/buffered_uarte.rs b/embassy-nrf/src/buffered_uarte.rs
index 385d4015e..071c18760 100644
--- a/embassy-nrf/src/buffered_uarte.rs
+++ b/embassy-nrf/src/buffered_uarte.rs
@@ -304,6 +304,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarte<'d, U, T> {
304 let tx = BufferedUarteTx::new_innerer(unsafe { peri.clone_unchecked() }, txd, cts, tx_buffer); 304 let tx = BufferedUarteTx::new_innerer(unsafe { peri.clone_unchecked() }, txd, cts, tx_buffer);
305 let rx = BufferedUarteRx::new_innerer(peri, timer, ppi_ch1, ppi_ch2, ppi_group, rxd, rts, rx_buffer); 305 let rx = BufferedUarteRx::new_innerer(peri, timer, ppi_ch1, ppi_ch2, ppi_group, rxd, rts, rx_buffer);
306 306
307 U::regs().enable.write(|w| w.enable().enabled());
307 U::Interrupt::pend(); 308 U::Interrupt::pend();
308 unsafe { U::Interrupt::enable() }; 309 unsafe { U::Interrupt::enable() };
309 310
@@ -405,6 +406,7 @@ impl<'d, U: UarteInstance> BufferedUarteTx<'d, U> {
405 406
406 let this = Self::new_innerer(peri, txd, cts, tx_buffer); 407 let this = Self::new_innerer(peri, txd, cts, tx_buffer);
407 408
409 U::regs().enable.write(|w| w.enable().enabled());
408 U::Interrupt::pend(); 410 U::Interrupt::pend();
409 unsafe { U::Interrupt::enable() }; 411 unsafe { U::Interrupt::enable() };
410 412
@@ -602,6 +604,7 @@ impl<'d, U: UarteInstance, T: TimerInstance> BufferedUarteRx<'d, U, T> {
602 604
603 let this = Self::new_innerer(peri, timer, ppi_ch1, ppi_ch2, ppi_group, rxd, rts, rx_buffer); 605 let this = Self::new_innerer(peri, timer, ppi_ch1, ppi_ch2, ppi_group, rxd, rts, rx_buffer);
604 606
607 U::regs().enable.write(|w| w.enable().enabled());
605 U::Interrupt::pend(); 608 U::Interrupt::pend();
606 unsafe { U::Interrupt::enable() }; 609 unsafe { U::Interrupt::enable() };
607 610
diff --git a/embassy-nrf/src/uarte.rs b/embassy-nrf/src/uarte.rs
index fa0a773a8..4cf193617 100644
--- a/embassy-nrf/src/uarte.rs
+++ b/embassy-nrf/src/uarte.rs
@@ -221,6 +221,7 @@ impl<'d, T: Instance> Uarte<'d, T> {
221 221
222 T::Interrupt::unpend(); 222 T::Interrupt::unpend();
223 unsafe { T::Interrupt::enable() }; 223 unsafe { T::Interrupt::enable() };
224 r.enable.write(|w| w.enable().enabled());
224 225
225 let s = T::state(); 226 let s = T::state();
226 s.tx_rx_refcount.store(2, Ordering::Relaxed); 227 s.tx_rx_refcount.store(2, Ordering::Relaxed);
@@ -319,9 +320,7 @@ pub(crate) fn configure(r: &RegisterBlock, config: Config, hardware_flow_control
319 r.psel.cts.write(|w| w.connect().disconnected()); 320 r.psel.cts.write(|w| w.connect().disconnected());
320 r.psel.rts.write(|w| w.connect().disconnected()); 321 r.psel.rts.write(|w| w.connect().disconnected());
321 322
322 // Enable
323 apply_workaround_for_enable_anomaly(r); 323 apply_workaround_for_enable_anomaly(r);
324 r.enable.write(|w| w.enable().enabled());
325} 324}
326 325
327impl<'d, T: Instance> UarteTx<'d, T> { 326impl<'d, T: Instance> UarteTx<'d, T> {
@@ -369,6 +368,7 @@ impl<'d, T: Instance> UarteTx<'d, T> {
369 368
370 T::Interrupt::unpend(); 369 T::Interrupt::unpend();
371 unsafe { T::Interrupt::enable() }; 370 unsafe { T::Interrupt::enable() };
371 r.enable.write(|w| w.enable().enabled());
372 372
373 let s = T::state(); 373 let s = T::state();
374 s.tx_rx_refcount.store(1, Ordering::Relaxed); 374 s.tx_rx_refcount.store(1, Ordering::Relaxed);
@@ -567,6 +567,7 @@ impl<'d, T: Instance> UarteRx<'d, T> {
567 567
568 T::Interrupt::unpend(); 568 T::Interrupt::unpend();
569 unsafe { T::Interrupt::enable() }; 569 unsafe { T::Interrupt::enable() };
570 r.enable.write(|w| w.enable().enabled());
570 571
571 let s = T::state(); 572 let s = T::state();
572 s.tx_rx_refcount.store(1, Ordering::Relaxed); 573 s.tx_rx_refcount.store(1, Ordering::Relaxed);