aboutsummaryrefslogtreecommitdiff
path: root/tests/nrf/src
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2023-03-04 05:37:13 +0100
committerDario Nieuwenhuis <[email protected]>2023-03-04 15:12:49 +0100
commit7650fea5f2bed1c39a0ff6c5934709d316547a23 (patch)
tree68a7e27b026995b88f38934ae73845f8bb5e10ae /tests/nrf/src
parent916f94b36663cbb638654b34acd53e30beb5c7b6 (diff)
nrf/buffered_uarte: add HIL tests.
Diffstat (limited to 'tests/nrf/src')
-rw-r--r--tests/nrf/src/bin/buffered_uart.rs74
-rw-r--r--tests/nrf/src/bin/buffered_uart_spam.rs86
2 files changed, 160 insertions, 0 deletions
diff --git a/tests/nrf/src/bin/buffered_uart.rs b/tests/nrf/src/bin/buffered_uart.rs
new file mode 100644
index 000000000..0550b0bb7
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart.rs
@@ -0,0 +1,74 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5use defmt::{assert_eq, *};
6use embassy_executor::Spawner;
7use embassy_futures::join::join;
8use embassy_nrf::buffered_uarte::BufferedUarte;
9use embassy_nrf::{interrupt, uarte};
10use {defmt_rtt as _, panic_probe as _};
11
12#[embassy_executor::main]
13async fn main(_spawner: Spawner) {
14 let p = embassy_nrf::init(Default::default());
15 let mut config = uarte::Config::default();
16 config.parity = uarte::Parity::EXCLUDED;
17 config.baudrate = uarte::Baudrate::BAUD1M;
18
19 let mut tx_buffer = [0u8; 1024];
20 let mut rx_buffer = [0u8; 1024];
21
22 let mut u = BufferedUarte::new(
23 p.UARTE0,
24 p.TIMER0,
25 p.PPI_CH0,
26 p.PPI_CH1,
27 p.PPI_GROUP0,
28 interrupt::take!(UARTE0_UART0),
29 p.P1_03,
30 p.P1_02,
31 config.clone(),
32 &mut rx_buffer,
33 &mut tx_buffer,
34 );
35
36 info!("uarte initialized!");
37
38 let (mut rx, mut tx) = u.split();
39
40 const COUNT: usize = 40_000;
41
42 let tx_fut = async {
43 let mut tx_buf = [0; 215];
44 let mut i = 0;
45 while i < COUNT {
46 let n = tx_buf.len().min(COUNT - i);
47 let tx_buf = &mut tx_buf[..n];
48 for (j, b) in tx_buf.iter_mut().enumerate() {
49 *b = (i + j) as u8;
50 }
51 let n = unwrap!(tx.write(tx_buf).await);
52 i += n;
53 }
54 };
55 let rx_fut = async {
56 let mut i = 0;
57 while i < COUNT {
58 let buf = unwrap!(rx.fill_buf().await);
59
60 for &b in buf {
61 assert_eq!(b, i as u8);
62 i = i + 1;
63 }
64
65 let n = buf.len();
66 rx.consume(n);
67 }
68 };
69
70 join(rx_fut, tx_fut).await;
71
72 info!("Test OK");
73 cortex_m::asm::bkpt();
74}
diff --git a/tests/nrf/src/bin/buffered_uart_spam.rs b/tests/nrf/src/bin/buffered_uart_spam.rs
new file mode 100644
index 000000000..57aaeca45
--- /dev/null
+++ b/tests/nrf/src/bin/buffered_uart_spam.rs
@@ -0,0 +1,86 @@
1#![no_std]
2#![no_main]
3#![feature(type_alias_impl_trait)]
4
5use core::mem;
6use core::ptr::NonNull;
7
8use defmt::{assert_eq, *};
9use embassy_executor::Spawner;
10use embassy_nrf::buffered_uarte::BufferedUarte;
11use embassy_nrf::gpio::{Level, Output, OutputDrive};
12use embassy_nrf::ppi::{Event, Ppi, Task};
13use embassy_nrf::uarte::Uarte;
14use embassy_nrf::{interrupt, pac, uarte};
15use embassy_time::{Duration, Timer};
16use {defmt_rtt as _, panic_probe as _};
17
18#[embassy_executor::main]
19async fn main(_spawner: Spawner) {
20 let mut p = embassy_nrf::init(Default::default());
21 let mut config = uarte::Config::default();
22 config.parity = uarte::Parity::EXCLUDED;
23 config.baudrate = uarte::Baudrate::BAUD1M;
24
25 let mut tx_buffer = [0u8; 1024];
26 let mut rx_buffer = [0u8; 1024];
27
28 mem::forget(Output::new(&mut p.P1_02, Level::High, OutputDrive::Standard));
29
30 let mut u = BufferedUarte::new(
31 p.UARTE0,
32 p.TIMER0,
33 p.PPI_CH0,
34 p.PPI_CH1,
35 p.PPI_GROUP0,
36 interrupt::take!(UARTE0_UART0),
37 p.P1_03,
38 p.P1_04,
39 config.clone(),
40 &mut rx_buffer,
41 &mut tx_buffer,
42 );
43
44 info!("uarte initialized!");
45
46 // uarte needs some quiet time to start rxing properly.
47 Timer::after(Duration::from_millis(10)).await;
48
49 // Tx spam in a loop.
50 const NSPAM: usize = 17;
51 static mut TX_BUF: [u8; NSPAM] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16];
52 let _spam = Uarte::new(p.UARTE1, interrupt::take!(UARTE1), p.P1_01, p.P1_02, config.clone());
53 let spam_peri: pac::UARTE1 = unsafe { mem::transmute(()) };
54 let event = unsafe { Event::new_unchecked(NonNull::new_unchecked(&spam_peri.events_endtx as *const _ as _)) };
55 let task = unsafe { Task::new_unchecked(NonNull::new_unchecked(&spam_peri.tasks_starttx as *const _ as _)) };
56 let mut spam_ppi = Ppi::new_one_to_one(p.PPI_CH2, event, task);
57 spam_ppi.enable();
58 let p = unsafe { TX_BUF.as_mut_ptr() };
59 spam_peri.txd.ptr.write(|w| unsafe { w.ptr().bits(p as u32) });
60 spam_peri.txd.maxcnt.write(|w| unsafe { w.maxcnt().bits(NSPAM as _) });
61 spam_peri.tasks_starttx.write(|w| unsafe { w.bits(1) });
62
63 let mut i = 0;
64 let mut total = 0;
65 while total < 256 * 1024 {
66 let buf = unwrap!(u.fill_buf().await);
67 //info!("rx {}", buf);
68
69 for &b in buf {
70 assert_eq!(b, unsafe { TX_BUF[i] });
71
72 i = i + 1;
73 if i == NSPAM {
74 i = 0;
75 }
76 }
77
78 // Read bytes have to be explicitly consumed, otherwise fill_buf() will return them again
79 let n = buf.len();
80 u.consume(n);
81 total += n;
82 }
83
84 info!("Test OK");
85 cortex_m::asm::bkpt();
86}