#![no_std]
#![no_main]
use cortex_m_rt::entry;
use defmt_rtt as _;
use embedded_hal::spi::MODE_0;
use panic_halt as _;
use gd32e2_hal::pac;
use gd32e2_hal::prelude::*;
use gd32e2_hal::rcu::{ClockConfig, PllFreq, SysClk};
use gd32e2_hal::spi::{BitOrder, Spi, SpiConfig, SpiPsc};
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut fmc = dp.fmc.constrain();
let config = ClockConfig::default().sysclk(SysClk::Pll(PllFreq::Mhz48));
let mut rcu = dp.rcu.constrain().freeze(&mut fmc, config);
let gpioa = dp.gpioa.split(&mut rcu);
let sck = gpioa.pa5.into_alternate::<0>();
let miso = gpioa.pa6.into_alternate::<0>();
let mosi = gpioa.pa7.into_alternate::<0>();
let config = SpiConfig::new(SpiPsc::Div16)
.mode(MODE_0)
.bit_order(BitOrder::MsbFirst);
let mut spi = Spi::new(&mut rcu, dp.spi0, sck, miso, mosi, config);
defmt::info!("SPI0 loopback test (wire PA7 -> PA6)");
for byte in [0x00u8, 0x42, 0xA5, 0xFF] {
match spi.transfer_byte(byte) {
Ok(got) if got == byte => {
defmt::info!("transfer_byte {=u8:#04x} -> {=u8:#04x} ok", byte, got);
}
Ok(got) => {
defmt::warn!("transfer_byte {=u8:#04x} -> {=u8:#04x} MISMATCH", byte, got);
}
Err(e) => {
defmt::error!("transfer_byte {=u8:#04x} error {}", byte, e);
}
}
}
let mut buf = [0x11u8, 0x22, 0x33, 0x44];
match spi.transfer_in_place(&mut buf) {
Ok(()) => {
defmt::info!("SpiBus transfer_in_place -> {=[u8]:#04x}", buf);
}
Err(e) => {
defmt::error!("SpiBus error {}", e);
}
}
defmt::info!("done");
loop {
cortex_m::asm::wfi();
}
}