diff options
| author | Dario Nieuwenhuis <[email protected]> | 2024-06-17 22:50:13 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2024-06-25 23:18:16 +0200 |
| commit | c48547b475eb039a9d30f4c1e03d0c9f65cdec18 (patch) | |
| tree | b4f389f2f13b96d9aca2f9bcd59cac26342251b8 | |
| parent | e4c4036a46218b3ba4bde28e4e056a439ac7055b (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.rs | 3 | ||||
| -rw-r--r-- | embassy-nrf/src/uarte.rs | 5 |
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 | ||
| 327 | impl<'d, T: Instance> UarteTx<'d, T> { | 326 | impl<'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); |
