99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![no_std]
 | |
| #![no_main]
 | |
| 
 | |
| use defmt::*;
 | |
| use embassy_executor::Spawner;
 | |
| use embassy_stm32::peripherals::*;
 | |
| use embassy_stm32::{bind_interrupts, can, rcc, Config};
 | |
| use embassy_time::Timer;
 | |
| use {defmt_rtt as _, panic_probe as _};
 | |
| 
 | |
| bind_interrupts!(struct Irqs {
 | |
|     FDCAN1_IT0 => can::IT0InterruptHandler<FDCAN1>;
 | |
|     FDCAN1_IT1 => can::IT1InterruptHandler<FDCAN1>;
 | |
| });
 | |
| 
 | |
| #[embassy_executor::main]
 | |
| async fn main(_spawner: Spawner) {
 | |
|     let mut config = Config::default();
 | |
|     config.rcc.hse = Some(rcc::Hse {
 | |
|         freq: embassy_stm32::time::Hertz(25_000_000),
 | |
|         mode: rcc::HseMode::Oscillator,
 | |
|     });
 | |
|     config.rcc.mux.fdcansel = rcc::mux::Fdcansel::HSE;
 | |
| 
 | |
|     let peripherals = embassy_stm32::init(config);
 | |
| 
 | |
|     let mut can = can::CanConfigurator::new(peripherals.FDCAN1, peripherals.PA11, peripherals.PA12, Irqs);
 | |
| 
 | |
|     // 250k bps
 | |
|     can.set_bitrate(250_000);
 | |
| 
 | |
|     //let mut can = can.into_internal_loopback_mode();
 | |
|     let mut can = can.into_normal_mode();
 | |
| 
 | |
|     info!("CAN Configured");
 | |
| 
 | |
|     let mut i = 0;
 | |
|     let mut last_read_ts = embassy_time::Instant::now();
 | |
| 
 | |
|     loop {
 | |
|         let frame = can::frame::Frame::new_extended(0x123456F, &[i; 8]).unwrap();
 | |
|         info!("Writing frame");
 | |
|         _ = can.write(&frame).await;
 | |
| 
 | |
|         match can.read().await {
 | |
|             Ok(envelope) => {
 | |
|                 let (rx_frame, ts) = envelope.parts();
 | |
|                 let delta = (ts - last_read_ts).as_millis();
 | |
|                 last_read_ts = ts;
 | |
|                 info!(
 | |
|                     "Rx: {:x} {:x} {:x} {:x} --- NEW {}",
 | |
|                     rx_frame.data()[0],
 | |
|                     rx_frame.data()[1],
 | |
|                     rx_frame.data()[2],
 | |
|                     rx_frame.data()[3],
 | |
|                     delta,
 | |
|                 )
 | |
|             }
 | |
|             Err(_err) => error!("Error in frame"),
 | |
|         }
 | |
| 
 | |
|         Timer::after_millis(250).await;
 | |
| 
 | |
|         i += 1;
 | |
|         if i > 3 {
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     let (mut tx, mut rx, _props) = can.split();
 | |
|     // With split
 | |
|     loop {
 | |
|         let frame = can::frame::Frame::new_extended(0x123456F, &[i; 8]).unwrap();
 | |
|         info!("Writing frame");
 | |
|         _ = tx.write(&frame).await;
 | |
| 
 | |
|         match rx.read().await {
 | |
|             Ok(envelope) => {
 | |
|                 let (rx_frame, ts) = envelope.parts();
 | |
|                 let delta = (ts - last_read_ts).as_millis();
 | |
|                 last_read_ts = ts;
 | |
|                 info!(
 | |
|                     "Rx: {:x} {:x} {:x} {:x} --- NEW {}",
 | |
|                     rx_frame.data()[0],
 | |
|                     rx_frame.data()[1],
 | |
|                     rx_frame.data()[2],
 | |
|                     rx_frame.data()[3],
 | |
|                     delta,
 | |
|                 )
 | |
|             }
 | |
|             Err(_err) => error!("Error in frame"),
 | |
|         }
 | |
| 
 | |
|         Timer::after_millis(250).await;
 | |
| 
 | |
|         i = i.wrapping_add(1);
 | |
|     }
 | |
| }
 |