Denwis La / Mbed OS mDot_Send_Data

Dependencies:   libmDot-dev-mbed5-deprecated ISL29011

Fork of mdot-examples by 3mdeb

Committer:
SDesign2018
Date:
Sun Dec 10 21:03:22 2017 +0000
Revision:
19:0799d6348449
Parent:
18:0185bc4b9935
Made the interrupt trigger a takeTemperature Flag instead. It seems that it goes it but triggers a mbed assertion failure.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SDesign2018 5:c9ab5062cfc3 1 #include <stdlib.h>
SDesign2018 6:3b41238872a8 2 #include <iostream>
SDesign2018 5:c9ab5062cfc3 3 #include <string.h>
SDesign2018 5:c9ab5062cfc3 4 #include <mbed.h>
SDesign2018 4:b0ce6385d008 5 #include "dot_util.h"
SDesign2018 4:b0ce6385d008 6 #include "RadioEvent.h"
SDesign2018 5:c9ab5062cfc3 7 #include "itoa.h"
SDesign2018 5:c9ab5062cfc3 8
SDesign2018 4:b0ce6385d008 9
SDesign2018 4:b0ce6385d008 10 /////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 11 // -------------------- DOT LIBRARY REQUIRED ------------------------------//
SDesign2018 4:b0ce6385d008 12 // * Because these example programs can be used for both mDot and xDot //
SDesign2018 4:b0ce6385d008 13 // devices, the LoRa stack is not included. The libmDot library should //
SDesign2018 4:b0ce6385d008 14 // be imported if building for mDot devices. The libxDot library //
SDesign2018 4:b0ce6385d008 15 // should be imported if building for xDot devices. //
SDesign2018 4:b0ce6385d008 16 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ //
SDesign2018 4:b0ce6385d008 17 // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ //
SDesign2018 4:b0ce6385d008 18 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ //
SDesign2018 4:b0ce6385d008 19 // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ //
SDesign2018 4:b0ce6385d008 20 /////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 21
SDesign2018 17:0a8d151af3c6 22
SDesign2018 4:b0ce6385d008 23 /////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 24 // * these options must match between the two devices in //
SDesign2018 4:b0ce6385d008 25 // order for communication to be successful
SDesign2018 4:b0ce6385d008 26 //-------------------MDOT variables------------------------//
SDesign2018 4:b0ce6385d008 27 /////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 28 static uint8_t network_address[] = { 0x00, 0x11, 0x22, 0x33 };
SDesign2018 4:b0ce6385d008 29 static uint8_t network_session_key[] = { 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33, 0x00, 0x11, 0x22, 0x33 };
SDesign2018 4:b0ce6385d008 30 static uint8_t data_session_key[] = { 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00, 0x33, 0x22, 0x11, 0x00 };
SDesign2018 4:b0ce6385d008 31
SDesign2018 4:b0ce6385d008 32 mDot* dot = NULL;
SDesign2018 4:b0ce6385d008 33 lora::ChannelPlan* plan = NULL;
SDesign2018 4:b0ce6385d008 34 //--------------End of MDOT variables-------------------//
SDesign2018 4:b0ce6385d008 35
SDesign2018 4:b0ce6385d008 36 Serial pc(USBTX, USBRX);
SDesign2018 4:b0ce6385d008 37
SDesign2018 4:b0ce6385d008 38 // ADXL372 Slave SPI
SDesign2018 4:b0ce6385d008 39 DigitalOut MOSI(D11);
SDesign2018 4:b0ce6385d008 40 DigitalIn MISO(D12);
SDesign2018 4:b0ce6385d008 41 DigitalOut SPI_CLK(D13);
SDesign2018 4:b0ce6385d008 42 DigitalOut SPI_CS(D10);
SDesign2018 4:b0ce6385d008 43 //InterruptIn INT1();
SDesign2018 4:b0ce6385d008 44 //InterruptIn INT2();
SDesign2018 11:dce6c1b255fd 45
SDesign2018 17:0a8d151af3c6 46 DigitalOut led1(LED1);
SDesign2018 4:b0ce6385d008 47
SDesign2018 4:b0ce6385d008 48 // ADXL372 Slave I2C
SDesign2018 4:b0ce6385d008 49 I2C ADXL372(I2C_SDA, I2C_SCL); // (D14,D15) (MISO, CS)
SDesign2018 4:b0ce6385d008 50
SDesign2018 4:b0ce6385d008 51 // ADT7410 Temperature
SDesign2018 4:b0ce6385d008 52 I2C ADT7410(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15)
SDesign2018 4:b0ce6385d008 53 InterruptIn ADT7410_Int(D2); // Allow this pin for ADT7410 Interrupt critical temperature notice
SDesign2018 4:b0ce6385d008 54
SDesign2018 4:b0ce6385d008 55 // DS7505s Temperature
SDesign2018 4:b0ce6385d008 56 I2C DS7505(I2C_SDA, I2C_SCL); // Attempt at making I2C connection to slaves (D14,D15)
SDesign2018 4:b0ce6385d008 57
SDesign2018 4:b0ce6385d008 58 // Create reocurring interrupt function that could be used to periodically take temperatures
SDesign2018 4:b0ce6385d008 59 // Not working right now due to some mutex initialize error
SDesign2018 4:b0ce6385d008 60 // Suspect that it is due to it having be a RTOS task thing
SDesign2018 4:b0ce6385d008 61 // Should probably go back to using an in processor timer interrupt instead of mbed
SDesign2018 4:b0ce6385d008 62 Ticker interruptEverything;
SDesign2018 4:b0ce6385d008 63
SDesign2018 4:b0ce6385d008 64 const int ADT7410_Address_7BIT = 0x49; // A0 set HIGH and A1 set LOW
SDesign2018 4:b0ce6385d008 65 const int ADT7410_Address_8BIT = ADT7410_Address_7BIT << 1; // Shift 1 bit to left for R/~W bit, and basic I2C format
SDesign2018 4:b0ce6385d008 66
SDesign2018 4:b0ce6385d008 67 const int ADXL372_Address_7bit = 0x1D; // Address for the I2C if MISO pulled low, 0x53 if pulled high
SDesign2018 4:b0ce6385d008 68 const int ADXL372_Address_8bit = ADXL372_Address_7bit << 1; // Same
SDesign2018 4:b0ce6385d008 69
SDesign2018 4:b0ce6385d008 70 const int DS7505s_Address_7bit = 0x48; // A0 set LOR, A1 set LOW, A2 set LOW
SDesign2018 4:b0ce6385d008 71 const int DS7505s_Address_8bit = DS7505s_Address_7bit << 1; // Same
SDesign2018 4:b0ce6385d008 72
SDesign2018 19:0799d6348449 73 char * rawTempValues; // Could change to uint8_t, same for other char pointers
SDesign2018 19:0799d6348449 74 uint16_t convertedTempValue; // Data values must be uint16_t for conversion and send prep
SDesign2018 19:0799d6348449 75 int regAddress;
SDesign2018 19:0799d6348449 76
SDesign2018 19:0799d6348449 77 uint16_t temperatureBuffer[20];
SDesign2018 4:b0ce6385d008 78
SDesign2018 17:0a8d151af3c6 79 int counter = 0;
SDesign2018 19:0799d6348449 80 bool takeTemperature = false;
SDesign2018 17:0a8d151af3c6 81
SDesign2018 4:b0ce6385d008 82 //-------------------All prototype functions-----------------------//
SDesign2018 4:b0ce6385d008 83 void ADXL372Initialize(void);
SDesign2018 4:b0ce6385d008 84
SDesign2018 4:b0ce6385d008 85 int accelerometerI2CWrite(int hexAddress, int hexData);
SDesign2018 4:b0ce6385d008 86 char * accelerometerI2CRead(int hexAddress);
SDesign2018 4:b0ce6385d008 87 void ADXL372Reset(void);
SDesign2018 10:db20118b7d32 88 void I2CSelfTest(void);
SDesign2018 4:b0ce6385d008 89 void BitBangSPIWrite(const unsigned char regAddr, const unsigned char regData);
SDesign2018 5:c9ab5062cfc3 90 uint8_t BitBangSPIRead (const unsigned char regAddr);
SDesign2018 4:b0ce6385d008 91
SDesign2018 4:b0ce6385d008 92 int ADT7410Write(unsigned char registerAddress, unsigned char data);
SDesign2018 4:b0ce6385d008 93 char * ADT7410Read(int hex);
SDesign2018 4:b0ce6385d008 94
SDesign2018 4:b0ce6385d008 95 int DS7505sWrite(unsigned char registerAddress, unsigned char data);
SDesign2018 4:b0ce6385d008 96 char * DS7505sRead(int hex);
SDesign2018 4:b0ce6385d008 97
SDesign2018 13:e336881e0a3e 98 char twosComplementConversion(char value);
SDesign2018 6:3b41238872a8 99 void flushSerialBuffer(void);
SDesign2018 4:b0ce6385d008 100 //---------------------End of prototype functions-----------------------------//
SDesign2018 4:b0ce6385d008 101
SDesign2018 4:b0ce6385d008 102 void printMenu(){
SDesign2018 4:b0ce6385d008 103 pc.printf("Please eneter a debug option: \n\r"
SDesign2018 5:c9ab5062cfc3 104 "1: I2C Read converted values from Accelerometer ADXL372\n\r"
SDesign2018 4:b0ce6385d008 105 "2: Read converted values from Temperature ADT7410\n\r"
SDesign2018 4:b0ce6385d008 106 "3: Read raw values from Accelerometer ADXL372\n\r"
SDesign2018 4:b0ce6385d008 107 "4: Read raw values from Temperature ADT7410\n\r"
SDesign2018 9:df0c4e8a3097 108 "5: Initialize Accelerometer with I2C\n\r"
SDesign2018 10:db20118b7d32 109 "6: Reset Accelerometer with I2C\n\r"
SDesign2018 10:db20118b7d32 110 "7: Perform self test with I2C\n\r"
SDesign2018 10:db20118b7d32 111 "8: Send Temperature data\n\r"
SDesign2018 10:db20118b7d32 112 "9: SPI Read values from Accelerometer ADXL372\n\r"
SDesign2018 10:db20118b7d32 113 "a: SPI reset for ADXL372\n\r"
SDesign2018 10:db20118b7d32 114 "b: Initialize Accelerometer with SPI\n\r"
SDesign2018 10:db20118b7d32 115 "c: Check data in status register with SPI\n\r"
SDesign2018 12:bdf16bf682ec 116 "d: Perform self test with SPI\n\r"
SDesign2018 17:0a8d151af3c6 117 "e: Perform two's complement on accel data\n\r"
SDesign2018 17:0a8d151af3c6 118 "g: Set temperature critical to 24 celsius\n\r"
SDesign2018 17:0a8d151af3c6 119 "h: Print interrupt counter\n\r");
SDesign2018 4:b0ce6385d008 120 }
SDesign2018 4:b0ce6385d008 121
SDesign2018 4:b0ce6385d008 122
SDesign2018 4:b0ce6385d008 123 /*******************************************************************************
SDesign2018 4:b0ce6385d008 124 * Function to be called by the ticker interrupt
SDesign2018 4:b0ce6385d008 125 * Read temperatures and send it
SDesign2018 4:b0ce6385d008 126 *
SDesign2018 4:b0ce6385d008 127 *
SDesign2018 4:b0ce6385d008 128 ******************************************************************************/
SDesign2018 4:b0ce6385d008 129 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 130 void interruptReadTemperature(void){
SDesign2018 4:b0ce6385d008 131 std::vector<uint8_t> tx_data;
SDesign2018 4:b0ce6385d008 132 uint16_t temperatures;
SDesign2018 4:b0ce6385d008 133 char data[2] = {0, 0};
SDesign2018 4:b0ce6385d008 134 char cmd[1];
SDesign2018 4:b0ce6385d008 135 cmd[0] = 0x00;
SDesign2018 4:b0ce6385d008 136 //pc.printf("Register Addres is: %x \n\r", cmd[0]);
SDesign2018 4:b0ce6385d008 137 if(ADT7410.write(ADT7410_Address_8BIT, cmd,1) == 0){
SDesign2018 4:b0ce6385d008 138 if(ADT7410.read(ADT7410_Address_8BIT, data, 2) == 0){
SDesign2018 4:b0ce6385d008 139 temperatures = ((data[0] << 8) | data[1]) >> 3;
SDesign2018 4:b0ce6385d008 140 tx_data.push_back((temperatures >> 8) & 0xFF);
SDesign2018 4:b0ce6385d008 141 tx_data.push_back(temperatures & 0xFF);
SDesign2018 4:b0ce6385d008 142 logInfo("light: %lu [0x%04X]", temperatures, temperatures);
SDesign2018 4:b0ce6385d008 143 send_data(tx_data);
SDesign2018 4:b0ce6385d008 144 //return (data[0] >> 8 | data[1])>>3; // Explained here: https://stackoverflow.com/a/141576 SOOO GOOOOODDD
SDesign2018 4:b0ce6385d008 145
SDesign2018 4:b0ce6385d008 146 }
SDesign2018 4:b0ce6385d008 147 }
SDesign2018 4:b0ce6385d008 148 }
SDesign2018 4:b0ce6385d008 149 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 150
SDesign2018 19:0799d6348449 151 void CriticalTemperatureInterrupt(void){
SDesign2018 19:0799d6348449 152 takeTemperature = true; // Take temperature because something happened
SDesign2018 17:0a8d151af3c6 153 }
SDesign2018 17:0a8d151af3c6 154
SDesign2018 11:dce6c1b255fd 155
SDesign2018 11:dce6c1b255fd 156
SDesign2018 11:dce6c1b255fd 157 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 11:dce6c1b255fd 158 /* _
SDesign2018 11:dce6c1b255fd 159 ____ ___ ____ _(_)___
SDesign2018 11:dce6c1b255fd 160 / __ `__ \/ __ `/ / __ \
SDesign2018 11:dce6c1b255fd 161 / / / / / / /_/ / / / / /
SDesign2018 11:dce6c1b255fd 162 /_/ /_/ /_/\__,_/_/_/ /_/
SDesign2018 11:dce6c1b255fd 163
SDesign2018 11:dce6c1b255fd 164 *//////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 165 int main() {
SDesign2018 4:b0ce6385d008 166 // Custom event handler for automatically displaying RX data
SDesign2018 5:c9ab5062cfc3 167 //interruptEverything.attach(&interruptReadTemperature, 7.0);
SDesign2018 4:b0ce6385d008 168 RadioEvent events;
SDesign2018 4:b0ce6385d008 169 uint32_t tx_frequency;
SDesign2018 4:b0ce6385d008 170 uint8_t tx_datarate;
SDesign2018 4:b0ce6385d008 171 uint8_t tx_power;
SDesign2018 4:b0ce6385d008 172 uint8_t frequency_band;
SDesign2018 4:b0ce6385d008 173
SDesign2018 4:b0ce6385d008 174 // Points to the returned char pointer from called functions
SDesign2018 19:0799d6348449 175 //char * rawTempValues; // Could change to uint8_t, same for other char pointers
SDesign2018 16:12f38e4755de 176 char Xmsb;
SDesign2018 16:12f38e4755de 177 char Xlsb;
SDesign2018 16:12f38e4755de 178 char Ymsb;
SDesign2018 16:12f38e4755de 179 char Ylsb;
SDesign2018 16:12f38e4755de 180 char Zmsb;
SDesign2018 16:12f38e4755de 181 char Zlsb;
SDesign2018 4:b0ce6385d008 182
SDesign2018 4:b0ce6385d008 183 // Save converted values here
SDesign2018 19:0799d6348449 184 //uint16_t convertedTempValue; // Data values must be uint16_t for conversion and send prep
SDesign2018 4:b0ce6385d008 185 char *accelValues;
SDesign2018 4:b0ce6385d008 186 uint16_t XData;
SDesign2018 4:b0ce6385d008 187 uint16_t YData;
SDesign2018 4:b0ce6385d008 188 uint16_t ZData;
SDesign2018 19:0799d6348449 189
SDesign2018 19:0799d6348449 190 //int regAddress;
SDesign2018 4:b0ce6385d008 191
SDesign2018 4:b0ce6385d008 192 // Change baud rate in serial terminal to this value
SDesign2018 4:b0ce6385d008 193 pc.baud(115200);
SDesign2018 17:0a8d151af3c6 194 ADXL372.frequency(300000);
SDesign2018 17:0a8d151af3c6 195 ADT7410_Int.fall(&CriticalTemperatureInterrupt);
SDesign2018 4:b0ce6385d008 196
SDesign2018 4:b0ce6385d008 197
SDesign2018 4:b0ce6385d008 198 mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL);
SDesign2018 4:b0ce6385d008 199
SDesign2018 4:b0ce6385d008 200 // Sometimes when calling this, it creates error: type specifier expected
SDesign2018 4:b0ce6385d008 201 // Even with identical include files I would get this in another workspace.
SDesign2018 4:b0ce6385d008 202 plan = new lora::ChannelPlan_US915();
SDesign2018 4:b0ce6385d008 203
SDesign2018 4:b0ce6385d008 204 logInfo("Now asserting");
SDesign2018 4:b0ce6385d008 205 assert(plan);
SDesign2018 4:b0ce6385d008 206
SDesign2018 4:b0ce6385d008 207 // Careful when using this. The production ready libmdot-mbed5 has a void constructor
SDesign2018 4:b0ce6385d008 208 // Therefore, can only use the libmDot-dev-mbed5 version, for now.
SDesign2018 4:b0ce6385d008 209 dot = mDot::getInstance(plan);
SDesign2018 4:b0ce6385d008 210 assert(dot);
SDesign2018 4:b0ce6385d008 211
SDesign2018 4:b0ce6385d008 212 logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION);
SDesign2018 4:b0ce6385d008 213
SDesign2018 4:b0ce6385d008 214 // start from a well-known state
SDesign2018 4:b0ce6385d008 215 logInfo("defaulting Dot configuration");
SDesign2018 4:b0ce6385d008 216 dot->resetConfig();
SDesign2018 4:b0ce6385d008 217
SDesign2018 4:b0ce6385d008 218 // make sure library logging is turned on
SDesign2018 4:b0ce6385d008 219 dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
SDesign2018 4:b0ce6385d008 220
SDesign2018 4:b0ce6385d008 221 // attach the custom events handler
SDesign2018 4:b0ce6385d008 222 dot->setEvents(&events);
SDesign2018 4:b0ce6385d008 223
SDesign2018 4:b0ce6385d008 224 // update configuration if necessary
SDesign2018 4:b0ce6385d008 225 if (dot->getJoinMode() != mDot::PEER_TO_PEER) {
SDesign2018 4:b0ce6385d008 226 logInfo("changing network join mode to PEER_TO_PEER");
SDesign2018 4:b0ce6385d008 227 if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) {
SDesign2018 4:b0ce6385d008 228 logError("failed to set network join mode to PEER_TO_PEER");
SDesign2018 4:b0ce6385d008 229 }
SDesign2018 4:b0ce6385d008 230 }
SDesign2018 4:b0ce6385d008 231
SDesign2018 4:b0ce6385d008 232 /*
SDesign2018 4:b0ce6385d008 233 * Get the Frequency and then choose transfer frequency, datarate, and power accordingly
SDesign2018 4:b0ce6385d008 234 *
SDesign2018 4:b0ce6385d008 235 */
SDesign2018 4:b0ce6385d008 236 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 237 frequency_band = dot->getFrequencyBand();
SDesign2018 4:b0ce6385d008 238 switch (frequency_band) {
SDesign2018 4:b0ce6385d008 239 case lora::ChannelPlan::EU868_OLD:
SDesign2018 4:b0ce6385d008 240 case lora::ChannelPlan::EU868:
SDesign2018 4:b0ce6385d008 241 // 250kHz channels achieve higher throughput
SDesign2018 4:b0ce6385d008 242 // DR_6 : SF7 @ 250kHz
SDesign2018 4:b0ce6385d008 243 // DR_0 - DR_5 (125kHz channels) available but much slower
SDesign2018 4:b0ce6385d008 244 tx_frequency = 869850000;
SDesign2018 4:b0ce6385d008 245 tx_datarate = lora::DR_6;
SDesign2018 4:b0ce6385d008 246 // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7
SDesign2018 4:b0ce6385d008 247 tx_power = 4;
SDesign2018 4:b0ce6385d008 248 break;
SDesign2018 4:b0ce6385d008 249
SDesign2018 4:b0ce6385d008 250 case lora::ChannelPlan::US915_OLD:
SDesign2018 4:b0ce6385d008 251 case lora::ChannelPlan::US915:
SDesign2018 4:b0ce6385d008 252 case lora::ChannelPlan::AU915_OLD:
SDesign2018 4:b0ce6385d008 253 case lora::ChannelPlan::AU915:
SDesign2018 4:b0ce6385d008 254 // 500kHz channels achieve highest throughput
SDesign2018 4:b0ce6385d008 255 // DR_8 : SF12 @ 500kHz
SDesign2018 4:b0ce6385d008 256 // DR_9 : SF11 @ 500kHz
SDesign2018 4:b0ce6385d008 257 // DR_10 : SF10 @ 500kHz
SDesign2018 4:b0ce6385d008 258 // DR_11 : SF9 @ 500kHz
SDesign2018 4:b0ce6385d008 259 // DR_12 : SF8 @ 500kHz
SDesign2018 4:b0ce6385d008 260 // DR_13 : SF7 @ 500kHz
SDesign2018 4:b0ce6385d008 261 // DR_0 - DR_3 (125kHz channels) available but much slower
SDesign2018 4:b0ce6385d008 262 tx_frequency = 915500000;
SDesign2018 4:b0ce6385d008 263 tx_datarate = lora::DR_13;
SDesign2018 4:b0ce6385d008 264 // 915 bands have no duty cycle restrictions, set tx power to max
SDesign2018 4:b0ce6385d008 265 tx_power = 20;
SDesign2018 4:b0ce6385d008 266 break;
SDesign2018 4:b0ce6385d008 267
SDesign2018 4:b0ce6385d008 268 case lora::ChannelPlan::AS923:
SDesign2018 4:b0ce6385d008 269 case lora::ChannelPlan::AS923_JAPAN:
SDesign2018 4:b0ce6385d008 270 // 250kHz channels achieve higher throughput
SDesign2018 4:b0ce6385d008 271 // DR_6 : SF7 @ 250kHz
SDesign2018 4:b0ce6385d008 272 // DR_0 - DR_5 (125kHz channels) available but much slower
SDesign2018 4:b0ce6385d008 273 tx_frequency = 924800000;
SDesign2018 4:b0ce6385d008 274 tx_datarate = lora::DR_6;
SDesign2018 4:b0ce6385d008 275 tx_power = 16;
SDesign2018 4:b0ce6385d008 276 break;
SDesign2018 4:b0ce6385d008 277
SDesign2018 4:b0ce6385d008 278 case lora::ChannelPlan::KR920:
SDesign2018 4:b0ce6385d008 279 // DR_5 : SF7 @ 125kHz
SDesign2018 4:b0ce6385d008 280 tx_frequency = 922700000;
SDesign2018 4:b0ce6385d008 281 tx_datarate = lora::DR_5;
SDesign2018 4:b0ce6385d008 282 tx_power = 14;
SDesign2018 4:b0ce6385d008 283 break;
SDesign2018 4:b0ce6385d008 284
SDesign2018 4:b0ce6385d008 285 default:
SDesign2018 4:b0ce6385d008 286 while (true) {
SDesign2018 4:b0ce6385d008 287 logFatal("no known channel plan in use - extra configuration is needed!");
SDesign2018 4:b0ce6385d008 288 wait(5);
SDesign2018 4:b0ce6385d008 289 }
SDesign2018 4:b0ce6385d008 290 break;
SDesign2018 4:b0ce6385d008 291 }
SDesign2018 4:b0ce6385d008 292
SDesign2018 4:b0ce6385d008 293 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 294
SDesign2018 4:b0ce6385d008 295 // in PEER_TO_PEER mode there is no join request/response transaction
SDesign2018 4:b0ce6385d008 296 // as long as both Dots are configured correctly, they should be able to communicate
SDesign2018 4:b0ce6385d008 297 update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power);
SDesign2018 4:b0ce6385d008 298
SDesign2018 4:b0ce6385d008 299 // save changes to configuration
SDesign2018 4:b0ce6385d008 300 logInfo("saving configuration");
SDesign2018 4:b0ce6385d008 301 if (!dot->saveConfig()) {
SDesign2018 4:b0ce6385d008 302 logError("failed to save configuration");
SDesign2018 4:b0ce6385d008 303 }
SDesign2018 4:b0ce6385d008 304
SDesign2018 4:b0ce6385d008 305 // Display configuration
SDesign2018 4:b0ce6385d008 306 // It's gonna output a lot of information onto the Serial Terminal
SDesign2018 4:b0ce6385d008 307 display_config();
SDesign2018 4:b0ce6385d008 308
SDesign2018 4:b0ce6385d008 309 /*
SDesign2018 4:b0ce6385d008 310 *
SDesign2018 4:b0ce6385d008 311 * From here on is my own code
SDesign2018 4:b0ce6385d008 312 * Can add more options to choose from
SDesign2018 4:b0ce6385d008 313 *
SDesign2018 4:b0ce6385d008 314 */
SDesign2018 4:b0ce6385d008 315 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 316 printMenu();
SDesign2018 6:3b41238872a8 317 flushSerialBuffer();
SDesign2018 4:b0ce6385d008 318 pc.printf("\n\rChoose what you want to do: \n\r");
SDesign2018 4:b0ce6385d008 319
SDesign2018 4:b0ce6385d008 320 char userInput = pc.getc();
SDesign2018 4:b0ce6385d008 321 while(1){
SDesign2018 19:0799d6348449 322
SDesign2018 19:0799d6348449 323 if(takeTemperature) // Interrupt will trigger this
SDesign2018 19:0799d6348449 324 {
SDesign2018 19:0799d6348449 325 for(int i = 0; i < sizeof(temperatureBuffer); ++i)
SDesign2018 19:0799d6348449 326 {
SDesign2018 19:0799d6348449 327 regAddress = 0x00;
SDesign2018 19:0799d6348449 328 rawTempValues = ADT7410Read(regAddress);
SDesign2018 19:0799d6348449 329 convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 19:0799d6348449 330 // a short int variable(16 bits), remove last 3 bits
SDesign2018 19:0799d6348449 331 temperatureBuffer[i] = convertedTempValue;
SDesign2018 19:0799d6348449 332 }
SDesign2018 19:0799d6348449 333 takeTemperature = !takeTemperature; // Flip back to false so it doesn't trigger again
SDesign2018 19:0799d6348449 334 }
SDesign2018 19:0799d6348449 335
SDesign2018 19:0799d6348449 336
SDesign2018 4:b0ce6385d008 337 // Create a vector of uint8_t elements to be sent later
SDesign2018 4:b0ce6385d008 338 std::vector<uint8_t> tx_data;
SDesign2018 4:b0ce6385d008 339
SDesign2018 4:b0ce6385d008 340 // Checks if a character has been pressed;
SDesign2018 4:b0ce6385d008 341 // Works right now for 1 digit numbers :(
SDesign2018 4:b0ce6385d008 342 // Change to work with larger inputs
SDesign2018 4:b0ce6385d008 343 if(pc.readable())
SDesign2018 4:b0ce6385d008 344 {
SDesign2018 4:b0ce6385d008 345 userInput = pc.getc();
SDesign2018 4:b0ce6385d008 346 switch(userInput){
SDesign2018 4:b0ce6385d008 347 case 49: // 1
SDesign2018 4:b0ce6385d008 348 pc.printf("Reading converted values from accelerometer\n\r");
SDesign2018 4:b0ce6385d008 349 for(int i = 0; i < 15; ++i){
SDesign2018 4:b0ce6385d008 350 regAddress = 0x08; // This is the register address for XData
SDesign2018 4:b0ce6385d008 351 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 17:0a8d151af3c6 352 Xmsb = *(accelValues + 0);
SDesign2018 17:0a8d151af3c6 353 Xlsb = *(accelValues + 1);
SDesign2018 17:0a8d151af3c6 354 Ymsb = *(accelValues + 2);
SDesign2018 17:0a8d151af3c6 355 Ylsb = *(accelValues + 3);
SDesign2018 17:0a8d151af3c6 356 Zmsb = *(accelValues + 4);
SDesign2018 17:0a8d151af3c6 357 Zlsb = *(accelValues + 5);
SDesign2018 16:12f38e4755de 358
SDesign2018 16:12f38e4755de 359 XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 16:12f38e4755de 360 YData = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 16:12f38e4755de 361 ZData = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 17:0a8d151af3c6 362
SDesign2018 17:0a8d151af3c6 363 XData = twosComplementConversion(XData);
SDesign2018 17:0a8d151af3c6 364 YData = twosComplementConversion(YData);
SDesign2018 17:0a8d151af3c6 365 ZData = twosComplementConversion(ZData);
SDesign2018 17:0a8d151af3c6 366
SDesign2018 4:b0ce6385d008 367 pc.printf("\n %d: X: 0x%x | Y: 0x%x | Z: 0x%x \n\r", i+1, XData, YData, ZData);
SDesign2018 4:b0ce6385d008 368 wait(0.2);
SDesign2018 4:b0ce6385d008 369 }
SDesign2018 4:b0ce6385d008 370 break;
SDesign2018 4:b0ce6385d008 371 case 50: // 2
SDesign2018 4:b0ce6385d008 372 pc.printf("Reading converted values from temperature\n\r");
SDesign2018 4:b0ce6385d008 373 for(int i = 0; i < 10; ++i){
SDesign2018 4:b0ce6385d008 374 regAddress = 0x00;
SDesign2018 4:b0ce6385d008 375 rawTempValues = ADT7410Read(regAddress);
SDesign2018 4:b0ce6385d008 376 convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes into
SDesign2018 5:c9ab5062cfc3 377 // a short int variable(16 bits), remove last 3 bits
SDesign2018 4:b0ce6385d008 378
SDesign2018 4:b0ce6385d008 379 pc.printf("\n %d: Temperature is: 0x%x \n\r", i+1, convertedTempValue);
SDesign2018 4:b0ce6385d008 380 }
SDesign2018 4:b0ce6385d008 381
SDesign2018 4:b0ce6385d008 382 break;
SDesign2018 4:b0ce6385d008 383 case 51: // 3
SDesign2018 4:b0ce6385d008 384 pc.printf("Reading raw values from accelerometer\n\r");
SDesign2018 4:b0ce6385d008 385 for(int i = 0; i < 15; ++i){
SDesign2018 17:0a8d151af3c6 386 regAddress = 0x08; // This is the register address for XData
SDesign2018 4:b0ce6385d008 387 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 17:0a8d151af3c6 388 Xmsb = *(accelValues + 0);
SDesign2018 17:0a8d151af3c6 389 Xlsb = *(accelValues + 1);
SDesign2018 17:0a8d151af3c6 390 Ymsb = *(accelValues + 2);
SDesign2018 17:0a8d151af3c6 391 Ylsb = *(accelValues + 3);
SDesign2018 17:0a8d151af3c6 392 Zmsb = *(accelValues + 4);
SDesign2018 17:0a8d151af3c6 393 Zlsb = *(accelValues + 5);
SDesign2018 17:0a8d151af3c6 394
SDesign2018 17:0a8d151af3c6 395 XData = (Xmsb << 8 | Xlsb) >> 4; // Combine two bytes into short int, remove last 4 flag bits
SDesign2018 17:0a8d151af3c6 396 YData = (Ymsb << 8 | Ylsb) >> 4;
SDesign2018 17:0a8d151af3c6 397 ZData = (Zmsb << 8 | Zlsb) >> 4;
SDesign2018 17:0a8d151af3c6 398
SDesign2018 17:0a8d151af3c6 399 XData = twosComplementConversion(XData);
SDesign2018 17:0a8d151af3c6 400 YData = twosComplementConversion(YData);
SDesign2018 17:0a8d151af3c6 401 ZData = twosComplementConversion(ZData);
SDesign2018 17:0a8d151af3c6 402
SDesign2018 17:0a8d151af3c6 403 Xlsb = XData & 0xFF;
SDesign2018 17:0a8d151af3c6 404 Xmsb = XData >> 8;
SDesign2018 17:0a8d151af3c6 405
SDesign2018 17:0a8d151af3c6 406 Ylsb = YData & 0xFF;
SDesign2018 17:0a8d151af3c6 407 Ymsb = YData >> 8;
SDesign2018 17:0a8d151af3c6 408
SDesign2018 17:0a8d151af3c6 409 Zlsb = ZData & 0xFF;
SDesign2018 17:0a8d151af3c6 410 Zmsb = ZData >> 8;
SDesign2018 17:0a8d151af3c6 411
SDesign2018 16:12f38e4755de 412 pc.printf("\n %d: X:: H: %x | L: %x | Y:: H: %x | L: %x | Z: H: %x | L: %x \n\r", i+1, Xmsb,
SDesign2018 16:12f38e4755de 413 Xlsb,
SDesign2018 16:12f38e4755de 414 Ymsb,
SDesign2018 16:12f38e4755de 415 Ylsb,
SDesign2018 16:12f38e4755de 416 Zmsb,
SDesign2018 16:12f38e4755de 417 Zlsb);
SDesign2018 4:b0ce6385d008 418 wait(0.2);
SDesign2018 4:b0ce6385d008 419 }
SDesign2018 4:b0ce6385d008 420 break;
SDesign2018 4:b0ce6385d008 421 case 52: // 4
SDesign2018 4:b0ce6385d008 422 pc.printf("Reading raw values from temperature\n\r");
SDesign2018 4:b0ce6385d008 423 for(int i = 0; i < 10; ++i){
SDesign2018 4:b0ce6385d008 424 regAddress = 0x00;
SDesign2018 4:b0ce6385d008 425 rawTempValues = ADT7410Read(regAddress);
SDesign2018 13:e336881e0a3e 426 pc.printf("\n %d: Temperature is: HIGH BYTE: %x | LOW BYTE: %x \n\r", i+1, *(rawTempValues + 0),
SDesign2018 13:e336881e0a3e 427 *(rawTempValues + 1));
SDesign2018 4:b0ce6385d008 428 }
SDesign2018 4:b0ce6385d008 429 break;
SDesign2018 4:b0ce6385d008 430 case 53: // 5
SDesign2018 4:b0ce6385d008 431 ADXL372Initialize();
SDesign2018 4:b0ce6385d008 432 break;
SDesign2018 4:b0ce6385d008 433 case 54: // 6
SDesign2018 4:b0ce6385d008 434 ADXL372Reset();
SDesign2018 4:b0ce6385d008 435 break;
SDesign2018 4:b0ce6385d008 436
SDesign2018 10:db20118b7d32 437 case 55: // 7: perform self test with I2C
SDesign2018 10:db20118b7d32 438 I2CSelfTest();
SDesign2018 10:db20118b7d32 439 break;
SDesign2018 10:db20118b7d32 440 case 56: // 8: Read Temperature raws
SDesign2018 4:b0ce6385d008 441 regAddress = 0x00;
SDesign2018 4:b0ce6385d008 442 rawTempValues = ADT7410Read(regAddress);
SDesign2018 4:b0ce6385d008 443 convertedTempValue = ((*(rawTempValues + 0) << 8) | *(rawTempValues + 1)) >> 3; // Combine the two bytes
SDesign2018 4:b0ce6385d008 444
SDesign2018 4:b0ce6385d008 445 tx_data.push_back((convertedTempValue >> 8) & 0xFF);
SDesign2018 4:b0ce6385d008 446 tx_data.push_back(convertedTempValue & 0xFF);
SDesign2018 4:b0ce6385d008 447 logInfo("light: %lu [0x%04X]", convertedTempValue, convertedTempValue);
SDesign2018 4:b0ce6385d008 448 send_data(tx_data);
SDesign2018 5:c9ab5062cfc3 449 break;
SDesign2018 4:b0ce6385d008 450
SDesign2018 10:db20118b7d32 451 case 57: // 9: Read Accelerometer SPI
SDesign2018 5:c9ab5062cfc3 452 uint8_t MSB;
SDesign2018 5:c9ab5062cfc3 453 uint8_t LSB;
SDesign2018 5:c9ab5062cfc3 454
SDesign2018 5:c9ab5062cfc3 455
SDesign2018 5:c9ab5062cfc3 456 for(int i = 0; i < 15; ++i){
SDesign2018 5:c9ab5062cfc3 457
SDesign2018 5:c9ab5062cfc3 458 MSB = BitBangSPIRead(0x08); // XData MSB
SDesign2018 5:c9ab5062cfc3 459 LSB = BitBangSPIRead(0x09); // XData LSB
SDesign2018 5:c9ab5062cfc3 460 XData = ((MSB << 8) | LSB) >> 4;
SDesign2018 5:c9ab5062cfc3 461
SDesign2018 5:c9ab5062cfc3 462 MSB = BitBangSPIRead(0x0A); // YData MSB
SDesign2018 5:c9ab5062cfc3 463 LSB = BitBangSPIRead(0x0B); // YData LSB
SDesign2018 5:c9ab5062cfc3 464 YData = ((MSB << 8) | LSB) >> 4;
SDesign2018 5:c9ab5062cfc3 465
SDesign2018 5:c9ab5062cfc3 466 MSB = BitBangSPIRead(0x0C); // ZData MSB
SDesign2018 5:c9ab5062cfc3 467 LSB = BitBangSPIRead(0x0D); // ZData LSB
SDesign2018 5:c9ab5062cfc3 468 ZData = ((MSB << 8 ) | LSB) >> 4;
SDesign2018 5:c9ab5062cfc3 469
SDesign2018 5:c9ab5062cfc3 470 pc.printf("\n %d: X: 0x%x | Y: 0x%x | Z: 0x%x \n\r", i+1, XData, YData, ZData);
SDesign2018 5:c9ab5062cfc3 471 wait(0.2);
SDesign2018 5:c9ab5062cfc3 472 }
SDesign2018 5:c9ab5062cfc3 473 break;
SDesign2018 10:db20118b7d32 474 case 97: // a: Reset Accelerometer with SPI
SDesign2018 6:3b41238872a8 475 int intRegister;
SDesign2018 7:5f2b3d1a9b0b 476 char input[4];
SDesign2018 5:c9ab5062cfc3 477 char passRegister[1];
SDesign2018 6:3b41238872a8 478 int intData;
SDesign2018 5:c9ab5062cfc3 479 char passData[1];
SDesign2018 8:efab0e415826 480 BitBangSPIWrite(0x41, 0x52);
SDesign2018 8:efab0e415826 481 pc.printf("Done \n\r");
SDesign2018 6:3b41238872a8 482 break;
SDesign2018 10:db20118b7d32 483 case 98: // b: Initialize Accelerometer with SPI
SDesign2018 9:df0c4e8a3097 484 BitBangSPIWrite(0x24, 0x01); // Turn on X
SDesign2018 9:df0c4e8a3097 485 BitBangSPIWrite(0x26, 0x01); // Turn on Y
SDesign2018 9:df0c4e8a3097 486 BitBangSPIWrite(0x28, 0x01); // Turn on Z
SDesign2018 9:df0c4e8a3097 487 pc.printf("Done\n\r");
SDesign2018 9:df0c4e8a3097 488 break;
SDesign2018 10:db20118b7d32 489 case 99: // c: Check status with SPI
SDesign2018 9:df0c4e8a3097 490 uint8_t statusData = BitBangSPIRead(0x04);
SDesign2018 9:df0c4e8a3097 491
SDesign2018 9:df0c4e8a3097 492 pc.printf("0x%x in status\n\r", statusData);
SDesign2018 9:df0c4e8a3097 493 break;
SDesign2018 10:db20118b7d32 494 case 100: // d: Perform self-test
SDesign2018 9:df0c4e8a3097 495 uint8_t testResult;
SDesign2018 9:df0c4e8a3097 496 BitBangSPIWrite(0x3F, 0x03); // put to fullbandwidth measurement mode and lpf enaled(0)
SDesign2018 9:df0c4e8a3097 497
SDesign2018 9:df0c4e8a3097 498 BitBangSPIWrite(0x40, 0x01); // start self test
SDesign2018 9:df0c4e8a3097 499 testResult = BitBangSPIRead(0x40);
SDesign2018 9:df0c4e8a3097 500 while(!(BitBangSPIRead(0x40) & 0x02)){}
SDesign2018 9:df0c4e8a3097 501 wait(0.4);
SDesign2018 9:df0c4e8a3097 502
SDesign2018 9:df0c4e8a3097 503 testResult = BitBangSPIRead(0x40);
SDesign2018 9:df0c4e8a3097 504
SDesign2018 9:df0c4e8a3097 505 if(testResult & 0x04)
SDesign2018 9:df0c4e8a3097 506 {
SDesign2018 9:df0c4e8a3097 507 pc.printf("It passed \n\r");
SDesign2018 9:df0c4e8a3097 508 }
SDesign2018 9:df0c4e8a3097 509 pc.printf("0x%x\n\r", testResult);
SDesign2018 9:df0c4e8a3097 510 break;
SDesign2018 12:bdf16bf682ec 511 case 101: // e for two's complement of accel data
SDesign2018 12:bdf16bf682ec 512 regAddress = 0x08;
SDesign2018 12:bdf16bf682ec 513
SDesign2018 12:bdf16bf682ec 514 accelValues = accelerometerI2CRead(regAddress);
SDesign2018 13:e336881e0a3e 515
SDesign2018 13:e336881e0a3e 516 Xmsb = *(accelValues + 0);
SDesign2018 13:e336881e0a3e 517 Xlsb = *(accelValues + 1);
SDesign2018 13:e336881e0a3e 518 Ymsb = *(accelValues + 2);
SDesign2018 13:e336881e0a3e 519 Ylsb = *(accelValues + 3);
SDesign2018 13:e336881e0a3e 520 Zmsb = *(accelValues + 4);
SDesign2018 13:e336881e0a3e 521 Zlsb = *(accelValues + 5);
SDesign2018 12:bdf16bf682ec 522 pc.printf("\n X:: H: %x | L: %x | Y:: H: %x | L: %x | Z: H: %x | L: %x \n\r", *(accelValues + 0),
SDesign2018 12:bdf16bf682ec 523 *(accelValues + 1),
SDesign2018 12:bdf16bf682ec 524 *(accelValues + 2),
SDesign2018 12:bdf16bf682ec 525 *(accelValues + 3),
SDesign2018 12:bdf16bf682ec 526 *(accelValues + 4),
SDesign2018 12:bdf16bf682ec 527 *(accelValues + 5));
SDesign2018 12:bdf16bf682ec 528 pc.printf("Converted \n\r");
SDesign2018 12:bdf16bf682ec 529
SDesign2018 13:e336881e0a3e 530 pc.printf("\n X:: H: %x | L: %x | Y:: H: %x | L: %x | Z: H: %x | L: %x \n\r", twosComplementConversion(Xmsb),
SDesign2018 13:e336881e0a3e 531 twosComplementConversion(Xlsb),
SDesign2018 13:e336881e0a3e 532 twosComplementConversion(Ymsb),
SDesign2018 13:e336881e0a3e 533 twosComplementConversion(Ylsb),
SDesign2018 13:e336881e0a3e 534 twosComplementConversion(Zmsb),
SDesign2018 13:e336881e0a3e 535 twosComplementConversion(Zlsb));
SDesign2018 12:bdf16bf682ec 536 wait(0.2);
SDesign2018 12:bdf16bf682ec 537
SDesign2018 12:bdf16bf682ec 538 break;
SDesign2018 17:0a8d151af3c6 539 case 102: // f: check register 0x08 and 0x09 for critical temperature
SDesign2018 17:0a8d151af3c6 540 char * critDatapointer;
SDesign2018 17:0a8d151af3c6 541 uint8_t CritMSB;
SDesign2018 17:0a8d151af3c6 542 uint8_t CritLSB;
SDesign2018 17:0a8d151af3c6 543 uint16_t CritData;
SDesign2018 17:0a8d151af3c6 544 critDatapointer = ADT7410Read(0x08);
SDesign2018 17:0a8d151af3c6 545
SDesign2018 17:0a8d151af3c6 546 CritMSB = *(critDatapointer + 0);
SDesign2018 17:0a8d151af3c6 547 CritLSB = *(critDatapointer + 1);
SDesign2018 17:0a8d151af3c6 548
SDesign2018 17:0a8d151af3c6 549 CritData = (CritMSB << 8) | CritLSB;
SDesign2018 17:0a8d151af3c6 550
SDesign2018 17:0a8d151af3c6 551 pc.printf("H: 0x%x | L: 0x%x | Data: 0x%x CritData\n\r", CritMSB, CritLSB, CritData);
SDesign2018 17:0a8d151af3c6 552 break;
SDesign2018 17:0a8d151af3c6 553 case 103: // g: set critical temperature to 30 celsius
SDesign2018 17:0a8d151af3c6 554 ADT7410Write(0x08, 0x01);
SDesign2018 17:0a8d151af3c6 555 ADT7410Write(0x09, 0x80);
SDesign2018 17:0a8d151af3c6 556 ADT7410Write(0x03, 0x08); // Turn INT HIGH, works for the interrupt pin
SDesign2018 17:0a8d151af3c6 557 break;
SDesign2018 17:0a8d151af3c6 558 case 104: // h: get count value
SDesign2018 17:0a8d151af3c6 559 pc.printf("Count Value: %d\n\r", counter);
SDesign2018 19:0799d6348449 560 for(int i = 0; i < sizeof(temperatureBuffer); ++i)
SDesign2018 19:0799d6348449 561 {
SDesign2018 19:0799d6348449 562 pc.printf("0x%x \n\r", temperatureBuffer[i]);
SDesign2018 19:0799d6348449 563 }
SDesign2018 17:0a8d151af3c6 564 break;
SDesign2018 4:b0ce6385d008 565 default:
SDesign2018 4:b0ce6385d008 566 printMenu();
SDesign2018 4:b0ce6385d008 567 break;
SDesign2018 4:b0ce6385d008 568 }
SDesign2018 4:b0ce6385d008 569 }
SDesign2018 4:b0ce6385d008 570
SDesign2018 4:b0ce6385d008 571 }
SDesign2018 4:b0ce6385d008 572
SDesign2018 4:b0ce6385d008 573 return 0;
SDesign2018 4:b0ce6385d008 574 }
SDesign2018 4:b0ce6385d008 575 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 576
SDesign2018 4:b0ce6385d008 577
SDesign2018 4:b0ce6385d008 578 /*******************************************************************************
SDesign2018 4:b0ce6385d008 579 *
SDesign2018 4:b0ce6385d008 580 * I2C function for the the ADXL372 accelerometer for a write sequence
SDesign2018 4:b0ce6385d008 581 * Param:
SDesign2018 4:b0ce6385d008 582 * hexAddress: Pass the hexadecimal value for what register you want
SDesign2018 4:b0ce6385d008 583 * hexData: Pass the hexadecimal value for what data you want to send
SDesign2018 4:b0ce6385d008 584 * i.e. hexadecimal represenatation of certain bits
SDesign2018 4:b0ce6385d008 585 * Returns:
SDesign2018 4:b0ce6385d008 586 * 1: Write was a complete success
SDesign2018 4:b0ce6385d008 587 * 2: Writing data to register failed
SDesign2018 4:b0ce6385d008 588 * 3: Writing to register Address failed
SDesign2018 4:b0ce6385d008 589 ******************************************************************************/
SDesign2018 4:b0ce6385d008 590 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 591 int accelerometerI2CWrite(int hexAddress, int hexData){
SDesign2018 4:b0ce6385d008 592 //--------- One full writing cycle for ADXL372 for X enable ------------------//
SDesign2018 4:b0ce6385d008 593 /* '0' - NAK was received
SDesign2018 4:b0ce6385d008 594 * '1' - ACK was received, <---- This good
SDesign2018 4:b0ce6385d008 595 * '2' - timeout
SDesign2018 4:b0ce6385d008 596 */
SDesign2018 4:b0ce6385d008 597 int flag;
SDesign2018 4:b0ce6385d008 598 int registerAddress = hexAddress;
SDesign2018 4:b0ce6385d008 599 int data = hexData;
SDesign2018 4:b0ce6385d008 600
SDesign2018 4:b0ce6385d008 601 ADXL372.start();
SDesign2018 4:b0ce6385d008 602 flag = ADXL372.write(ADXL372_Address_8bit);
SDesign2018 4:b0ce6385d008 603 if(flag == 1)
SDesign2018 4:b0ce6385d008 604 {
SDesign2018 11:dce6c1b255fd 605 //pc.printf("Write to I2C address success\n\r");
SDesign2018 4:b0ce6385d008 606 wait(0.1);
SDesign2018 4:b0ce6385d008 607 flag = ADXL372.write(registerAddress);
SDesign2018 4:b0ce6385d008 608 if(flag == 1)
SDesign2018 4:b0ce6385d008 609 {
SDesign2018 11:dce6c1b255fd 610 //pc.printf("Write to register 0x%x address success\n\r", registerAddress);
SDesign2018 4:b0ce6385d008 611 flag = ADXL372.write(data);
SDesign2018 4:b0ce6385d008 612 if(flag == 1)
SDesign2018 4:b0ce6385d008 613 {
SDesign2018 4:b0ce6385d008 614 pc.printf("Writing data 0x%x to register address success\n\r", data);
SDesign2018 4:b0ce6385d008 615 ADXL372.stop();
SDesign2018 4:b0ce6385d008 616 return 1;
SDesign2018 4:b0ce6385d008 617 }else {ADXL372.stop(); return 2;}
SDesign2018 4:b0ce6385d008 618 }else {ADXL372.stop(); return 3;}
SDesign2018 4:b0ce6385d008 619 }else ADXL372.stop();
SDesign2018 4:b0ce6385d008 620
SDesign2018 4:b0ce6385d008 621 return 0;
SDesign2018 4:b0ce6385d008 622 // ---------------- End of writing cycle --------------------------//
SDesign2018 4:b0ce6385d008 623 }
SDesign2018 4:b0ce6385d008 624 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 625
SDesign2018 4:b0ce6385d008 626
SDesign2018 4:b0ce6385d008 627 /*******************************************************************************
SDesign2018 4:b0ce6385d008 628 * I2C read sequence for the accelerometer
SDesign2018 4:b0ce6385d008 629 * Param:
SDesign2018 4:b0ce6385d008 630 * hexAddress: pass the hexadecimal representation of desired Register address
SDesign2018 4:b0ce6385d008 631 * Return:
SDesign2018 4:b0ce6385d008 632 * Char pointer to the array of read data.
SDesign2018 4:b0ce6385d008 633 *
SDesign2018 4:b0ce6385d008 634 * Right now it works only for the XData, YData, ZData because I wrote it to read
SDesign2018 4:b0ce6385d008 635 * 6 bytes(6 registers).
SDesign2018 4:b0ce6385d008 636 * Should change it to be 1 byte at a time
SDesign2018 4:b0ce6385d008 637 ******************************************************************************/
SDesign2018 4:b0ce6385d008 638 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 639 char * accelerometerI2CRead(int hexAddress){
SDesign2018 4:b0ce6385d008 640 char accelData[6];
SDesign2018 4:b0ce6385d008 641 char registerAddress[1];
SDesign2018 4:b0ce6385d008 642 registerAddress[0] = hexAddress;
SDesign2018 4:b0ce6385d008 643
SDesign2018 4:b0ce6385d008 644 // Perform mbed's way sending a start bit, then device address[r/~w], and then the register address
SDesign2018 4:b0ce6385d008 645 // Also if it succeeds, continue to the next operation
SDesign2018 4:b0ce6385d008 646 if(ADXL372.write(ADXL372_Address_8bit, registerAddress, 1) == 0){
SDesign2018 4:b0ce6385d008 647
SDesign2018 4:b0ce6385d008 648 // If previous sequence works, get 6 bytes into char array accelData
SDesign2018 4:b0ce6385d008 649 // Char array because it uses 1 byte(8bits)
SDesign2018 4:b0ce6385d008 650 // Should probably change it to uint8_t type
SDesign2018 4:b0ce6385d008 651 if(ADXL372.read(ADXL372_Address_8bit, accelData, 6) == 0){
SDesign2018 4:b0ce6385d008 652 return accelData;
SDesign2018 4:b0ce6385d008 653 }else pc.printf("Failed to read\n\r");
SDesign2018 4:b0ce6385d008 654 }else pc.printf("Failed to write\n\r");
SDesign2018 4:b0ce6385d008 655 return 0; // Only if it fails
SDesign2018 4:b0ce6385d008 656 }
SDesign2018 4:b0ce6385d008 657 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 658
SDesign2018 4:b0ce6385d008 659
SDesign2018 4:b0ce6385d008 660
SDesign2018 4:b0ce6385d008 661 /*******************************************************************************
SDesign2018 4:b0ce6385d008 662 * Initializes whatever settings you want for the accelerometer
SDesign2018 4:b0ce6385d008 663 * Can change it to use the previous I2C write function instead of all this mess
SDesign2018 4:b0ce6385d008 664 *
SDesign2018 4:b0ce6385d008 665 ******************************************************************************/
SDesign2018 4:b0ce6385d008 666 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 667 void ADXL372Initialize(void){
SDesign2018 14:454090793a35 668 accelerometerI2CWrite(0x3F, 0x0F); // Enable I2C highspeed,Low Pass, High pass and full bandwidth measurement mode
SDesign2018 17:0a8d151af3c6 669 accelerometerI2CWrite(0x38, 0x01); // Enable the High pass filter corner 1 at register 0x38
SDesign2018 13:e336881e0a3e 670 /* accelerometerI2CWrite(0x24, 0x01); // X used for activity threshold
SDesign2018 11:dce6c1b255fd 671 accelerometerI2CWrite(0x26, 0x01); // Y used for activity threshold
SDesign2018 13:e336881e0a3e 672 accelerometerI2CWrite(0x28, 0x01); // Z used for activity threshold */
SDesign2018 4:b0ce6385d008 673 }
SDesign2018 4:b0ce6385d008 674 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 675
SDesign2018 4:b0ce6385d008 676
SDesign2018 4:b0ce6385d008 677
SDesign2018 4:b0ce6385d008 678 /*******************************************************************************
SDesign2018 4:b0ce6385d008 679 * BitBangSPIWrite for ADXL372 if you wire it up as SPI
SDesign2018 4:b0ce6385d008 680 *
SDesign2018 4:b0ce6385d008 681 * Sends the 6-0bits of desired register with LSB of transmission bit R/!W
SDesign2018 4:b0ce6385d008 682 *
SDesign2018 4:b0ce6385d008 683 ******************************************************************************/
SDesign2018 4:b0ce6385d008 684 ///////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 685 void BitBangSPIWrite(const unsigned char regAddr, const unsigned char regData)
SDesign2018 4:b0ce6385d008 686 {
SDesign2018 4:b0ce6385d008 687 unsigned char SPICount; // Counter used to clock out the data
SDesign2018 4:b0ce6385d008 688
SDesign2018 4:b0ce6385d008 689 unsigned char SPIData; // Define a data structure for the SPI data
SDesign2018 4:b0ce6385d008 690 SPI_CS = 0; // Make sure we start with active-low CS high
SDesign2018 4:b0ce6385d008 691 SPI_CLK = 0; // and CK low
SDesign2018 4:b0ce6385d008 692
SDesign2018 4:b0ce6385d008 693 SPIData = regAddr; // Preload the data to be sent with Address
SDesign2018 4:b0ce6385d008 694 SPI_CS = 1; // Set active-low CS low to start the SPI cycle
SDesign2018 4:b0ce6385d008 695
SDesign2018 4:b0ce6385d008 696 for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address byte
SDesign2018 4:b0ce6385d008 697 {
SDesign2018 4:b0ce6385d008 698 if (SPIData & 0x80) // Check for a 1 at MSB
SDesign2018 4:b0ce6385d008 699 MOSI = 1; // and set the MOSI line appropriately
SDesign2018 4:b0ce6385d008 700 else
SDesign2018 4:b0ce6385d008 701 MOSI = 0;
SDesign2018 4:b0ce6385d008 702 SPI_CLK = 1; // Toggle the clock line
SDesign2018 4:b0ce6385d008 703 SPI_CLK = 0;
SDesign2018 4:b0ce6385d008 704 SPIData <<= 1; // Rotate to get the next bit
SDesign2018 4:b0ce6385d008 705 } // and loop back to send the next bit
SDesign2018 4:b0ce6385d008 706
SDesign2018 4:b0ce6385d008 707 // Repeat for the Data byte
SDesign2018 4:b0ce6385d008 708 SPIData = regData; // Preload the data to be sent with Data
SDesign2018 4:b0ce6385d008 709 for (SPICount = 0; SPICount < 8; SPICount++)
SDesign2018 4:b0ce6385d008 710 {
SDesign2018 4:b0ce6385d008 711 if (SPIData & 0x80)
SDesign2018 4:b0ce6385d008 712 MOSI = 1;
SDesign2018 4:b0ce6385d008 713 else
SDesign2018 4:b0ce6385d008 714 MOSI = 0;
SDesign2018 4:b0ce6385d008 715 SPI_CLK = 1;
SDesign2018 4:b0ce6385d008 716 SPI_CLK = 0;
SDesign2018 4:b0ce6385d008 717 SPIData <<= 1; // After each bit, move next bit one to left
SDesign2018 4:b0ce6385d008 718 }
SDesign2018 4:b0ce6385d008 719 SPI_CS = 0;
SDesign2018 4:b0ce6385d008 720 MOSI = 0;
SDesign2018 4:b0ce6385d008 721 }
SDesign2018 4:b0ce6385d008 722 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 723
SDesign2018 4:b0ce6385d008 724
SDesign2018 4:b0ce6385d008 725
SDesign2018 4:b0ce6385d008 726 /*******************************************************************************
SDesign2018 4:b0ce6385d008 727 * BitBangSPIRead for ADXL372 if you wire it up as SPI
SDesign2018 4:b0ce6385d008 728 *
SDesign2018 4:b0ce6385d008 729 *
SDesign2018 4:b0ce6385d008 730 *
SDesign2018 4:b0ce6385d008 731 ******************************************************************************/
SDesign2018 4:b0ce6385d008 732 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 5:c9ab5062cfc3 733 uint8_t BitBangSPIRead (uint8_t regAddr)
SDesign2018 4:b0ce6385d008 734 {
SDesign2018 4:b0ce6385d008 735
SDesign2018 4:b0ce6385d008 736 unsigned char SPICount; // Counter used to clock out the data
SDesign2018 4:b0ce6385d008 737
SDesign2018 5:c9ab5062cfc3 738 uint8_t SPIData;
SDesign2018 4:b0ce6385d008 739
SDesign2018 4:b0ce6385d008 740 SPI_CS = 0; // Make sure we start with active-low CS high
SDesign2018 4:b0ce6385d008 741 SPI_CLK = 0; // and CK low
SDesign2018 4:b0ce6385d008 742 SPIData = regAddr; // Preload the data to be sent with Address and Data
SDesign2018 4:b0ce6385d008 743
SDesign2018 4:b0ce6385d008 744 SPI_CS = 1; // Set active-low CS low to start the SPI cycle
SDesign2018 4:b0ce6385d008 745 for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address and Data
SDesign2018 4:b0ce6385d008 746 {
SDesign2018 4:b0ce6385d008 747 if (SPIData & 0x80)
SDesign2018 4:b0ce6385d008 748 MOSI = 1;
SDesign2018 4:b0ce6385d008 749 else
SDesign2018 4:b0ce6385d008 750 MOSI = 0;
SDesign2018 4:b0ce6385d008 751 SPI_CLK = 1;
SDesign2018 4:b0ce6385d008 752 SPI_CLK = 0;
SDesign2018 4:b0ce6385d008 753 SPIData <<= 1;
SDesign2018 4:b0ce6385d008 754 }// and loop back to send the next bit
SDesign2018 4:b0ce6385d008 755
SDesign2018 4:b0ce6385d008 756 MOSI = 0; // Reset the MOSI data line
SDesign2018 4:b0ce6385d008 757
SDesign2018 4:b0ce6385d008 758 SPIData = 0;
SDesign2018 4:b0ce6385d008 759 for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read
SDesign2018 4:b0ce6385d008 760 {
SDesign2018 4:b0ce6385d008 761 SPIData <<=1; // Rotate the data, keep previous bit value
SDesign2018 4:b0ce6385d008 762 SPI_CLK = 1; // Raise the clock to clock the data out of the MAX7456
SDesign2018 4:b0ce6385d008 763 SPIData += SPI_MISO; // Read the data one bit at a time, starting from MISO MSB
SDesign2018 4:b0ce6385d008 764 SPI_CLK = 0; // Drop the clock ready for the next bit
SDesign2018 4:b0ce6385d008 765 }// and loop back for next bit
SDesign2018 4:b0ce6385d008 766 SPI_CS = 0; // Raise CS
SDesign2018 4:b0ce6385d008 767
SDesign2018 5:c9ab5062cfc3 768 return ((uint8_t)SPIData); // Finally return the read data
SDesign2018 4:b0ce6385d008 769 }
SDesign2018 4:b0ce6385d008 770
SDesign2018 4:b0ce6385d008 771 /*******************************************************************************
SDesign2018 4:b0ce6385d008 772 * Not really used at the moment
SDesign2018 4:b0ce6385d008 773 * Not really needed. But keep just in case because I don't want to rewrite it
SDesign2018 4:b0ce6385d008 774 ******************************************************************************/
SDesign2018 4:b0ce6385d008 775 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 12:bdf16bf682ec 776 char twosComplementConversion(char value)
SDesign2018 4:b0ce6385d008 777 {
SDesign2018 4:b0ce6385d008 778 /*
SDesign2018 4:b0ce6385d008 779 * Go from bit 0 to bit 7 and invert them
SDesign2018 4:b0ce6385d008 780 * Then finally add 1
SDesign2018 4:b0ce6385d008 781 */
SDesign2018 4:b0ce6385d008 782 char mask = value & 0x80;
SDesign2018 4:b0ce6385d008 783 if(mask == 0x80){ // Check for sign
SDesign2018 4:b0ce6385d008 784 value = ~value + 1;
SDesign2018 4:b0ce6385d008 785 return value;
SDesign2018 4:b0ce6385d008 786 }
SDesign2018 4:b0ce6385d008 787 return value;
SDesign2018 4:b0ce6385d008 788 }
SDesign2018 4:b0ce6385d008 789 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 790
SDesign2018 4:b0ce6385d008 791
SDesign2018 4:b0ce6385d008 792 /*******************************************************************************
SDesign2018 4:b0ce6385d008 793 * Performs one byte write I2C protocol
SDesign2018 4:b0ce6385d008 794 * PARAM:
SDesign2018 4:b0ce6385d008 795 * registerAddress: register you want access to in device, one byte char hex format
SDesign2018 4:b0ce6385d008 796 * data: one byte data that you want to write to device register
SDesign2018 4:b0ce6385d008 797 * Return:
SDesign2018 4:b0ce6385d008 798 * 0: failure at writing i2c address
SDesign2018 4:b0ce6385d008 799 * 1: successful write
SDesign2018 4:b0ce6385d008 800 * 2: failure at writing data
SDesign2018 4:b0ce6385d008 801 * 3: failure at writing register address
SDesign2018 4:b0ce6385d008 802 ******************************************************************************/
SDesign2018 4:b0ce6385d008 803 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 804 int ADT7410Write(unsigned char registerAddress, unsigned char data){
SDesign2018 4:b0ce6385d008 805 int flag;
SDesign2018 4:b0ce6385d008 806 ADT7410.start();
SDesign2018 4:b0ce6385d008 807 flag = ADT7410.write(ADT7410_Address_8BIT);
SDesign2018 4:b0ce6385d008 808 if(flag == 1)
SDesign2018 4:b0ce6385d008 809 {
SDesign2018 4:b0ce6385d008 810 pc.printf("Write to I2C address success\n\r");
SDesign2018 4:b0ce6385d008 811 wait(0.1);
SDesign2018 4:b0ce6385d008 812 flag = ADT7410.write(registerAddress);
SDesign2018 4:b0ce6385d008 813 if(flag == 1)
SDesign2018 4:b0ce6385d008 814 {
SDesign2018 4:b0ce6385d008 815 pc.printf("Write to register 0x%x address success\n\r", registerAddress);
SDesign2018 4:b0ce6385d008 816 flag = ADT7410.write(data);
SDesign2018 4:b0ce6385d008 817 if(flag == 1)
SDesign2018 4:b0ce6385d008 818 {
SDesign2018 4:b0ce6385d008 819 pc.printf("Writing data 0x%x to register address success\n\r", data);
SDesign2018 4:b0ce6385d008 820 ADT7410.stop();
SDesign2018 4:b0ce6385d008 821 return 1;
SDesign2018 4:b0ce6385d008 822 }else {ADT7410.stop(); return 2;}
SDesign2018 4:b0ce6385d008 823 }else {ADT7410.stop(); return 3;}
SDesign2018 4:b0ce6385d008 824 }else ADT7410.stop();
SDesign2018 4:b0ce6385d008 825
SDesign2018 4:b0ce6385d008 826 return 0;
SDesign2018 4:b0ce6385d008 827 }
SDesign2018 4:b0ce6385d008 828 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 829
SDesign2018 4:b0ce6385d008 830 /*******************************************************************************
SDesign2018 4:b0ce6385d008 831 * I2C Read function for ADT7410 Temperature sensor
SDesign2018 4:b0ce6385d008 832 * Param:
SDesign2018 4:b0ce6385d008 833 * hex: hexadecimal representation for desired register
SDesign2018 4:b0ce6385d008 834 * Return:
SDesign2018 4:b0ce6385d008 835 * Char pointer to the array of data values.
SDesign2018 4:b0ce6385d008 836 * Could also change from a char pointer to a uint8_t pointer.
SDesign2018 4:b0ce6385d008 837 *
SDesign2018 4:b0ce6385d008 838 ******************************************************************************/
SDesign2018 4:b0ce6385d008 839 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 840 char * ADT7410Read(int hex){
SDesign2018 4:b0ce6385d008 841 //short int convertedVal;
SDesign2018 4:b0ce6385d008 842 char data[2] = {0, 0};
SDesign2018 4:b0ce6385d008 843 char cmd[1];
SDesign2018 4:b0ce6385d008 844 cmd[0] = hex;
SDesign2018 4:b0ce6385d008 845 //pc.printf("Register Addres is: %x \n\r", cmd[0]);
SDesign2018 4:b0ce6385d008 846 if(ADT7410.write(ADT7410_Address_8BIT, cmd,1) == 0){
SDesign2018 4:b0ce6385d008 847 if(ADT7410.read(ADT7410_Address_8BIT, data, 2) == 0){
SDesign2018 4:b0ce6385d008 848
SDesign2018 4:b0ce6385d008 849 return data;
SDesign2018 4:b0ce6385d008 850 //return (data[0] << 8 | data[1])>>3; // Explained here: https://stackoverflow.com/a/141576 SOOO GREAT
SDesign2018 4:b0ce6385d008 851
SDesign2018 4:b0ce6385d008 852 }else {pc.printf("Failed to read \n\r"); return data;}
SDesign2018 4:b0ce6385d008 853 }else {pc.printf("Failed to write \n\r"); return data;}
SDesign2018 4:b0ce6385d008 854
SDesign2018 4:b0ce6385d008 855 }
SDesign2018 4:b0ce6385d008 856 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 857
SDesign2018 4:b0ce6385d008 858
SDesign2018 4:b0ce6385d008 859 /*******************************************************************************
SDesign2018 4:b0ce6385d008 860 * ADXL372 reset function
SDesign2018 4:b0ce6385d008 861 * Resets all registers and settings back to default
SDesign2018 4:b0ce6385d008 862 * Basically the same as the previous ADXL372 I2C write function
SDesign2018 4:b0ce6385d008 863 *
SDesign2018 4:b0ce6385d008 864 ******************************************************************************/
SDesign2018 4:b0ce6385d008 865 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 4:b0ce6385d008 866 void ADXL372Reset(void){
SDesign2018 4:b0ce6385d008 867 int flag;
SDesign2018 4:b0ce6385d008 868 //--------- One full writing cycle for ADXL372 for Z Enable ------------------//
SDesign2018 4:b0ce6385d008 869 /* '0' - NAK was received
SDesign2018 4:b0ce6385d008 870 * '1' - ACK was received, <---- This good
SDesign2018 4:b0ce6385d008 871 * '2' - timeout
SDesign2018 4:b0ce6385d008 872 */
SDesign2018 4:b0ce6385d008 873 ADXL372.start();
SDesign2018 4:b0ce6385d008 874 flag = ADXL372.write(ADXL372_Address_8bit | 0);
SDesign2018 4:b0ce6385d008 875 if(flag == 1)
SDesign2018 4:b0ce6385d008 876 {
SDesign2018 4:b0ce6385d008 877 //pc.printf("Write to I2C address success\n\r");
SDesign2018 4:b0ce6385d008 878
SDesign2018 4:b0ce6385d008 879 flag = ADXL372.write(0x41);
SDesign2018 4:b0ce6385d008 880 if(flag == 1)
SDesign2018 4:b0ce6385d008 881 {
SDesign2018 4:b0ce6385d008 882 //pc.printf("Write to 0x41 register address success\n\r");
SDesign2018 4:b0ce6385d008 883 flag = ADXL372.write(0x52); // Set bit 0
SDesign2018 4:b0ce6385d008 884 if(flag == 1)
SDesign2018 4:b0ce6385d008 885 {
SDesign2018 4:b0ce6385d008 886 pc.printf("Everything has been reset\n\r");
SDesign2018 4:b0ce6385d008 887 ADXL372.stop();
SDesign2018 4:b0ce6385d008 888 }
SDesign2018 4:b0ce6385d008 889 }
SDesign2018 4:b0ce6385d008 890 }
SDesign2018 4:b0ce6385d008 891 else ADXL372.stop();
SDesign2018 4:b0ce6385d008 892 // ---------------- End of writing cycle --------------------------//
SDesign2018 4:b0ce6385d008 893 }
SDesign2018 4:b0ce6385d008 894 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 6:3b41238872a8 895
SDesign2018 10:db20118b7d32 896 /*
SDesign2018 10:db20118b7d32 897 *
SDesign2018 10:db20118b7d32 898 * Self-test to see if the accelerometer is working as intended
SDesign2018 10:db20118b7d32 899 * Wait 300 ms.
SDesign2018 10:db20118b7d32 900 * Check bit 2 for a 1 for success. Bit 1 for completion of self-test.
SDesign2018 10:db20118b7d32 901 * Returns whole register
SDesign2018 10:db20118b7d32 902 */
SDesign2018 10:db20118b7d32 903 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 10:db20118b7d32 904 void I2CSelfTest(void){
SDesign2018 10:db20118b7d32 905 char *result;
SDesign2018 10:db20118b7d32 906 uint8_t check;
SDesign2018 10:db20118b7d32 907 accelerometerI2CWrite(0x3F, 0x03);
SDesign2018 10:db20118b7d32 908 accelerometerI2CWrite(0x40, 0x01);
SDesign2018 10:db20118b7d32 909 wait(0.3);
SDesign2018 10:db20118b7d32 910 result = accelerometerI2CRead(0x40);
SDesign2018 10:db20118b7d32 911 check = result[0];
SDesign2018 10:db20118b7d32 912 if(check & 0x04){
SDesign2018 10:db20118b7d32 913 pc.printf("Passed\n\r");
SDesign2018 10:db20118b7d32 914 }else {pc.printf("FAILED\n\r");}
SDesign2018 10:db20118b7d32 915 }
SDesign2018 17:0a8d151af3c6 916 ////////////////////////////////////////////////////////////////////////////////g
SDesign2018 10:db20118b7d32 917
SDesign2018 6:3b41238872a8 918 // Used to clear serial buffer in beginning
SDesign2018 6:3b41238872a8 919 ////////////////////////////////////////////////////////////////////////////////
SDesign2018 6:3b41238872a8 920 void flushSerialBuffer(void) { char char1 = 0; while (pc.readable()) { char1 = pc.getc(); } return; }