SCP1000 library with Software SPI interface

Committer:
yamaguch
Date:
Tue Dec 27 06:44:37 2011 +0000
Revision:
0:65eccd24c242
0.9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:65eccd24c242 1 /*
yamaguch 0:65eccd24c242 2 Copyright (c) 2011, Senio Networks, Inc.
yamaguch 0:65eccd24c242 3
yamaguch 0:65eccd24c242 4 Permission is hereby granted, free of charge, to any person obtaining a copy
yamaguch 0:65eccd24c242 5 of this software and associated documentation files (the "Software"), to deal
yamaguch 0:65eccd24c242 6 in the Software without restriction, including without limitation the rights
yamaguch 0:65eccd24c242 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
yamaguch 0:65eccd24c242 8 copies of the Software, and to permit persons to whom the Software is
yamaguch 0:65eccd24c242 9 furnished to do so, subject to the following conditions:
yamaguch 0:65eccd24c242 10
yamaguch 0:65eccd24c242 11 The above copyright notice and this permission notice shall be included in
yamaguch 0:65eccd24c242 12 all copies or substantial portions of the Software.
yamaguch 0:65eccd24c242 13
yamaguch 0:65eccd24c242 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
yamaguch 0:65eccd24c242 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
yamaguch 0:65eccd24c242 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
yamaguch 0:65eccd24c242 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
yamaguch 0:65eccd24c242 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
yamaguch 0:65eccd24c242 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
yamaguch 0:65eccd24c242 20 THE SOFTWARE.
yamaguch 0:65eccd24c242 21 */
yamaguch 0:65eccd24c242 22
yamaguch 0:65eccd24c242 23 #include "SCP1000.h"
yamaguch 0:65eccd24c242 24
yamaguch 0:65eccd24c242 25 SCP1000::SCP1000(PinName mosi, PinName miso, PinName sclk, PinName cs, OperationMode mode)
yamaguch 0:65eccd24c242 26 : spi(mosi, miso, sclk), selectPin(cs) {
yamaguch 0:65eccd24c242 27 selectPin = 1;
yamaguch 0:65eccd24c242 28 spi.frequency(500000);
yamaguch 0:65eccd24c242 29 spi.format(8, 0); // frame bits = 8, mode = 0
yamaguch 0:65eccd24c242 30 reset();
yamaguch 0:65eccd24c242 31 setOperationMode(mode);
yamaguch 0:65eccd24c242 32 }
yamaguch 0:65eccd24c242 33
yamaguch 0:65eccd24c242 34 int SCP1000::revision() {
yamaguch 0:65eccd24c242 35 return readRegister(REVID);
yamaguch 0:65eccd24c242 36 }
yamaguch 0:65eccd24c242 37
yamaguch 0:65eccd24c242 38 bool SCP1000::isReady() {
yamaguch 0:65eccd24c242 39 const char DRDY = 0x20; // Data Ready
yamaguch 0:65eccd24c242 40
yamaguch 0:65eccd24c242 41 return readRegister(STATUS) & DRDY;
yamaguch 0:65eccd24c242 42 }
yamaguch 0:65eccd24c242 43
yamaguch 0:65eccd24c242 44 void SCP1000::setOperationMode(OperationMode mode) {
yamaguch 0:65eccd24c242 45 writeRegister(OPERATION, CANCEL);
yamaguch 0:65eccd24c242 46 while (readRegister(OPSTATUS)) // wait until current operation is canncelled
yamaguch 0:65eccd24c242 47 wait(0.01);
yamaguch 0:65eccd24c242 48 if (mode != CANCEL)
yamaguch 0:65eccd24c242 49 writeRegister(OPERATION, mode);
yamaguch 0:65eccd24c242 50 }
yamaguch 0:65eccd24c242 51
yamaguch 0:65eccd24c242 52 void SCP1000::reset() {
yamaguch 0:65eccd24c242 53 writeRegister(RSTR, 0x01);
yamaguch 0:65eccd24c242 54 wait(0.15);
yamaguch 0:65eccd24c242 55 }
yamaguch 0:65eccd24c242 56
yamaguch 0:65eccd24c242 57 bool SCP1000::performSelfTest() {
yamaguch 0:65eccd24c242 58 setOperationMode(SELF_TEST);
yamaguch 0:65eccd24c242 59 wait(1); // wait enough time for the test to completes (> 0.25secs)
yamaguch 0:65eccd24c242 60 return readRegister(DATARD8) & 1;
yamaguch 0:65eccd24c242 61 }
yamaguch 0:65eccd24c242 62
yamaguch 0:65eccd24c242 63 float SCP1000::readPressure(bool waitForReady) {
yamaguch 0:65eccd24c242 64 if (waitForReady)
yamaguch 0:65eccd24c242 65 while (!isReady())
yamaguch 0:65eccd24c242 66 wait(0.01);
yamaguch 0:65eccd24c242 67
yamaguch 0:65eccd24c242 68 // Pressure value is stored in 19-bit unsigned int (unit: 0.25 Pa)
yamaguch 0:65eccd24c242 69 long value = readRegister(DATARD8) & 0x07;
yamaguch 0:65eccd24c242 70 value <<= 16;
yamaguch 0:65eccd24c242 71 value |= readRegister(DATARD16, true) & 0xFFFF;
yamaguch 0:65eccd24c242 72
yamaguch 0:65eccd24c242 73 return value / 400.0;
yamaguch 0:65eccd24c242 74 }
yamaguch 0:65eccd24c242 75
yamaguch 0:65eccd24c242 76 float SCP1000::readTemperature(bool waitForDataReady) {
yamaguch 0:65eccd24c242 77 if (waitForDataReady)
yamaguch 0:65eccd24c242 78 while (!isReady())
yamaguch 0:65eccd24c242 79 wait(0.01);
yamaguch 0:65eccd24c242 80
yamaguch 0:65eccd24c242 81 return ((short)(readRegister(TEMPOUT, true) << 3) >> 3) / 20.0;
yamaguch 0:65eccd24c242 82 }
yamaguch 0:65eccd24c242 83
yamaguch 0:65eccd24c242 84 int SCP1000::readRegister(RegisterName registerName, bool twoBytes) {
yamaguch 0:65eccd24c242 85 selectPin = 0;
yamaguch 0:65eccd24c242 86 spi.write((registerName << 2) | READ);
yamaguch 0:65eccd24c242 87 int result = spi.write(0x00);
yamaguch 0:65eccd24c242 88 if (twoBytes) {
yamaguch 0:65eccd24c242 89 result <<= 8;
yamaguch 0:65eccd24c242 90 result |= spi.write(0x00);
yamaguch 0:65eccd24c242 91 }
yamaguch 0:65eccd24c242 92 selectPin = 1;
yamaguch 0:65eccd24c242 93
yamaguch 0:65eccd24c242 94 return result;
yamaguch 0:65eccd24c242 95 }
yamaguch 0:65eccd24c242 96
yamaguch 0:65eccd24c242 97 void SCP1000::writeRegister(RegisterName registerName, char value) {
yamaguch 0:65eccd24c242 98 selectPin = 0;
yamaguch 0:65eccd24c242 99 spi.write((registerName << 2) | WRITE);
yamaguch 0:65eccd24c242 100 spi.write(value);
yamaguch 0:65eccd24c242 101 selectPin = 1;
yamaguch 0:65eccd24c242 102 }