SCL3300 sensor 3-axis inclinometer with angle output and digital SPI interface

Committer:
metronix
Date:
Mon Sep 05 15:56:44 2022 +0000
Revision:
1:52b1117c65ea
Parent:
0:e8ba98a758d0
modified scl3300 Library test program

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sameera0824 0:e8ba98a758d0 1 /******************************************************************************
sameera0824 0:e8ba98a758d0 2 SCL3300.h
sameera0824 0:e8ba98a758d0 3 SCL3300 Arduino Library Header File
sameera0824 0:e8ba98a758d0 4 David Armstrong
sameera0824 0:e8ba98a758d0 5 Version 3.2.0 - September 3, 2021
sameera0824 0:e8ba98a758d0 6 https://github.com/DavidArmstrong/SCL3300
sameera0824 0:e8ba98a758d0 7
sameera0824 0:e8ba98a758d0 8 Resources:
sameera0824 0:e8ba98a758d0 9 Uses SPI.h for SPI operation
sameera0824 0:e8ba98a758d0 10 This code is released under the [MIT License](http://opensource.org/licenses/MIT).
sameera0824 0:e8ba98a758d0 11 Please review the LICENSE.md file included with this example.
sameera0824 0:e8ba98a758d0 12 Distributed as-is; no warranty is given.
sameera0824 0:e8ba98a758d0 13
sameera0824 0:e8ba98a758d0 14 This file prototypes the SCL3300 class, as implemented in SCL3300.cpp
sameera0824 0:e8ba98a758d0 15
sameera0824 0:e8ba98a758d0 16 ******************************************************************************/
sameera0824 0:e8ba98a758d0 17
sameera0824 0:e8ba98a758d0 18 // ensure this library description is only included once
sameera0824 0:e8ba98a758d0 19 #ifndef __SCL3300_h
sameera0824 0:e8ba98a758d0 20 #define __SCL3300_h
sameera0824 0:e8ba98a758d0 21
sameera0824 0:e8ba98a758d0 22 // Uncomment the following line for debugging output
sameera0824 0:e8ba98a758d0 23 //#define debug_scl3300
sameera0824 0:e8ba98a758d0 24
metronix 1:52b1117c65ea 25 #include "mbed.h"// SPI library is used for...SPI.
sameera0824 0:e8ba98a758d0 26
sameera0824 0:e8ba98a758d0 27 //Define allowed commands to SCL3300 inclinometer
sameera0824 0:e8ba98a758d0 28 #define RdAccX 0x040000f7
sameera0824 0:e8ba98a758d0 29 #define RdAccY 0x080000fd
sameera0824 0:e8ba98a758d0 30 #define RdAccZ 0x0c0000fb
sameera0824 0:e8ba98a758d0 31 #define RdSTO 0x100000e9
sameera0824 0:e8ba98a758d0 32 #define EnaAngOut 0xb0001f6f
sameera0824 0:e8ba98a758d0 33 #define RdAngX 0x240000c7
sameera0824 0:e8ba98a758d0 34 #define RdAngY 0x280000cd
sameera0824 0:e8ba98a758d0 35 #define RdAngZ 0x2c0000cb
sameera0824 0:e8ba98a758d0 36 #define RdTemp 0x140000ef
sameera0824 0:e8ba98a758d0 37 #define RdStatSum 0x180000e5
sameera0824 0:e8ba98a758d0 38 #define RdErrFlg1 0x1c0000e3
sameera0824 0:e8ba98a758d0 39 #define RdErrFlg2 0x200000c1
sameera0824 0:e8ba98a758d0 40 #define RdCMD 0x340000df
sameera0824 0:e8ba98a758d0 41 #define ChgMode1 0xb400001f
sameera0824 0:e8ba98a758d0 42 #define ChgMode2 0xb4000102
sameera0824 0:e8ba98a758d0 43 #define ChgMode3 0xb4000225
sameera0824 0:e8ba98a758d0 44 #define ChgMode4 0xb4000338
sameera0824 0:e8ba98a758d0 45 #define SetPwrDwn 0xb400046b
sameera0824 0:e8ba98a758d0 46 #define WakeUp 0xb400001f
sameera0824 0:e8ba98a758d0 47 #define SWreset 0xb4002098
sameera0824 0:e8ba98a758d0 48 #define RdWHOAMI 0x40000091
sameera0824 0:e8ba98a758d0 49 #define RdSer1 0x640000a7
sameera0824 0:e8ba98a758d0 50 #define RdSer2 0x680000AD
sameera0824 0:e8ba98a758d0 51 #define RdCurBank 0x7c0000b3
sameera0824 0:e8ba98a758d0 52 #define SwtchBnk0 0xfc000073
sameera0824 0:e8ba98a758d0 53 #define SwtchBnk1 0xfc00016e
sameera0824 0:e8ba98a758d0 54
sameera0824 0:e8ba98a758d0 55 // Structure to hold raw sensor data
sameera0824 0:e8ba98a758d0 56 // We need to populate all this every time we read a set of data
sameera0824 0:e8ba98a758d0 57 struct SCL3300data {
sameera0824 0:e8ba98a758d0 58 public:
sameera0824 0:e8ba98a758d0 59 int16_t AccX;
sameera0824 0:e8ba98a758d0 60 int16_t AccY;
sameera0824 0:e8ba98a758d0 61 int16_t AccZ;
sameera0824 0:e8ba98a758d0 62 int16_t STO;
sameera0824 0:e8ba98a758d0 63 int16_t TEMP;
sameera0824 0:e8ba98a758d0 64 int16_t AngX;
sameera0824 0:e8ba98a758d0 65 int16_t AngY;
sameera0824 0:e8ba98a758d0 66 int16_t AngZ;
sameera0824 0:e8ba98a758d0 67 uint16_t StatusSum;
sameera0824 0:e8ba98a758d0 68 uint16_t WHOAMI;
sameera0824 0:e8ba98a758d0 69 };
sameera0824 0:e8ba98a758d0 70
sameera0824 0:e8ba98a758d0 71 // SCL3300 library interface description
sameera0824 0:e8ba98a758d0 72 class SCL3300 {
sameera0824 0:e8ba98a758d0 73 // user-accessible "public" interface
sameera0824 0:e8ba98a758d0 74 public:
metronix 1:52b1117c65ea 75 SCL3300 (PinName mosi, PinName miso, PinName sclk, PinName scl3300_csPin);//constructer
sameera0824 0:e8ba98a758d0 76
sameera0824 0:e8ba98a758d0 77 SCL3300data sclData;
metronix 1:52b1117c65ea 78 bool setMode(int mode);
metronix 1:52b1117c65ea 79 bool begin(void);
sameera0824 0:e8ba98a758d0 80 //Functions to retrieve sensor data
metronix 1:52b1117c65ea 81 bool isConnected();
metronix 1:52b1117c65ea 82 bool available(void);
sameera0824 0:e8ba98a758d0 83 void setFastReadMode();
sameera0824 0:e8ba98a758d0 84 void stopFastReadMode();
sameera0824 0:e8ba98a758d0 85 double getCalculatedAngleX(void);
sameera0824 0:e8ba98a758d0 86 double getCalculatedAngleY(void);
sameera0824 0:e8ba98a758d0 87 double getCalculatedAngleZ(void);
sameera0824 0:e8ba98a758d0 88 double getTiltLevelOffsetAngleX(void);
sameera0824 0:e8ba98a758d0 89 double getTiltLevelOffsetAngleY(void);
sameera0824 0:e8ba98a758d0 90 double getTiltLevelOffsetAngleZ(void);
sameera0824 0:e8ba98a758d0 91 double getCalculatedAccelerometerX(void);
sameera0824 0:e8ba98a758d0 92 double getCalculatedAccelerometerY(void);
sameera0824 0:e8ba98a758d0 93 double getCalculatedAccelerometerZ(void);
sameera0824 0:e8ba98a758d0 94 uint16_t getErrFlag1(void);
sameera0824 0:e8ba98a758d0 95 uint16_t getErrFlag2(void);
sameera0824 0:e8ba98a758d0 96 unsigned long getSerialNumber(void);
sameera0824 0:e8ba98a758d0 97 double getCalculatedTemperatureCelsius(void);
sameera0824 0:e8ba98a758d0 98 double getCalculatedTemperatureFarenheit(void);
sameera0824 0:e8ba98a758d0 99 double angle(int16_t SCL3300_ANG); //two's complement value expected
sameera0824 0:e8ba98a758d0 100 double acceleration(int16_t SCL3300_ACC);
sameera0824 0:e8ba98a758d0 101 bool crcerr, statuserr;
sameera0824 0:e8ba98a758d0 102 uint16_t powerDownMode(void);
sameera0824 0:e8ba98a758d0 103 uint16_t WakeMeUp(void);
sameera0824 0:e8ba98a758d0 104 uint16_t reset(void);
sameera0824 0:e8ba98a758d0 105
sameera0824 0:e8ba98a758d0 106 // library-accessible "private" interface
sameera0824 0:e8ba98a758d0 107 private:
metronix 1:52b1117c65ea 108 SPI _spi;
metronix 1:52b1117c65ea 109 Timer timer1;
metronix 1:52b1117c65ea 110 Timer timer2;
metronix 1:52b1117c65ea 111 DigitalOut _scl3300_csPin; // SPI chip select pin
metronix 1:52b1117c65ea 112 uint8_t scl3300_mode ; // no Default mode
sameera0824 0:e8ba98a758d0 113 uint8_t SCL3300_CMD, SCL3300_CRC;
sameera0824 0:e8ba98a758d0 114 uint16_t SCL3300_DATA;
sameera0824 0:e8ba98a758d0 115 double Temperature, X_angle, Y_angle, Z_angle;
metronix 1:52b1117c65ea 116 bool setFastRead; //chose mode
metronix 1:52b1117c65ea 117 uint32_t _transfer_sck;
sameera0824 0:e8ba98a758d0 118
sameera0824 0:e8ba98a758d0 119 void initSPI();
sameera0824 0:e8ba98a758d0 120 void beginTransmission();
sameera0824 0:e8ba98a758d0 121 void endTransmission();
sameera0824 0:e8ba98a758d0 122 uint8_t CalculateCRC(uint32_t Data);
sameera0824 0:e8ba98a758d0 123 uint8_t CRC8(uint8_t BitValue, uint8_t SCL3300_CRC);
sameera0824 0:e8ba98a758d0 124 unsigned long transfer(unsigned long value);
sameera0824 0:e8ba98a758d0 125
sameera0824 0:e8ba98a758d0 126 union FourByte {
sameera0824 0:e8ba98a758d0 127 unsigned long bit32;
sameera0824 0:e8ba98a758d0 128 unsigned int bit16[2];
sameera0824 0:e8ba98a758d0 129 unsigned char bit8[4];
sameera0824 0:e8ba98a758d0 130 };
metronix 1:52b1117c65ea 131 unsigned long modeCMD[5];
sameera0824 0:e8ba98a758d0 132 };
sameera0824 0:e8ba98a758d0 133 #endif