Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
仰若水
YADXL313
Commits
83c516cc
Commit
83c516cc
authored
4 years ago
by
仰若水
Browse files
Options
Download
Email Patches
Plain Diff
Added basic API.
parent
f4097c17
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
y_adxl313.cpp
+98
-0
y_adxl313.cpp
y_adxl313.h
+43
-29
y_adxl313.h
y_adxl313_esp32.cpp
+52
-0
y_adxl313_esp32.cpp
with
193 additions
and
29 deletions
+193
-29
y_adxl313.cpp
0 → 100644
View file @
83c516cc
/*
* y_adxl313.cpp
*
* Created on: 2020年10月3日
* Author: yrs22
*/
#include "y_adxl313.h"
using
namespace
YADXL313
;
const
static
uint8_t
Write
=
0
<<
7
;
const
static
uint8_t
Read
=
1
<<
7
;
const
static
uint8_t
MultiBytes
=
1
<<
6
;
enum
Register
{
DEVID_0
,
DEVID_1
,
PARTID
,
REVID
,
XID
,
SOFT_RESET
=
0x18
,
BW_RATE
=
0x2C
,
POWER_CTL
,
DATA_FORMAT
=
0x31
,
DATA_X0
,
DATA_X1
,
DATA_Y0
,
DATA_Y1
,
DATA_Z0
,
DATA_Z1
,
FIFO_CTL
};
enum
PowerControlBits
{
I2CDisable
=
1
<<
6
};
enum
DataFormatBits
{
SPIHalfDuplex
=
1
<<
6
,
FullResolution
=
1
<<
3
};
enum
Range
{
Range_0_5g
,
Range_1g
,
Range_2g
,
Range_4g
,
};
Status
YADXL313
::
reset
()
{
uint8_t
tx
[]
=
{
Write
|
SOFT_RESET
,
ResetValue
};
return
spiTransmit
(
tx
,
sizeof
(
tx
));
}
Status
YADXL313
::
init
()
{
auto
res
=
reset
();
if
(
res
!=
OK
)
return
res
;
uint8_t
tx
[]
=
{
Write
|
MultiBytes
|
BW_RATE
,
SampleRate_800
,
I2CDisable
};
if
((
res
=
spiTransmit
(
tx
,
sizeof
(
tx
)))
!=
OK
)
{
return
res
;
}
tx
[
0
]
=
Write
|
DATA_FORMAT
;
tx
[
1
]
=
FullResolution
|
Range_4g
;
return
spiTransmit
(
tx
,
2
);
}
Status
YADXL313
::
getID
(
uint16_t
*
id
,
uint8_t
*
partID
,
uint8_t
*
revID
,
uint8_t
*
xID
)
{
uint8_t
tx
[
6
]
=
{
Read
|
MultiBytes
|
DEVID_0
};
auto
res
=
spiTransmitReceive
(
tx
,
sizeof
(
tx
));
if
(
res
!=
OK
)
return
res
;
*
id
=
tx
[
1
]
<<
8
|
tx
[
2
];
*
partID
=
tx
[
3
];
*
revID
=
tx
[
4
];
*
xID
=
tx
[
5
];
return
OK
;
}
Status
YADXL313
::
setLowPowerSampleAndSampleRate
(
LowPowerSample
lowPower
,
SampleRate
sampleRate
)
{
uint8_t
tx
[]
=
{
Write
|
BW_RATE
,
static_cast
<
uint8_t
>
(
lowPower
|
sampleRate
)
};
return
spiTransmit
(
tx
,
sizeof
(
tx
));
}
Status
YADXL313
::
readData
(
uint8_t
*
data
)
{
uint8_t
tx
[
7
]
=
{
Read
|
MultiBytes
|
DATA_X0
};
return
spiTransmitReceiveIndependentData
(
tx
,
data
,
sizeof
(
tx
));
}
Status
YADXL313
::
setPowerMode
(
PowerMode
mode
)
{
uint8_t
tx
[]
=
{
Write
|
POWER_CTL
,
static_cast
<
uint8_t
>
(
I2CDisable
|
mode
)
};
return
spiTransmit
(
tx
,
sizeof
(
tx
));
}
This diff is collapsed.
Click to expand it.
y_adxl313.h
View file @
83c516cc
...
...
@@ -15,40 +15,54 @@ enum Status {
OK
,
Error
,
Busy
,
Timeout
};
const
static
uint8_t
Write
=
0
<<
7
;
const
static
uint8_t
Read
=
1
<<
7
;
const
static
uint8_t
MultiBytes
=
1
<<
6
;
enum
PowerMode
{
Standby
,
Measure
=
1
<<
3
};
enum
Register
{
DevID0
enum
LowPowerSample
{
LowPowerOff
,
LowPowerOn
=
1
<<
4
};
static
inline
void
delay
(
uint32_t
ms
);
static
inline
Status
spiTransmit
(
uint8_t
*
pData
,
uint16_t
size
);
// This function must just has MISO phase, otherwise random data will make exception.
static
inline
Status
spiReceive
(
uint8_t
*
pData
,
uint16_t
size
);
static
inline
Status
spiReceiveAsync
(
uint8_t
*
pData
,
uint16_t
size
);
static
inline
Status
spiTransmitReceiveIndependentData
(
uint8_t
*
pTxData
,
uint8_t
*
pRxData
,
uint16_t
size
);
static
inline
Status
spiTransmitReceive
(
uint8_t
*
pData
,
uint16_t
size
);
Status
getID
(
uint16_t
*
id
,
uint8_t
*
partID
,
uint8_t
*
revID
,
uint8_t
*
xID
)
{
uint8_t
tx
[
6
]
=
{
Read
|
MultiBytes
|
DevID0
};
uint8_t
rx
[
6
];
auto
res
=
spiTransmitReceiveIndependentData
(
tx
,
rx
,
6
);
if
(
res
!=
OK
)
return
res
;
*
id
=
rx
[
1
]
<<
8
|
rx
[
2
];
*
partID
=
rx
[
3
];
*
revID
=
rx
[
4
];
*
xID
=
rx
[
5
];
return
OK
;
}
enum
SampleRate
{
SampleRate_6_25
=
0b110
,
SampleRate_12_5
,
SampleRate_25
,
SampleRate_50
,
SampleRate_100
,
SampleRate_200
,
SampleRate_400
,
SampleRate_800
,
SampleRate_1600
,
SampleRate_3200
};
const
static
uint8_t
ResetValue
=
0x52
;
void
delay
(
uint32_t
ms
);
Status
spiTransmit
(
uint8_t
*
pData
,
uint16_t
size
);
Status
spiReceiveAsync
(
uint8_t
*
pData
,
uint16_t
size
);
Status
spiTransmitReceiveIndependentData
(
uint8_t
*
pTxData
,
uint8_t
*
pRxData
,
uint8_t
size
);
Status
spiTransmitReceive
(
uint8_t
*
pData
,
uint16_t
size
);
Status
reset
();
Status
init
();
Status
getID
(
uint16_t
*
id
,
uint8_t
*
partID
,
uint8_t
*
revID
,
uint8_t
*
xID
);
Status
setLowPowerSampleAndSampleRate
(
LowPowerSample
lowPower
,
SampleRate
sampleRate
);
Status
setPowerMode
(
PowerMode
mode
);
Status
readData
(
uint8_t
*
data
);
static
constexpr
uint8_t
receiveSize
()
{
return
6
;
}
}
#endif
/* MAIN_DRIVERS_YADXL313_Y_ADXL313_H_ */
This diff is collapsed.
Click to expand it.
y_adxl313_esp32.
h
pp
→
y_adxl313_esp32.
c
pp
View file @
83c516cc
...
...
@@ -5,9 +5,6 @@
* Author: yrs
*/
#ifndef __YADXL362_ESP32_HPP
#define __YADXL362_ESP32_HPP
#include "y_adxl313.h"
#include "driver/spi_master.h"
...
...
@@ -18,12 +15,13 @@
extern
spi_device_handle_t
spiAccelerometer
;
namespace
YADXL313
{
static
inline
void
delay
(
uint32_t
ms
)
{
void
delay
(
uint32_t
ms
)
{
vTaskDelay
(
pdMS_TO_TICKS
(
ms
));
}
static
inline
Status
spiTransmitReceiveIndependentData
(
uint8_t
*
pTxData
,
uint8_t
*
pRxData
,
uint16_t
size
)
{
// Can not use independent sizes, error: rx length > tx length in full duplex mode
Status
spiTransmitReceiveIndependentData
(
uint8_t
*
pTxData
,
uint8_t
*
pRxData
,
uint8_t
size
)
{
spi_transaction_t
t
;
t
.
flags
=
0
;
t
.
cmd
=
0
;
...
...
@@ -34,26 +32,21 @@ static inline Status spiTransmitReceiveIndependentData(
t
.
tx_buffer
=
pTxData
;
//Command is 8 bits
t
.
rx_buffer
=
pRxData
;
//The data is the cmd itself
return
Status
(
spi_device_transmit
(
spiADS1299
,
&
t
));
}
static
inline
Status
spiTransmit
(
uint8_t
*
pData
,
uint16_t
size
)
{
return
spiTransmitReceiveIndependentData
(
pData
,
NULL
,
size
);
return
Status
(
spi_device_transmit
(
spiAccelerometer
,
&
t
));
}
static
inline
Status
spi
Receive
(
uint8_t
*
pData
,
uint16_t
size
)
{
return
spiTransmitReceiveIndependentData
(
spiEmptyData
,
pData
,
size
);
Status
spi
Transmit
(
uint8_t
*
pData
,
uint16_t
size
)
{
return
spiTransmitReceiveIndependentData
(
pData
,
nullptr
,
size
);
}
static
inline
Status
spiTransmitReceive
(
uint8_t
*
pData
,
Status
spiTransmitReceive
(
uint8_t
*
pData
,
uint16_t
size
)
{
return
spiTransmitReceiveIndependentData
(
pData
,
pData
,
size
);
}
static
inline
Status
spiReceiveAsync
(
uint8_t
*
pData
,
uint16_t
size
)
{
Status
spiReceiveAsync
(
uint8_t
*
pData
,
uint16_t
size
)
{
return
OK
;
}
}
#endif
/* __YADXL362_ESP32_HPP */
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment
Menu
Projects
Groups
Snippets
Help