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