Commit 83c516cc authored by 仰若水's avatar 仰若水
Browse files

Added basic API.

parent f4097c17
Showing with 193 additions and 29 deletions
+193 -29
/*
* 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));
}
......@@ -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_ */
......@@ -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 spiReceive(uint8_t *pData, uint16_t size) {
return spiTransmitReceiveIndependentData(spiEmptyData, pData, size);
Status spiTransmit(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 */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment