diff --git a/examples/pmw3389.rs b/examples/pmw3389.rs index 6f9c3a191c6b0736ef614a0de697192ac62d4040..9c57444720276c0be59576e85e0b5d7121bf9a19 100644 --- a/examples/pmw3389.rs +++ b/examples/pmw3389.rs @@ -61,14 +61,14 @@ const APP: () = { let sck = gpiob.pb10.into_alternate_af5(); let miso = gpioc.pc2.into_alternate_af5(); let mosi = gpioc.pc3.into_alternate_af5(); - // let cs = gpiob.pb4.into_push_pull_output().set_speed(Speed::High); - let cs = gpiob.pb4.into_push_pull_output(); + let cs = gpiob.pb4.into_push_pull_output().set_speed(Speed::High); + // let cs = gpiob.pb4.into_push_pull_output(); let spi = Spi::spi2( device.SPI2, (sck, miso, mosi), MODE_3, - stm32f4xx_hal::time::KiloHertz(2000).into(), + stm32f4xx_hal::time::KiloHertz(1000).into(), clocks, ); @@ -291,6 +291,13 @@ mod pmw3389 { iprintln!(&mut itm.stim[0], "pmw3389 - new"); + // ensure SPI is reset + pmw3389.com_end(); + pmw3389.delay.delay_us(40); + pmw3389.com_begin(); + pmw3389.delay.delay_us(40); + pmw3389.com_end(); + // read product id let id = pmw3389.product_id()?; iprintln!(&mut itm.stim[0], "product_id 0x{:x}", id); @@ -300,11 +307,6 @@ mod pmw3389 { iprintln!(&mut itm.stim[0], "reset"); - // ensure SPI is reset - pmw3389.com_end(); - pmw3389.com_begin(); - pmw3389.com_end(); - // shutdown // adns_write_reg(Shutdown, 0xb6); // Shutdown first @@ -315,12 +317,12 @@ mod pmw3389 { // adns_com_end(); // delayMicroseconds(40); - pmw3389.write_register(Register::Shutdown, 0xb6)?; - pmw3389.delay.delay_ms(300); - pmw3389.com_begin(); - pmw3389.delay.delay_us(40); - pmw3389.com_end(); - pmw3389.delay.delay_us(40); + // pmw3389.write_register(Register::Shutdown, 0xb6)?; + // pmw3389.delay.delay_ms(300); + // pmw3389.com_begin(); + // pmw3389.delay.delay_us(40); + // pmw3389.com_end(); + // pmw3389.delay.delay_us(40); // force reset pmw3389.write_register(Register::PowerUpReset, 0x5a)?; @@ -343,7 +345,8 @@ mod pmw3389 { pmw3389.read_register(Register::DeltaYH)?; pmw3389.upload_firmware(itm)?; - pmw3389.delay.delay_ms(10); + + pmw3389.delay.delay_ms(1000); iprintln!(&mut itm.stim[0], "Optical Chip Initialized"); @@ -354,14 +357,40 @@ mod pmw3389 { let srom_id = pmw3389.read_register(Register::SROMId)?; iprintln!(&mut itm.stim[0], "srom_id {}, 0x{:x}", srom_id, srom_id); - pmw3389.delay.delay_ms(1000); - loop { - pmw3389.read_status(itm)?; - pmw3389.delay.delay_ms(1000); + pmw3389.write_register(Register::Motion, 0x01)?; + + let motion = pmw3389.read_register(Register::Motion)?; + let xl = pmw3389.read_register(Register::DeltaXL)?; + let xh = pmw3389.read_register(Register::DeltaXH)?; + let yl = pmw3389.read_register(Register::DeltaYL)?; + let yh = pmw3389.read_register(Register::DeltaYH)?; + + let x = (xl as u16 + (xh as u16) << 8) as i16; + let y = (yl as u16 + (yh as u16) << 8) as i16; + + let surface = motion & 0x08; + let motion_detect = motion & 0x80; + + iprintln!( + &mut itm.stim[0], + "motion {}, surface {}, (x, y) {:?}", + motion_detect, + surface, + (x, y), + ); + pmw3389.delay.delay_ms(200); } - Ok(pmw3389) + // self.spi.transfer(&mut [Register::MotionBurst.addr()])?; + // self.delay.delay_ms(35); // waits for tSRAD + + // loop { + // pmw3389.read_status(itm)?; + // pmw3389.delay.delay_ms(10); + // } + + // Ok(pmw3389) } pub fn read_register(&mut self, reg: Register) -> Result<u8, E> { @@ -372,6 +401,7 @@ mod pmw3389 { // tSRAD self.delay.delay_us(100); + self.delay.delay_us(120); let mut buffer = [0]; self.spi.transfer(&mut buffer)?; @@ -383,6 +413,7 @@ mod pmw3389 { // tSRW/tSRR (=20us) minus tSCLK-NCS self.delay.delay_us(19); + self.delay.delay_us(120); Ok(buffer[0]) } @@ -419,7 +450,7 @@ mod pmw3389 { self.com_begin(); self.spi.transfer(&mut [Register::MotionBurst.addr()])?; - self.delay.delay_ms(35); // waits for tSRAD + self.delay.delay_us(35); // waits for tSRAD // read burst buffer let mut buf = [0u8; 12]; @@ -534,10 +565,9 @@ mod pmw3389 { } // // Per: added this, seems adequate - // self.delay.delay_us(105); + self.delay.delay_us(105); - // // let _ = self.cs.set_high(); - // self.com_end(); + self.com_end(); //Read the SROM_ID register to verify the ID before any other register reads or writes. // adns_read_reg(SROM_ID); @@ -547,50 +577,20 @@ mod pmw3389 { // //Write 0x00 to Config2 register for wired mouse or 0x20 for wireless mouse design. // // adns_write_reg(Config2, 0x00); - self.write_register(Register::Config2, 0x00)?; + self.write_register(Register::Config2, 0x20)?; // // set initial CPI resolution // // adns_write_reg(Config1, 0x15); - self.write_register(Register::ResolutionL, 0)?; - self.write_register(Register::ResolutionH, 0x15)?; + // self.write_register(Register::ResolutionL, 0x15)?; + self.write_register(Register::ResolutionL, 0x5)?; + // self.write_register(Register::ResolutionH, 0x15)?; + self.write_register(Register::ResolutionH, 0x00)?; - // adns_com_end(); + // adns_com_end(); // why the CS is already high self.com_end(); Ok(()) } - - // /// Read multiple bytes starting from the `start_reg` register. - // /// This function will attempt to fill the provided buffer. - // fn read_many(&mut self, start_reg: Register, buffer: &mut [u8]) -> Result<(), E> { - // let _ = self.cs.set_low(); - // buffer[0] = start_reg.addr() | MULTI | READ; - // self.spi.transfer(buffer)?; - // let _ = self.cs.set_high(); - - // Ok(()) - // } - - // /// Change configuration in register - // /// - // /// Helper function to update a particular part of a register without - // /// affecting other parts of the register that might contain desired - // /// configuration. This allows the `L3gd20` struct to be used like - // /// a builder interface when configuring specific parameters. - // fn change_config<B: BitValue>(&mut self, reg: Register, bits: B) -> Result<&mut Self, E> { - // // Create bit mask from width and shift of value - // let mask = B::mask() << B::shift(); - // // Extract the value as u8 - // let bits = (bits.value() << B::shift()) & mask; - // // Read current value of register - // let current = self.read_register(reg)?; - // // Use supplied mask so we don't affect more than necessary - // let masked = current & !mask; - // // Use `or` to apply the new value without affecting other parts - // let new_reg = masked | bits; - // self.write_register(reg, new_reg)?; - // Ok(self) - // } } // const unsigned char firmware_data[] PROGMEM