#![no_main] #![no_std] use panic_semihosting as _; use stm32h7xx_hal::hal::digital::v2::{ InputPin, OutputPin, }; use stm32h7xx_hal::{pac, prelude::*, spi}; use cortex_m; use cortex_m::asm::nop; use cortex_m_rt::entry; use cortex_m_semihosting::hprintln; use core::ptr; use nb::block; use firmware; use firmware::{ CPLD, attenuator::Attenuator, config_register::{ ConfigRegister, CFGMask, }, dds::DDS, }; #[entry] fn main() -> ! { let cp = cortex_m::Peripherals::take().unwrap(); let dp = pac::Peripherals::take().unwrap(); let pwr = dp.PWR.constrain(); let vos = pwr.freeze(); let rcc = dp.RCC.constrain(); let ccdr = rcc .sys_ck(400.mhz()) .pll1_q_ck(48.mhz()) .freeze(vos, &dp.SYSCFG); let mut delay = cp.SYST.delay(ccdr.clocks); let gpioa = dp.GPIOA.split(ccdr.peripheral.GPIOA); let gpiob = dp.GPIOB.split(ccdr.peripheral.GPIOB); let gpioc = dp.GPIOC.split(ccdr.peripheral.GPIOC); let gpiod = dp.GPIOD.split(ccdr.peripheral.GPIOD); let gpioe = dp.GPIOE.split(ccdr.peripheral.GPIOE); let gpiof = dp.GPIOF.split(ccdr.peripheral.GPIOF); // Setup CDONE for checking let fpga_cdone = gpiod.pd15.into_pull_up_input(); match fpga_cdone.is_high() { Ok(true) => hprintln!("FPGA is ready."), Ok(_) => hprintln!("FPGA is in reset state."), Err(_) => hprintln!("Error: Cannot read C_DONE"), }.unwrap(); /* * Using SPI1, AF5 * SCLK -> PA5 * MOSI -> PB5 * MISO -> PA6 * CS -> 0: PB12, 1: PA15, 2: PC7 */ let sclk = gpioa.pa5.into_alternate_af5(); let mosi = gpiob.pb5.into_alternate_af5(); let miso = gpioa.pa6.into_alternate_af5(); // let mut sclk = gpioa.pa5.into_push_pull_output(); // let mut mosi = gpiob.pb5.into_push_pull_output(); // let mut miso = gpioa.pa6.into_pull_up_input(); let (mut cs0, mut cs1, mut cs2) = ( gpiob.pb12.into_push_pull_output(), gpioa.pa15.into_push_pull_output(), gpioc.pc7.into_push_pull_output(), ); let mut spi = dp.SPI1.spi( (sclk, miso, mosi), spi::MODE_0, 3.mhz(), ccdr.peripheral.SPI1, &ccdr.clocks, ); // debug led let mut yellow = gpioe.pe1.into_push_pull_output(); yellow.set_high().unwrap(); let mut switch = CPLD::new(spi, (cs0, cs1, cs2)); let parts = switch.split(); let mut config = ConfigRegister::new(parts.spi1); let mut att = Attenuator::new(parts.spi2); loop { // let mut counter = config.get_configuration(CFGMask::RF_SW); // hprintln!("{}", counter); // config.set_configurations(&mut [ // (CFGMask::RF_SW, ((counter + 1)%16) as u32) // ]).unwrap(); hprintln!("{:?}", att.set_attenuation([33.0, -1.0, 24.0, 12.0]).unwrap()).unwrap(); hprintln!("{:?}", att.set_attenuation([0.0, 0.0, 0.0, 0.0]).unwrap()).unwrap(); } /* cs0.set_low().unwrap(); cs1.set_low().unwrap(); cs2.set_low().unwrap(); let mut arr: [u8; 4] = [0x12, 0x34, 0x56, 0x78]; loop { arr[0] = 0x12; arr[1] = 0x34; arr[2] = 0x56; arr[3] = 0x78; cs1.set_high().unwrap(); hprintln!("{:?}", spi.transfer(&mut arr).unwrap()).unwrap(); cs1.set_low().unwrap(); } */ }