diff --git a/embassy-rp/src/uart/buffered.rs b/embassy-rp/src/uart/buffered.rs
index 81ac61ee4345af0c0b19a4e395c4ca14a686dccc..87e16f0eb27c660ac86630e7f45ea300bb9aa32e 100644
--- a/embassy-rp/src/uart/buffered.rs
+++ b/embassy-rp/src/uart/buffered.rs
@@ -228,39 +228,39 @@ where
     fn on_interrupt(&mut self) {
         let r = T::regs();
         unsafe {
-            let ris = r.uartmis().read();
+            let ris = r.uartris().read();
             // Clear interrupt flags
             r.uarticr().modify(|w| {
                 w.set_rxic(true);
                 w.set_rtic(true);
             });
 
-            if ris.rxmis() {
-                if ris.pemis() {
-                    warn!("Parity error");
-                    r.uarticr().modify(|w| {
-                        w.set_peic(true);
-                    });
-                }
-                if ris.femis() {
-                    warn!("Framing error");
-                    r.uarticr().modify(|w| {
-                        w.set_feic(true);
-                    });
-                }
-                if ris.bemis() {
-                    warn!("Break error");
-                    r.uarticr().modify(|w| {
-                        w.set_beic(true);
-                    });
-                }
-                if ris.oemis() {
-                    warn!("Overrun error");
-                    r.uarticr().modify(|w| {
-                        w.set_oeic(true);
-                    });
-                }
+            if ris.peris() {
+                warn!("Parity error");
+                r.uarticr().modify(|w| {
+                    w.set_peic(true);
+                });
+            }
+            if ris.feris() {
+                warn!("Framing error");
+                r.uarticr().modify(|w| {
+                    w.set_feic(true);
+                });
+            }
+            if ris.beris() {
+                warn!("Break error");
+                r.uarticr().modify(|w| {
+                    w.set_beic(true);
+                });
+            }
+            if ris.oeris() {
+                warn!("Overrun error");
+                r.uarticr().modify(|w| {
+                    w.set_oeic(true);
+                });
+            }
 
+            if !r.uartfr().read().rxfe() {
                 let buf = self.buf.push_buf();
                 if !buf.is_empty() {
                     buf[0] = r.uartdr().read().data();
@@ -274,7 +274,7 @@ where
                 }
             }
 
-            if ris.rtmis() {
+            if ris.rtris() {
                 self.waker.wake();
             };
         }
@@ -318,27 +318,19 @@ where
     fn on_interrupt(&mut self) {
         let r = T::regs();
         unsafe {
-            let ris = r.uartris().read();
-            // Clear interrupt flags
-            r.uarticr().write(|w| {
-                w.set_rtic(true);
-            });
-
-            if ris.txris() {
-                let buf = self.buf.pop_buf();
-                if !buf.is_empty() {
-                    r.uartimsc().modify(|w| {
-                        w.set_txim(true);
-                    });
-                    r.uartdr().write(|w| w.set_data(buf[0].into()));
-                    self.buf.pop(1);
-                    self.waker.wake();
-                } else {
-                    // Disable interrupt until we have something to transmit again
-                    r.uartimsc().modify(|w| {
-                        w.set_txim(false);
-                    });
-                }
+            let buf = self.buf.pop_buf();
+            if !buf.is_empty() {
+                r.uartimsc().modify(|w| {
+                    w.set_txim(true);
+                });
+                r.uartdr().write(|w| w.set_data(buf[0].into()));
+                self.buf.pop(1);
+                self.waker.wake();
+            } else {
+                // Disable interrupt until we have something to transmit again
+                r.uartimsc().modify(|w| {
+                    w.set_txim(false);
+                });
             }
         }
     }
diff --git a/embassy-rp/src/uart/mod.rs b/embassy-rp/src/uart/mod.rs
index 76ecdf7ac0e355822a56ff5eb23401e226f37dd1..d9285ee510d87216aaaeb7be6383044b863d96ce 100644
--- a/embassy-rp/src/uart/mod.rs
+++ b/embassy-rp/src/uart/mod.rs
@@ -343,7 +343,12 @@ impl<'d, T: Instance, M: Mode> Uart<'d, T, M> {
                 w.set_stp2(config.stop_bits == StopBits::STOP2);
                 w.set_pen(pen);
                 w.set_eps(eps);
-                w.set_fen(false);
+                w.set_fen(true);
+            });
+
+            r.uartifls().write(|w| {
+                w.set_rxiflsel(0b000);
+                w.set_txiflsel(0b000);
             });
 
             r.uartcr().write(|w| {
diff --git a/tests/rp/src/bin/uart_buffered.rs b/tests/rp/src/bin/uart_buffered.rs
index 4313ee3ddceac8b33dfe1556c51215313958607a..9cc20bb982dd6dfcee185c354bd5d855785500c7 100644
--- a/tests/rp/src/bin/uart_buffered.rs
+++ b/tests/rp/src/bin/uart_buffered.rs
@@ -20,8 +20,8 @@ async fn main(_spawner: Spawner) {
     let uart = Uart::new_blocking(uart, tx, rx, config);
 
     let irq = interrupt::take!(UART0_IRQ);
-    let tx_buf = &mut [0u8; 32];
-    let rx_buf = &mut [0u8; 32];
+    let tx_buf = &mut [0u8; 16];
+    let rx_buf = &mut [0u8; 16];
     let mut state = State::new();
     let mut uart = BufferedUart::new(&mut state, uart, irq, tx_buf, rx_buf);
 
@@ -32,10 +32,11 @@ async fn main(_spawner: Spawner) {
         1_u8, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
         30, 31, 32,
     ];
-    uart.write(&data).await.unwrap();
+    uart.write_all(&data).await.unwrap();
+    info!("Done writing");
 
     let mut buf = [0; 32];
-    uart.read(&mut buf).await.unwrap();
+    uart.read_exact(&mut buf).await.unwrap();
     assert_eq!(buf, data);
 
     info!("Test OK");