Library for LIS2DH12 acc.
Dependents: acnSensa_LIS aconnoCellularGnss Lizzy
Revision 7:f1ba533021b8, committed 2018-10-15
- Comitter:
- Dominik Bartolovic
- Date:
- Mon Oct 15 16:06:53 2018 +0200
- Parent:
- 6:b7e3a0c1210b
- Commit message:
- Added SPI support
Changed in this revision
| Lis2dh12.cpp | Show annotated file Show diff for this revision Revisions of this file |
| Lis2dh12.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/Lis2dh12.cpp Fri Mar 09 17:53:52 2018 +0000
+++ b/Lis2dh12.cpp Mon Oct 15 16:06:53 2018 +0200
@@ -4,19 +4,29 @@
* More info @ aconno.de
* Made by Jurica Resetar
* jurica_resetar@yahoo.com
- *
+ *
*/
-
+
#include "Lis2dh12.h"
#include "Lis2dh12_regs.h"
-Lis2dh12::Lis2dh12(I2C *i2c_, char address) : i2c(i2c_, address){
+Lis2dh12::Lis2dh12(I2C *i2c_, char address) : i2c(i2c_, address),
+ spiInterface(false){
+}
+
+Lis2dh12::Lis2dh12(SPI *_spi, DigitalOut *_cs) : i2c(NULL, 0),
+ spi(_spi),
+ cs(_cs),
+ spiInterface(true){
+ *cs = 1;
+ spi->format(8, 3);
+ spi->frequency(1000000);
}
uint8_t Lis2dh12::whoIAm(){
char regAddr = (char)WHO_AM_I;
char regData;
- i2c.readFromReg(regAddr, ®Data, 1);
+ readFromReg(regAddr, (uint8_t*)®Data, 1);
return (uint8_t)regData;
}
@@ -24,10 +34,10 @@
char ctrl1Copy;
char ctrl4Copy;
uint8_t success;
-
- i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
- i2c.readFromReg((char)CTRL_REG4, &ctrl4Copy, 1);
-
+
+ readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
+ readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
+
switch(mode){
case HIGH_RES:
ctrl1Copy &= 0xF7;
@@ -44,24 +54,24 @@
default:
return 0;
}
- i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
- success = i2c.writeToReg((char)CTRL_REG4, &ctrl4Copy, 1);
+ writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
+ success = writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
return success;
}
uint8_t Lis2dh12::enableAxes(Axis axis){
char ctrl1Copy;
- i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
+ readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
ctrl1Copy |= axis;
- i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
+ writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
return 0;
}
uint8_t Lis2dh12::disableAxes(Axis axis){
char ctrl1Copy;
- i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
+ readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
ctrl1Copy &= ~(1 << axis);
- i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
+ writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
return 0;
}
@@ -70,112 +80,170 @@
char tempData;
// Make sure new data is ready
do{
- i2c.readFromReg((char)STATUS, &tempData, 1);
+ readFromReg((char)STATUS, (uint8_t*)&tempData, 1);
}while(!(tempData & 0x08));
do{
- i2c.readFromReg((char)STATUS, &tempData, 1);
+ readFromReg((char)STATUS, (uint8_t*)&tempData, 1);
}while(!(tempData & 0x80));
// Same data have been overwritten
-
- //i2c.readFromReg((char)OUT_X_H, &tempData, 1);
+
+ //readFromReg((char)OUT_X_H, (uint8_t*)&tempData, 1);
//rawData = (int8_t)tempData << 8;
- i2c.readFromReg((char)OUT_X_L, (char*)&rawData, 1);
- i2c.readFromReg((char)OUT_X_H, ((char*)&rawData)+1, 1);
-
+ readFromReg((char)OUT_X_L, (uint8_t*)&rawData, 1);
+ readFromReg((char)OUT_X_H, ((uint8_t*)&rawData)+1, 1);
+
if (rawData >= 0)
rawData = (rawData>>4);
else
rawData = (rawData>>4) | 0xF000;
-
+
return rawData;
}
int16_t Lis2dh12::readYAxis(){
int16_t rawData;
char tempData;
- //i2c.readFromReg((char)OUT_Y_H, &tempData, 1);
+ //readFromReg((char)OUT_Y_H, (uint8_t*)&tempData, 1);
//rawData = (int8_t)tempData << 8;
- i2c.readFromReg((char)OUT_Y_L, (char*)&rawData, 1);
- i2c.readFromReg((char)OUT_Y_H, ((char*)&rawData)+1, 1);
-
+ readFromReg((char)OUT_Y_L, (uint8_t*)&rawData, 1);
+ readFromReg((char)OUT_Y_H, ((uint8_t*)&rawData)+1, 1);
+
if (rawData >= 0)
rawData = (rawData>>4);
else
rawData = (rawData>>4) | 0xF000;
-
+
return rawData;
}
int16_t Lis2dh12::readZAxis(){
int16_t rawData = 0;
char tempData;
- //i2c.readFromReg((char)OUT_Z_H, &tempData, 1);
+ //readFromReg((char)OUT_Z_H, (uint8_t*)&tempData, 1);
//rawData = (int8_t)tempData << 8;
- i2c.readFromReg((char)OUT_Z_L, (char*)&rawData, 1);
- i2c.readFromReg((char)OUT_Z_H, ((char*)&rawData)+1, 1);
-
+ readFromReg((char)OUT_Z_L, (uint8_t*)&rawData, 1);
+ readFromReg((char)OUT_Z_H, ((uint8_t*)&rawData)+1, 1);
+
if (rawData >= 0)
rawData = (rawData>>4);
else
rawData = (rawData>>4) | 0xF000;
-
+
return rawData;
}
uint8_t Lis2dh12::setODR(Odr odr){
char ctrl1Copy;
- i2c.readFromReg((char)CTRL_REG1, &ctrl1Copy, 1);
+ readFromReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
ctrl1Copy |= (odr << 4);
- i2c.writeToReg((char)CTRL_REG1, &ctrl1Copy, 1);
+ writeToReg((char)CTRL_REG1, (uint8_t*)&ctrl1Copy, 1);
return 0;
}
uint8_t Lis2dh12::setScale(Scale scale){
char ctrl4Copy;
- i2c.readFromReg((char)CTRL_REG4, &ctrl4Copy, 1);
+ readFromReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
ctrl4Copy |= (scale << 4);
- i2c.writeToReg((char)CTRL_REG4, &ctrl4Copy, 1);
+ writeToReg((char)CTRL_REG4, (uint8_t*)&ctrl4Copy, 1);
return 0;
}
/* Interrupt activity 1 driven to INT1 pad */
-// TODO: Napraviti tako da postoji samo jedna metoda int1Setup koja prima gro
+// TODO: Napraviti tako da postoji samo jedna metoda int1Setup koja prima gro
// parametara: THS, DUR, Latch...
uint8_t Lis2dh12::int1Setup(uint8_t setup){
char data = setup;
- i2c.writeToReg((char)CTRL_REG3, &data, 1);
+ writeToReg((char)CTRL_REG3, (uint8_t*)&data, 1);
return 0;
}
uint8_t Lis2dh12::int1Latch(uint8_t enable){
char ctrl5Copy;
- i2c.readFromReg((char)CTRL_REG5, &ctrl5Copy, 1);
+ readFromReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1);
ctrl5Copy |= enable;
- i2c.writeToReg((char)CTRL_REG5, &ctrl5Copy, 1);
- return 0;
+ writeToReg((char)CTRL_REG5, (uint8_t*)&ctrl5Copy, 1);
+ return 0;
}
uint8_t Lis2dh12::int1Duration(uint8_t duration){
char copy = duration;
- i2c.writeToReg((char)INT1_DURATION, ©, 1);
+ writeToReg((char)INT1_DURATION, (uint8_t*)©, 1);
return 0;
}
uint8_t Lis2dh12::int1Threshold(uint8_t threshold){
char copy = threshold;
- i2c.writeToReg((char)INT1_THS, ©, 1);
+ writeToReg((char)INT1_THS, (uint8_t*)©, 1);
return 0;
}
uint8_t Lis2dh12::int1Config(uint8_t config){
char copy = config;
- i2c.writeToReg((char)INT1_CFG, ©, 1);
+ writeToReg((char)INT1_CFG, (uint8_t*)©, 1);
return 0;
}
void Lis2dh12::clearIntFlag(){
char data;
- i2c.readFromReg((char)INT1_SRC, (char*)&data, 1);
+ readFromReg((char)INT1_SRC, (uint8_t*)&data, 1);
}
-
\ No newline at end of file
+uint8_t Lis2dh12::readFromReg(uint8_t regAddr, uint8_t *buff, size_t buffSize)
+{
+ // Most significant bit represents read from register, bit after it
+ // represents address increment if multiple read, which is enabled.
+ const uint8_t spiSetup = 0xC0;
+
+ uint8_t retVal = 0;
+
+ if( spiInterface )
+ {
+ *cs = 0;
+
+ spi->write(spiSetup | regAddr);
+
+ while(buffSize--)
+ {
+ *buff = spi->write(0x00);
+ buff++;
+ }
+
+ *cs = 1;
+ }
+ else
+ {
+ retVal = i2c.readFromReg((char)regAddr, (char*)buff, buffSize);
+ }
+
+ return retVal;
+}
+
+uint8_t Lis2dh12::writeToReg(uint8_t regAddr, uint8_t *buff, size_t buffSize)
+{
+ // Most significant bit represents write from register, bit after it
+ // represents address increment if multiple write, which is enabled.
+ const uint8_t spiSetup = 0x40;
+
+ uint8_t retVal = 0;
+
+ if( spiInterface )
+ {
+ *cs = 0;
+
+ spi->write(spiSetup | regAddr);
+
+ while(buffSize--)
+ {
+ spi->write(*buff);
+ buff++;
+ }
+
+ *cs = 1;
+ }
+ else
+ {
+ retVal = i2c.writeToReg((char)regAddr, (char*)buff, buffSize);
+ }
+
+ return retVal;
+}
--- a/Lis2dh12.h Fri Mar 09 17:53:52 2018 +0000
+++ b/Lis2dh12.h Mon Oct 15 16:06:53 2018 +0200
@@ -4,9 +4,9 @@
* More info @ aconno.de
* Made by Jurica Resetar
* jurica_resetar@yahoo.com
- *
+ *
*/
-
+
#ifndef LIS2DH12_H
#define LIS2DH12_H
@@ -49,6 +49,7 @@
class Lis2dh12{
public:
Lis2dh12(I2C *i2c_, char address);
+ Lis2dh12(SPI *_spi, DigitalOut *_cs);
uint8_t whoIAm();
uint8_t setMode(Mode mode);
uint8_t enableAxes(Axis axis);
@@ -66,9 +67,15 @@
void clearIntFlag();
private:
aconno_i2c i2c;
-
+ SPI *spi;
+ DigitalOut *cs;
+
+ bool spiInterface;
+
+ uint8_t readFromReg(uint8_t regAddr, uint8_t *buff, size_t buffSize);
+ uint8_t writeToReg(uint8_t regAddr, uint8_t *buff, size_t buffSize);
+
};
#endif
-
\ No newline at end of file

