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