Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
E
e7020e_2021
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Roger Le Fort Ndayambaje
e7020e_2021
Commits
ad60460a
Commit
ad60460a
authored
4 years ago
by
Per Lindgren
Browse files
Options
Downloads
Patches
Plain Diff
pmw3389 wip, got data
parent
51c0eb90
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
examples/pmw3389.rs
+60
-60
60 additions, 60 deletions
examples/pmw3389.rs
with
60 additions
and
60 deletions
examples/pmw3389.rs
+
60
−
60
View file @
ad60460a
...
...
@@ -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
(
2
000
)
.into
(),
stm32f4xx_hal
::
time
::
KiloHertz
(
1
000
)
.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_
m
s
(
35
);
// waits for tSRAD
self
.delay
.delay_
u
s
(
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
,
0x
0
0
)
?
;
self
.write_register
(
Register
::
Config2
,
0x
2
0
)
?
;
// // 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
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment