1 /*
2 * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
3 * Copyright (c) 2014 Intel Corporation.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 #include <iostream>
26 #include <unistd.h>
27 #include <stdlib.h>
28 #include <stdexcept>
29
30 #include "max31723.h"
31
32 using namespace upm;
33
MAX31723(int csn)34 MAX31723::MAX31723 (int csn) : m_csnPinCtx(csn), m_spi(0) {
35 mraa::Result error = mraa::SUCCESS;
36 m_name = "MAX31723";
37
38 error = m_csnPinCtx.dir (mraa::DIR_OUT);
39 if (error != mraa::SUCCESS) {
40 throw std::invalid_argument(std::string(__FUNCTION__) +
41 ": m_csnPinCtx.dir() failed");
42 }
43
44 CSOff ();
45
46 // set spi mode to mode2 (CPOL = 1, CPHA = 0)
47 m_spi.mode (mraa::SPI_MODE2);
48 // set ontinuously perform temperature conversions
49 writeRegister (R_STS_WRITE_CMD, B_CONT_READING);
50 }
51
52 short
getTemperature()53 MAX31723::getTemperature () {
54 uint8_t lsb = 0;
55 uint8_t msb = 0;
56 short temperature = 0;
57
58 lsb = readRegister (R_TEMPERATURE_LSB);
59 msb = readRegister (R_TEMPERATURE_MSB);
60
61 if ((msb & 0x80) != 0) {
62 msb &= 0x7F;
63 temperature = 0 - msb;
64
65 } else {
66 temperature = msb;
67 }
68
69 return temperature;
70 }
71
72 /*
73 * **************
74 * private area
75 * **************
76 */
77
78 uint8_t
readRegister(uint8_t reg)79 MAX31723::readRegister (uint8_t reg) {
80 uint8_t data[2] = { 0x00, 0x00 };
81 uint8_t* sensorData = NULL;
82
83 CSOn ();
84 data[0] = reg;
85 sensorData = m_spi.write(data, 2);
86 CSOff ();
87
88 return sensorData[1];
89 }
90
91 void
writeRegister(uint8_t reg,uint8_t data)92 MAX31723::writeRegister (uint8_t reg, uint8_t data) {
93 uint8_t buffer[2] = { 0x00, 0x00 };
94 uint8_t* sensorData = NULL;
95
96 CSOn ();
97 buffer[0] = reg;
98 buffer[1] = data;
99 sensorData = m_spi.write(buffer, 2);
100 CSOff ();
101 }
102
103 mraa::Result
CSOn()104 MAX31723::CSOn () {
105 return m_csnPinCtx.write (HIGH);
106 }
107
108 mraa::Result
CSOff()109 MAX31723::CSOff () {
110 return m_csnPinCtx.write (LOW);
111 }
112