diff options
Diffstat (limited to 'examples')
| -rw-r--r-- | examples/rp/src/bin/uart_r503.rs | 79 |
1 files changed, 49 insertions, 30 deletions
diff --git a/examples/rp/src/bin/uart_r503.rs b/examples/rp/src/bin/uart_r503.rs index f8a9d8a9f..c0676750c 100644 --- a/examples/rp/src/bin/uart_r503.rs +++ b/examples/rp/src/bin/uart_r503.rs | |||
| @@ -1,17 +1,17 @@ | |||
| 1 | #![no_std] | 1 | #![no_std] |
| 2 | #![no_main] | 2 | #![no_main] |
| 3 | 3 | ||
| 4 | use defmt::{debug, info, unwrap}; | 4 | use defmt::info; |
| 5 | use embassy_executor::Spawner; | 5 | use embassy_executor::Spawner; |
| 6 | use embassy_rp::bind_interrupts; | 6 | use embassy_rp::bind_interrupts; |
| 7 | use embassy_rp::peripherals::UART0; | 7 | use embassy_rp::peripherals::UART0; |
| 8 | use embassy_rp::uart::{Async, Config, DataBits, InterruptHandler as UARTInterruptHandler, StopBits, Uart, UartRx}; | 8 | use embassy_rp::uart::{Config, DataBits, InterruptHandler as UARTInterruptHandler, Parity, StopBits, Uart}; |
| 9 | use embassy_time::Timer; | 9 | use embassy_time::Timer; |
| 10 | use heapless::Vec; | 10 | use heapless::Vec; |
| 11 | use {defmt_rtt as _, panic_probe as _}; | 11 | use {defmt_rtt as _, panic_probe as _}; |
| 12 | 12 | ||
| 13 | bind_interrupts!(pub struct Irqs { | 13 | bind_interrupts!(pub struct Irqs { |
| 14 | UART0_IRQ => UARTInterruptHandler<UART0>; // Fingerprint scanner (TX) | 14 | UART0_IRQ => UARTInterruptHandler<UART0>; |
| 15 | }); | 15 | }); |
| 16 | 16 | ||
| 17 | const ADDRESS: u32 = 0xFFFFFFFF; | 17 | const ADDRESS: u32 = 0xFFFFFFFF; |
| @@ -34,24 +34,8 @@ fn compute_checksum(buf: Vec<u8, 32>) -> u16 { | |||
| 34 | return checksum; | 34 | return checksum; |
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | // NOTE: Doesn't work for some reason, it just hangs! | ||
| 38 | #[embassy_executor::task] | ||
| 39 | async fn reader(mut rx: UartRx<'static, UART0, Async>) { | ||
| 40 | loop { | ||
| 41 | let mut buf = [0; 32]; | ||
| 42 | debug!("Attempting read.."); | ||
| 43 | |||
| 44 | //rx.read(&mut buf).await.unwrap(); | ||
| 45 | match rx.read(&mut buf).await { | ||
| 46 | Ok(v) => info!("Read successful: {:?}", v), | ||
| 47 | Err(e) => info!("Read error: {:?}", e), | ||
| 48 | } | ||
| 49 | info!("RX='{:?}'", buf); | ||
| 50 | } | ||
| 51 | } | ||
| 52 | |||
| 53 | #[embassy_executor::main] | 37 | #[embassy_executor::main] |
| 54 | async fn main(spawner: Spawner) { | 38 | async fn main(_spawner: Spawner) { |
| 55 | info!("Start"); | 39 | info!("Start"); |
| 56 | 40 | ||
| 57 | let p = embassy_rp::init(Default::default()); | 41 | let p = embassy_rp::init(Default::default()); |
| @@ -61,16 +45,16 @@ async fn main(spawner: Spawner) { | |||
| 61 | config.baudrate = 57600; | 45 | config.baudrate = 57600; |
| 62 | config.stop_bits = StopBits::STOP1; | 46 | config.stop_bits = StopBits::STOP1; |
| 63 | config.data_bits = DataBits::DataBits8; | 47 | config.data_bits = DataBits::DataBits8; |
| 48 | config.parity = Parity::ParityNone; | ||
| 64 | 49 | ||
| 65 | let (uart, tx_pin, tx_dma, rx_pin, rx_dma) = (p.UART0, p.PIN_16, p.DMA_CH0, p.PIN_17, p.DMA_CH1); | 50 | let (uart, tx_pin, tx_dma, rx_pin, rx_dma) = (p.UART0, p.PIN_16, p.DMA_CH0, p.PIN_17, p.DMA_CH1); |
| 66 | let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config); | 51 | let uart = Uart::new(uart, tx_pin, rx_pin, Irqs, tx_dma, rx_dma, config); |
| 67 | let (mut tx, rx) = uart.split(); | 52 | let (mut tx, mut rx) = uart.split(); |
| 68 | |||
| 69 | unwrap!(spawner.spawn(reader(rx))); | ||
| 70 | Timer::after_secs(1).await; | ||
| 71 | 53 | ||
| 72 | let mut vec_buf: Vec<u8, 32> = heapless::Vec::new(); | 54 | let mut vec_buf: Vec<u8, 32> = heapless::Vec::new(); |
| 73 | { | 55 | |
| 56 | // Cycle through the three colours Red, Blue and Purple. | ||
| 57 | for colour in 1..=3 { | ||
| 74 | // Clear buffers | 58 | // Clear buffers |
| 75 | vec_buf.clear(); | 59 | vec_buf.clear(); |
| 76 | 60 | ||
| @@ -93,7 +77,7 @@ async fn main(spawner: Spawner) { | |||
| 93 | // DATA | 77 | // DATA |
| 94 | let _ = vec_buf.push(0x01); // ctrl=Breathing light | 78 | let _ = vec_buf.push(0x01); // ctrl=Breathing light |
| 95 | let _ = vec_buf.push(0x50); // speed=80 | 79 | let _ = vec_buf.push(0x50); // speed=80 |
| 96 | let _ = vec_buf.push(0x02); // colour=Blue | 80 | let _ = vec_buf.push(colour as u8); // colour=Red, Blue, Purple |
| 97 | let _ = vec_buf.push(0x00); // times=Infinite | 81 | let _ = vec_buf.push(0x00); // times=Infinite |
| 98 | 82 | ||
| 99 | // SUM | 83 | // SUM |
| @@ -103,11 +87,46 @@ async fn main(spawner: Spawner) { | |||
| 103 | // ===== | 87 | // ===== |
| 104 | 88 | ||
| 105 | // Send command buffer. | 89 | // Send command buffer. |
| 106 | let data: [u8; 16] = vec_buf.clone().into_array().unwrap(); | 90 | let data_write: [u8; 16] = vec_buf.clone().into_array().unwrap(); |
| 107 | debug!("data='{:?}'", data); | 91 | info!("write ({})='{:?}'", colour, data_write); |
| 108 | match tx.write(&data).await { | 92 | match tx.write(&data_write).await { |
| 109 | Ok(..) => info!("Write successful"), | 93 | Ok(..) => info!("Write successful."), |
| 110 | Err(e) => info!("Write error: {:?}", e), | 94 | Err(e) => info!("Write error: {:?}", e), |
| 111 | } | 95 | } |
| 96 | |||
| 97 | // ===== | ||
| 98 | |||
| 99 | // Read command buffer. | ||
| 100 | let mut read_buf: [u8; 1] = [0; 1]; // Can only read one byte at a time! | ||
| 101 | let mut data_read: Vec<u8, 32> = heapless::Vec::new(); // Return buffer. | ||
| 102 | let mut cnt: u8 = 0; // Keep track of how many packages we've received. | ||
| 103 | |||
| 104 | info!("Attempting read."); | ||
| 105 | loop { | ||
| 106 | match rx.read(&mut read_buf).await { | ||
| 107 | Ok(..) => (), | ||
| 108 | Err(e) => info!(" Read error: {:?}", e), | ||
| 109 | } | ||
| 110 | |||
| 111 | match cnt { | ||
| 112 | _ => data_read.push(read_buf[0]).unwrap(), | ||
| 113 | } | ||
| 114 | |||
| 115 | if cnt > 10 { | ||
| 116 | info!("read ({})='{:?}'", colour, data_read[..]); | ||
| 117 | break; | ||
| 118 | } | ||
| 119 | |||
| 120 | cnt = cnt + 1; | ||
| 121 | } | ||
| 122 | |||
| 123 | // ===== | ||
| 124 | |||
| 125 | if colour != 3 { | ||
| 126 | Timer::after_secs(2).await; | ||
| 127 | info!("Changing colour."); | ||
| 128 | } | ||
| 112 | } | 129 | } |
| 130 | |||
| 131 | info!("All done.."); | ||
| 113 | } | 132 | } |
