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.
Fork of AS3935 by
AS3935.cpp@1:f2d9ed33c276, 2015-06-11 (annotated)
- Committer:
- ftagius
- Date:
- Thu Jun 11 15:47:29 2015 +0000
- Revision:
- 1:f2d9ed33c276
- Parent:
- 0:346c723cac97
- Child:
- 2:3b3b435ca8d9
Convert AS3935 library to SPI
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| casper | 0:346c723cac97 | 1 | /* |
| casper | 0:346c723cac97 | 2 | AS3935.cpp - AS3935 Franklin Lightning Sensor™ IC by AMS library |
| casper | 0:346c723cac97 | 3 | Copyright (c) 2012 Raivis Rengelis (raivis [at] rrkb.lv). All rights reserved. |
| casper | 0:346c723cac97 | 4 | Porté sur MBED par Valentin, version I2C |
| casper | 0:346c723cac97 | 5 | |
| casper | 0:346c723cac97 | 6 | This library is free software; you can redistribute it and/or |
| casper | 0:346c723cac97 | 7 | modify it under the terms of the GNU Lesser General Public |
| casper | 0:346c723cac97 | 8 | License as published by the Free Software Foundation; either |
| casper | 0:346c723cac97 | 9 | version 3 of the License, or (at your option) any later version. |
| casper | 0:346c723cac97 | 10 | |
| casper | 0:346c723cac97 | 11 | This library is distributed in the hope that it will be useful, |
| casper | 0:346c723cac97 | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| casper | 0:346c723cac97 | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| casper | 0:346c723cac97 | 14 | Lesser General Public License for more details. |
| casper | 0:346c723cac97 | 15 | |
| casper | 0:346c723cac97 | 16 | You should have received a copy of the GNU Lesser General Public |
| casper | 0:346c723cac97 | 17 | License along with this library; if not, write to the Free Software |
| casper | 0:346c723cac97 | 18 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
| casper | 0:346c723cac97 | 19 | */ |
| casper | 0:346c723cac97 | 20 | |
| ftagius | 1:f2d9ed33c276 | 21 | #include "AS3935.h" |
| ftagius | 1:f2d9ed33c276 | 22 | #include "pinmap.h" |
| casper | 0:346c723cac97 | 23 | |
| ftagius | 1:f2d9ed33c276 | 24 | #if 0 |
| ftagius | 1:f2d9ed33c276 | 25 | AS3935::AS3935(PinName sda, PinName scl, int adress, int hz): i2c(sda, scl), _adress(adress), m_FREQ(hz) { |
| ftagius | 1:f2d9ed33c276 | 26 | |
| casper | 0:346c723cac97 | 27 | wait_ms(11); |
| ftagius | 1:f2d9ed33c276 | 28 | //Configure the SPI bus |
| ftagius | 1:f2d9ed33c276 | 29 | m_Spi.format(8, 1); |
| ftagius | 1:f2d9ed33c276 | 30 | } |
| casper | 0:346c723cac97 | 31 | //~AS3935(){ |
| casper | 0:346c723cac97 | 32 | |
| casper | 0:346c723cac97 | 33 | //} |
| ftagius | 1:f2d9ed33c276 | 34 | #endif |
| ftagius | 1:f2d9ed33c276 | 35 | #if 1 |
| ftagius | 1:f2d9ed33c276 | 36 | AS3935::AS3935(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name, PinName cd, int hz) : m_Spi(mosi, miso, sclk), m_Cs(cs, 1), m_Cd(cd), m_FREQ(hz) |
| ftagius | 1:f2d9ed33c276 | 37 | { |
| ftagius | 1:f2d9ed33c276 | 38 | |
| ftagius | 1:f2d9ed33c276 | 39 | //Enable the internal pull-up resistor on MISO |
| ftagius | 1:f2d9ed33c276 | 40 | pin_mode(miso, PullUp); |
| ftagius | 1:f2d9ed33c276 | 41 | |
| ftagius | 1:f2d9ed33c276 | 42 | //Configure the SPI bus |
| ftagius | 1:f2d9ed33c276 | 43 | m_Spi.format(8, 1); |
| ftagius | 1:f2d9ed33c276 | 44 | } |
| ftagius | 1:f2d9ed33c276 | 45 | #endif |
| ftagius | 1:f2d9ed33c276 | 46 | |
| ftagius | 1:f2d9ed33c276 | 47 | |
| ftagius | 1:f2d9ed33c276 | 48 | char AS3935::_SPITransfer2(char high, char low) |
| ftagius | 1:f2d9ed33c276 | 49 | { |
| ftagius | 1:f2d9ed33c276 | 50 | m_Cs = 0; |
| ftagius | 1:f2d9ed33c276 | 51 | m_Spi.write(high); |
| ftagius | 1:f2d9ed33c276 | 52 | char regval = m_Spi.write(low); |
| ftagius | 1:f2d9ed33c276 | 53 | // printf("raw transfer for reg %x is 0x%02x\r\n", high, regval); |
| ftagius | 1:f2d9ed33c276 | 54 | m_Cs = 1; |
| ftagius | 1:f2d9ed33c276 | 55 | return regval; |
| ftagius | 1:f2d9ed33c276 | 56 | } |
| ftagius | 1:f2d9ed33c276 | 57 | |
| casper | 0:346c723cac97 | 58 | char AS3935::_rawRegisterRead(char reg) |
| casper | 0:346c723cac97 | 59 | { |
| ftagius | 1:f2d9ed33c276 | 60 | return _SPITransfer2((reg & 0x3F) | 0x40, 0); |
| casper | 0:346c723cac97 | 61 | } |
| casper | 0:346c723cac97 | 62 | |
| ftagius | 1:f2d9ed33c276 | 63 | |
| casper | 0:346c723cac97 | 64 | char AS3935::_ffsz(char mask) |
| casper | 0:346c723cac97 | 65 | { |
| casper | 0:346c723cac97 | 66 | char i = 0; |
| casper | 0:346c723cac97 | 67 | //char temp; |
| casper | 0:346c723cac97 | 68 | |
| casper | 0:346c723cac97 | 69 | while(!(mask & 1)) { |
| casper | 0:346c723cac97 | 70 | //if (!(mask & 1)) { |
| casper | 0:346c723cac97 | 71 | mask >>= 1; |
| casper | 0:346c723cac97 | 72 | i++; |
| casper | 0:346c723cac97 | 73 | //} |
| casper | 0:346c723cac97 | 74 | } |
| casper | 0:346c723cac97 | 75 | //if (mask){ |
| casper | 0:346c723cac97 | 76 | // for (i = 1; ~mask & 1 ; i++) { |
| casper | 0:346c723cac97 | 77 | // mask >>= 1; |
| casper | 0:346c723cac97 | 78 | // } |
| casper | 0:346c723cac97 | 79 | // } |
| casper | 0:346c723cac97 | 80 | return i; |
| casper | 0:346c723cac97 | 81 | } |
| casper | 0:346c723cac97 | 82 | |
| casper | 0:346c723cac97 | 83 | void AS3935::registerWrite(char reg, char mask, char data) |
| casper | 0:346c723cac97 | 84 | { |
| ftagius | 1:f2d9ed33c276 | 85 | |
| casper | 0:346c723cac97 | 86 | char regval; |
| casper | 0:346c723cac97 | 87 | regval = _rawRegisterRead(reg); |
| casper | 0:346c723cac97 | 88 | regval &= ~(mask); |
| casper | 0:346c723cac97 | 89 | //if (mask){ |
| casper | 0:346c723cac97 | 90 | regval |= (data << (_ffsz(mask))); |
| casper | 0:346c723cac97 | 91 | // } |
| casper | 0:346c723cac97 | 92 | //else { |
| casper | 0:346c723cac97 | 93 | // regval |= data; |
| casper | 0:346c723cac97 | 94 | // } |
| ftagius | 1:f2d9ed33c276 | 95 | |
| ftagius | 1:f2d9ed33c276 | 96 | m_Cs = 0; |
| ftagius | 1:f2d9ed33c276 | 97 | m_Spi.write(reg); |
| ftagius | 1:f2d9ed33c276 | 98 | m_Spi.write(regval); |
| ftagius | 1:f2d9ed33c276 | 99 | //printf("raw transfer for reg %x is 0x%02x\r\n", high, regval); |
| ftagius | 1:f2d9ed33c276 | 100 | m_Cs = 1; |
| ftagius | 1:f2d9ed33c276 | 101 | wait_ms(2); |
| casper | 0:346c723cac97 | 102 | } |
| casper | 0:346c723cac97 | 103 | |
| casper | 0:346c723cac97 | 104 | char AS3935::registerRead(char reg, char mask) |
| ftagius | 1:f2d9ed33c276 | 105 | { |
| casper | 0:346c723cac97 | 106 | char regval; |
| casper | 0:346c723cac97 | 107 | regval = _rawRegisterRead(reg); |
| ftagius | 1:f2d9ed33c276 | 108 | // printf("raw regval is 0x%02x\r\n", regval); |
| casper | 0:346c723cac97 | 109 | regval = regval & mask; |
| ftagius | 1:f2d9ed33c276 | 110 | regval >>= (_ffsz(mask)); |
| casper | 0:346c723cac97 | 111 | return regval; |
| casper | 0:346c723cac97 | 112 | } |
| casper | 0:346c723cac97 | 113 | |
| casper | 0:346c723cac97 | 114 | void AS3935::reset() |
| ftagius | 1:f2d9ed33c276 | 115 | { |
| ftagius | 1:f2d9ed33c276 | 116 | m_Cs = 0; |
| ftagius | 1:f2d9ed33c276 | 117 | m_Spi.write(0x3D); |
| ftagius | 1:f2d9ed33c276 | 118 | m_Spi.write(0x96); |
| ftagius | 1:f2d9ed33c276 | 119 | m_Cs = 1; |
| casper | 0:346c723cac97 | 120 | wait_ms(2); |
| ftagius | 1:f2d9ed33c276 | 121 | } |
| casper | 0:346c723cac97 | 122 | |
| casper | 0:346c723cac97 | 123 | void AS3935::powerDown() |
| ftagius | 1:f2d9ed33c276 | 124 | { |
| casper | 0:346c723cac97 | 125 | registerWrite(AS3935_PWD,1); |
| ftagius | 1:f2d9ed33c276 | 126 | } |
| casper | 0:346c723cac97 | 127 | |
| casper | 0:346c723cac97 | 128 | void AS3935::powerUp() |
| ftagius | 1:f2d9ed33c276 | 129 | { |
| ftagius | 1:f2d9ed33c276 | 130 | |
| casper | 0:346c723cac97 | 131 | registerWrite(AS3935_PWD,0); |
| ftagius | 1:f2d9ed33c276 | 132 | m_Cs = 0; |
| ftagius | 1:f2d9ed33c276 | 133 | m_Spi.write(0x3D); |
| ftagius | 1:f2d9ed33c276 | 134 | m_Spi.write(0x96); |
| ftagius | 1:f2d9ed33c276 | 135 | m_Cs = 1; |
| casper | 0:346c723cac97 | 136 | wait_ms(3); |
| casper | 0:346c723cac97 | 137 | registerWrite(AS3935_DISP_TRCO,1); |
| casper | 0:346c723cac97 | 138 | wait_ms(2); |
| casper | 0:346c723cac97 | 139 | registerWrite(AS3935_DISP_TRCO,0); |
| ftagius | 1:f2d9ed33c276 | 140 | } |
| casper | 0:346c723cac97 | 141 | |
| casper | 0:346c723cac97 | 142 | int AS3935::interruptSource() |
| casper | 0:346c723cac97 | 143 | { |
| casper | 0:346c723cac97 | 144 | return registerRead(AS3935_INT); |
| casper | 0:346c723cac97 | 145 | } |
| casper | 0:346c723cac97 | 146 | |
| casper | 0:346c723cac97 | 147 | void AS3935::disableDisturbers() |
| casper | 0:346c723cac97 | 148 | { |
| casper | 0:346c723cac97 | 149 | registerWrite(AS3935_MASK_DIST,1); |
| casper | 0:346c723cac97 | 150 | } |
| casper | 0:346c723cac97 | 151 | |
| casper | 0:346c723cac97 | 152 | void AS3935::enableDisturbers() |
| casper | 0:346c723cac97 | 153 | { |
| casper | 0:346c723cac97 | 154 | registerWrite(AS3935_MASK_DIST,0); |
| casper | 0:346c723cac97 | 155 | } |
| casper | 0:346c723cac97 | 156 | |
| casper | 0:346c723cac97 | 157 | int AS3935::getMinimumLightnings() |
| casper | 0:346c723cac97 | 158 | { |
| casper | 0:346c723cac97 | 159 | return registerRead(AS3935_MIN_NUM_LIGH); |
| casper | 0:346c723cac97 | 160 | } |
| casper | 0:346c723cac97 | 161 | |
| casper | 0:346c723cac97 | 162 | int AS3935::setMinimumLightnings(int minlightning) |
| casper | 0:346c723cac97 | 163 | { |
| casper | 0:346c723cac97 | 164 | registerWrite(AS3935_MIN_NUM_LIGH,minlightning); |
| casper | 0:346c723cac97 | 165 | return getMinimumLightnings(); |
| casper | 0:346c723cac97 | 166 | } |
| casper | 0:346c723cac97 | 167 | |
| casper | 0:346c723cac97 | 168 | int AS3935::lightningDistanceKm() |
| casper | 0:346c723cac97 | 169 | { |
| casper | 0:346c723cac97 | 170 | return registerRead(AS3935_DISTANCE); |
| casper | 0:346c723cac97 | 171 | } |
| casper | 0:346c723cac97 | 172 | |
| casper | 0:346c723cac97 | 173 | void AS3935::setIndoors() |
| casper | 0:346c723cac97 | 174 | { |
| casper | 0:346c723cac97 | 175 | registerWrite(AS3935_AFE_GB,AS3935_AFE_INDOOR); |
| casper | 0:346c723cac97 | 176 | } |
| casper | 0:346c723cac97 | 177 | |
| casper | 0:346c723cac97 | 178 | void AS3935::setOutdoors() |
| casper | 0:346c723cac97 | 179 | { |
| casper | 0:346c723cac97 | 180 | registerWrite(AS3935_AFE_GB,AS3935_AFE_OUTDOOR); |
| casper | 0:346c723cac97 | 181 | } |
| casper | 0:346c723cac97 | 182 | |
| casper | 0:346c723cac97 | 183 | int AS3935::getNoiseFloor() |
| casper | 0:346c723cac97 | 184 | { |
| casper | 0:346c723cac97 | 185 | return registerRead(AS3935_NF_LEV); |
| casper | 0:346c723cac97 | 186 | } |
| casper | 0:346c723cac97 | 187 | |
| casper | 0:346c723cac97 | 188 | int AS3935::setNoiseFloor(int noisefloor) |
| casper | 0:346c723cac97 | 189 | { |
| casper | 0:346c723cac97 | 190 | registerWrite(AS3935_NF_LEV,noisefloor); |
| casper | 0:346c723cac97 | 191 | return getNoiseFloor(); |
| casper | 0:346c723cac97 | 192 | } |
| casper | 0:346c723cac97 | 193 | |
| casper | 0:346c723cac97 | 194 | int AS3935::getSpikeRejection() |
| casper | 0:346c723cac97 | 195 | { |
| casper | 0:346c723cac97 | 196 | return registerRead(AS3935_SREJ); |
| casper | 0:346c723cac97 | 197 | } |
| casper | 0:346c723cac97 | 198 | |
| casper | 0:346c723cac97 | 199 | int AS3935::setSpikeRejection(int srej) |
| casper | 0:346c723cac97 | 200 | { |
| casper | 0:346c723cac97 | 201 | registerWrite(AS3935_SREJ, srej); |
| casper | 0:346c723cac97 | 202 | return getSpikeRejection(); |
| casper | 0:346c723cac97 | 203 | } |
| casper | 0:346c723cac97 | 204 | |
| casper | 0:346c723cac97 | 205 | int AS3935::getWatchdogThreshold() |
| casper | 0:346c723cac97 | 206 | { |
| casper | 0:346c723cac97 | 207 | return registerRead(AS3935_WDTH); |
| casper | 0:346c723cac97 | 208 | } |
| casper | 0:346c723cac97 | 209 | |
| casper | 0:346c723cac97 | 210 | int AS3935::setWatchdogThreshold(int wdth) |
| casper | 0:346c723cac97 | 211 | { |
| casper | 0:346c723cac97 | 212 | registerWrite(AS3935_WDTH,wdth); |
| casper | 0:346c723cac97 | 213 | return getWatchdogThreshold(); |
| casper | 0:346c723cac97 | 214 | } |
| casper | 0:346c723cac97 | 215 | |
| casper | 0:346c723cac97 | 216 | int AS3935::getTuneCap() |
| casper | 0:346c723cac97 | 217 | { |
| casper | 0:346c723cac97 | 218 | return registerRead(AS3935_TUN_CAP); |
| casper | 0:346c723cac97 | 219 | } |
| casper | 0:346c723cac97 | 220 | |
| casper | 0:346c723cac97 | 221 | int AS3935::setTuneCap(int cap) |
| casper | 0:346c723cac97 | 222 | { |
| casper | 0:346c723cac97 | 223 | registerWrite(AS3935_TUN_CAP,cap); |
| casper | 0:346c723cac97 | 224 | return getTuneCap(); |
| casper | 0:346c723cac97 | 225 | } |
| casper | 0:346c723cac97 | 226 | |
| casper | 0:346c723cac97 | 227 | void AS3935::clearStats() |
| casper | 0:346c723cac97 | 228 | { |
| casper | 0:346c723cac97 | 229 | registerWrite(AS3935_CL_STAT,1); |
| casper | 0:346c723cac97 | 230 | registerWrite(AS3935_CL_STAT,0); |
| casper | 0:346c723cac97 | 231 | registerWrite(AS3935_CL_STAT,1); |
| casper | 0:346c723cac97 | 232 | } |
