Maxim Integrated / Mbed 2 deprecated MAX31856_example_program

Dependencies:   MAX31856 mbed

Fork of MAX31856_example_program by Central Applications - Mbed Code repo

Committer:
DevinAlexander
Date:
Wed Jul 26 17:03:59 2017 +0000
Revision:
1:b58719a76fc3
Parent:
0:456e9e702d57
Child:
2:296485923589
Progress as of 7/26/17 still getting no communications from the spi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DevinAlexander 0:456e9e702d57 1 #include <mbed.h>
DevinAlexander 0:456e9e702d57 2 #include "MAX31856.h"
DevinAlexander 0:456e9e702d57 3
DevinAlexander 0:456e9e702d57 4 #define LOG(args...) printf(args)
DevinAlexander 0:456e9e702d57 5
DevinAlexander 1:b58719a76fc3 6 MAX31856::MAX31856(SPI& _spi, PinName _ncs, uint8_t _type, uint8_t _fltr, uint8_t _samples, uint8_t _conversion_mode) : spi(_spi), ncs(_ncs), samples(_samples) { //, setThermocoupleType(_type), setEmiFilterFreq(_fltr)
DevinAlexander 1:b58719a76fc3 7 spi.format(8,3);
DevinAlexander 0:456e9e702d57 8 setThermocoupleType(_type);
DevinAlexander 0:456e9e702d57 9 setEmiFilterFreq(_fltr);
DevinAlexander 1:b58719a76fc3 10 setNumSamplesAvg(_samples);
DevinAlexander 1:b58719a76fc3 11 setConversionMode(_conversion_mode);
DevinAlexander 0:456e9e702d57 12 }
DevinAlexander 0:456e9e702d57 13
DevinAlexander 0:456e9e702d57 14 float MAX31856::readTC()
DevinAlexander 0:456e9e702d57 15 {
DevinAlexander 0:456e9e702d57 16 int32_t temp;
DevinAlexander 1:b58719a76fc3 17 uint8_t buf_read[3], buf_write[3]={ADDRESS_LTCBH_READ,ADDRESS_LTCBM_READ,ADDRESS_LTCBL_READ};
DevinAlexander 1:b58719a76fc3 18
DevinAlexander 1:b58719a76fc3 19 // uint32_t time = us_ticker_read();
DevinAlexander 1:b58719a76fc3 20 // uint32_t duration = time - lastReadTime;
DevinAlexander 1:b58719a76fc3 21 // if (duration > 200000) { // more than 250ms
DevinAlexander 1:b58719a76fc3 22 /* for(int i=0; i<3; i++) {
DevinAlexander 1:b58719a76fc3 23 spiEnable();
DevinAlexander 1:b58719a76fc3 24 buf_read[i]=spi.write(buf_write[i]);
DevinAlexander 1:b58719a76fc3 25 buf_read[i]=spi.write(buf_write[i]);
DevinAlexander 1:b58719a76fc3 26 spiDisable();
DevinAlexander 1:b58719a76fc3 27 }
DevinAlexander 1:b58719a76fc3 28 */
DevinAlexander 0:456e9e702d57 29
DevinAlexander 0:456e9e702d57 30 spiEnable();
DevinAlexander 1:b58719a76fc3 31 buf_read[0]=spi.write(0x0C);
DevinAlexander 1:b58719a76fc3 32 buf_read[0]=spi.write(0x0C);
DevinAlexander 1:b58719a76fc3 33 buf_read[1]=spi.write(0x0C);
DevinAlexander 1:b58719a76fc3 34 buf_read[2]=spi.write(0x0C);
DevinAlexander 0:456e9e702d57 35 spiDisable();
DevinAlexander 1:b58719a76fc3 36
DevinAlexander 1:b58719a76fc3 37
DevinAlexander 1:b58719a76fc3 38 //Convert the registers contents into the correct value
DevinAlexander 1:b58719a76fc3 39 temp =((buf_read[0] & 0xFF) << 11); //Shift Byte 2 into place
DevinAlexander 1:b58719a76fc3 40 temp|=((buf_read[1] & 0xFF) << 3); //Shift Byte 1 into place
DevinAlexander 1:b58719a76fc3 41 temp|=((buf_read[2] & 0xFF) >> 5); //Shift Byte 0 into place
DevinAlexander 1:b58719a76fc3 42 float val=(temp/128.0f); //Divide the binary string by 2 to the 7th power
DevinAlexander 1:b58719a76fc3 43 return val;
DevinAlexander 1:b58719a76fc3 44 // }
DevinAlexander 0:456e9e702d57 45 }
DevinAlexander 0:456e9e702d57 46
DevinAlexander 0:456e9e702d57 47 float MAX31856::readCJ()
DevinAlexander 0:456e9e702d57 48 {
DevinAlexander 0:456e9e702d57 49 int32_t temp;
DevinAlexander 1:b58719a76fc3 50 uint8_t buf_read[3], buf_write=ADDRESS_CJTH_READ;
DevinAlexander 0:456e9e702d57 51
DevinAlexander 0:456e9e702d57 52 spiEnable();
DevinAlexander 0:456e9e702d57 53 for(int i=0; i<3; i++)
DevinAlexander 0:456e9e702d57 54 {
DevinAlexander 0:456e9e702d57 55 buf_read[i]=spi.write(buf_write);
DevinAlexander 0:456e9e702d57 56 }
DevinAlexander 0:456e9e702d57 57 spiDisable();
DevinAlexander 0:456e9e702d57 58
DevinAlexander 0:456e9e702d57 59 //Convert the registers contents into the correct value
DevinAlexander 0:456e9e702d57 60 temp =((int32_t)(buf_read[1] << 6)); //Shift the MSB into place
DevinAlexander 0:456e9e702d57 61 temp|=((int32_t)(buf_read[2] >> 2)); //Shift the LSB into place
DevinAlexander 0:456e9e702d57 62 float val=((float)(temp/64.0)); //Divide the binary string by 2 to the 6th power
DevinAlexander 0:456e9e702d57 63
DevinAlexander 0:456e9e702d57 64 return val;
DevinAlexander 0:456e9e702d57 65 }
DevinAlexander 0:456e9e702d57 66
DevinAlexander 1:b58719a76fc3 67 //Register:CR0 Bits: 7
DevinAlexander 1:b58719a76fc3 68 bool MAX31856::setConversionMode(uint8_t val) {
DevinAlexander 1:b58719a76fc3 69 bool return_val;
DevinAlexander 1:b58719a76fc3 70 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 71 if (val==CR0_CONV_MODE_NORMALLY_OFF) {
DevinAlexander 1:b58719a76fc3 72 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val);
DevinAlexander 1:b58719a76fc3 73 conversion_mode=0;
DevinAlexander 1:b58719a76fc3 74 }
DevinAlexander 1:b58719a76fc3 75 else if (val==CR0_CONV_MODE_NORMALLY_ON) {
DevinAlexander 1:b58719a76fc3 76 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_7, val);
DevinAlexander 1:b58719a76fc3 77 conversion_mode=1;
DevinAlexander 1:b58719a76fc3 78 }
DevinAlexander 1:b58719a76fc3 79 else {
DevinAlexander 1:b58719a76fc3 80 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 7. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 81 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 82 }
DevinAlexander 1:b58719a76fc3 83 return return_val;
DevinAlexander 1:b58719a76fc3 84 }
DevinAlexander 1:b58719a76fc3 85
DevinAlexander 1:b58719a76fc3 86 //Register:CR0 Bits: 6
DevinAlexander 1:b58719a76fc3 87 bool MAX31856::setOneShotMode(uint8_t val) {
DevinAlexander 1:b58719a76fc3 88 bool return_val;
DevinAlexander 1:b58719a76fc3 89 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 90 if (val==CR0_1_SHOT_MODE_NO_CONVERSIONS || val==CR0_1_SHOT_MODE_ONE_CONVERSION)
DevinAlexander 1:b58719a76fc3 91 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_6, val);
DevinAlexander 1:b58719a76fc3 92 else {
DevinAlexander 1:b58719a76fc3 93 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 6. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 94 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 95 }
DevinAlexander 1:b58719a76fc3 96 return return_val;
DevinAlexander 1:b58719a76fc3 97 }
DevinAlexander 1:b58719a76fc3 98
DevinAlexander 1:b58719a76fc3 99 //Register:CR0 Bits: 5:4
DevinAlexander 1:b58719a76fc3 100 bool MAX31856::setOpenCircuitFaultDetection(uint8_t val) {
DevinAlexander 1:b58719a76fc3 101 bool return_val;
DevinAlexander 1:b58719a76fc3 102 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 103 if (val==CR0_OC_DETECT_DISABLED || val==CR0_OC_DETECT_ENABLED_R_LESS_5k || val==CR0_OC_DETECT_ENABLED_TC_LESS_2ms || val==CR0_OC_DETECT_ENABLED_TC_MORE_2ms)
DevinAlexander 1:b58719a76fc3 104 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_5_4, val);
DevinAlexander 1:b58719a76fc3 105 else {
DevinAlexander 1:b58719a76fc3 106 LOG("Incorrect parameter selected for Control Register 0 (CR0) bits 5:4. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 107 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 108 }
DevinAlexander 1:b58719a76fc3 109 return return_val;
DevinAlexander 1:b58719a76fc3 110 }
DevinAlexander 1:b58719a76fc3 111
DevinAlexander 1:b58719a76fc3 112 //Register:CR0 Bits: 3
DevinAlexander 1:b58719a76fc3 113 bool MAX31856::setColdJunctionDisable(uint8_t val) {
DevinAlexander 1:b58719a76fc3 114 bool return_val;
DevinAlexander 1:b58719a76fc3 115 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 116 if (val==CR0_COLD_JUNC_ENABLE) {
DevinAlexander 1:b58719a76fc3 117 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val);
DevinAlexander 1:b58719a76fc3 118 cold_junction_enabled=1;
DevinAlexander 1:b58719a76fc3 119 }
DevinAlexander 1:b58719a76fc3 120 else if (val==CR0_COLD_JUNC_DISABLE) {
DevinAlexander 1:b58719a76fc3 121 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_3, val);
DevinAlexander 1:b58719a76fc3 122 cold_junction_enabled=0;
DevinAlexander 1:b58719a76fc3 123 }
DevinAlexander 1:b58719a76fc3 124 else {
DevinAlexander 1:b58719a76fc3 125 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 3. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 126 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 127 }
DevinAlexander 1:b58719a76fc3 128 return return_val;
DevinAlexander 1:b58719a76fc3 129 }
DevinAlexander 1:b58719a76fc3 130
DevinAlexander 1:b58719a76fc3 131 //Register:CR0 Bits: 2
DevinAlexander 1:b58719a76fc3 132 bool MAX31856::setFaultMode(uint8_t val) {
DevinAlexander 1:b58719a76fc3 133 bool return_val;
DevinAlexander 0:456e9e702d57 134 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 135 if (val==CR0_FAULT_MODE_COMPARATOR || val==CR0_FAULT_MODE_INTERUPT)
DevinAlexander 1:b58719a76fc3 136 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_2, val);
DevinAlexander 1:b58719a76fc3 137 else {
DevinAlexander 1:b58719a76fc3 138 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 2. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 139 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 140 }
DevinAlexander 1:b58719a76fc3 141 return return_val;
DevinAlexander 1:b58719a76fc3 142 }
DevinAlexander 1:b58719a76fc3 143
DevinAlexander 1:b58719a76fc3 144 //Register:CR0 Bits: 1
DevinAlexander 1:b58719a76fc3 145 bool MAX31856::setFaultStatusClear(uint8_t val) {
DevinAlexander 1:b58719a76fc3 146 bool return_val;
DevinAlexander 1:b58719a76fc3 147 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 148 if (val==CR0_FAULTCLR_DEFAULT_VAL || val==CR0_FAULTCLR_RETURN_FAULTS_TO_ZERO)
DevinAlexander 1:b58719a76fc3 149 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_1, val);
DevinAlexander 1:b58719a76fc3 150 else {
DevinAlexander 1:b58719a76fc3 151 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 1. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 152 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 153 }
DevinAlexander 1:b58719a76fc3 154 return return_val;
DevinAlexander 1:b58719a76fc3 155 }
DevinAlexander 1:b58719a76fc3 156
DevinAlexander 1:b58719a76fc3 157 //Register:CR0 Bits: 0
DevinAlexander 1:b58719a76fc3 158 bool MAX31856::setEmiFilterFreq(uint8_t val) {
DevinAlexander 1:b58719a76fc3 159 bool return_val;
DevinAlexander 1:b58719a76fc3 160 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 161 if (val==CR0_FILTER_OUT_60Hz) {
DevinAlexander 1:b58719a76fc3 162 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val);
DevinAlexander 1:b58719a76fc3 163 filter_mode=0;
DevinAlexander 1:b58719a76fc3 164 }
DevinAlexander 1:b58719a76fc3 165 else if (val==CR0_FILTER_OUT_50Hz) {
DevinAlexander 1:b58719a76fc3 166 return_val=registerReadWriteByte(ADDRESS_CR0_READ, ADDRESS_CR0_WRITE, CR0_CLEAR_BITS_0, val);
DevinAlexander 1:b58719a76fc3 167 filter_mode=1;
DevinAlexander 0:456e9e702d57 168 }
DevinAlexander 1:b58719a76fc3 169 else {
DevinAlexander 1:b58719a76fc3 170 LOG("Incorrect parameter selected for Control Register 0 (CR0) bit 0. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 171 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 172 }
DevinAlexander 1:b58719a76fc3 173 return return_val;
DevinAlexander 1:b58719a76fc3 174 }
DevinAlexander 1:b58719a76fc3 175
DevinAlexander 1:b58719a76fc3 176 //Register:CR1 Bits: 6:4
DevinAlexander 1:b58719a76fc3 177 bool MAX31856::setNumSamplesAvg(uint8_t val) {
DevinAlexander 1:b58719a76fc3 178 bool return_val;
DevinAlexander 1:b58719a76fc3 179
DevinAlexander 1:b58719a76fc3 180 //Check if the parameter passed in is valid and set the
DevinAlexander 1:b58719a76fc3 181 if (val==CR1_AVG_TC_SAMPLES_1) {
DevinAlexander 1:b58719a76fc3 182 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 1:b58719a76fc3 183 samples=1;
DevinAlexander 1:b58719a76fc3 184 }
DevinAlexander 1:b58719a76fc3 185 else if (val==CR1_AVG_TC_SAMPLES_2) {
DevinAlexander 1:b58719a76fc3 186 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 1:b58719a76fc3 187 samples=2;
DevinAlexander 1:b58719a76fc3 188 }
DevinAlexander 1:b58719a76fc3 189 else if (val==CR1_AVG_TC_SAMPLES_4) {
DevinAlexander 1:b58719a76fc3 190 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 1:b58719a76fc3 191 samples=4;
DevinAlexander 1:b58719a76fc3 192 }
DevinAlexander 1:b58719a76fc3 193 else if (val==CR1_AVG_TC_SAMPLES_8) {
DevinAlexander 1:b58719a76fc3 194 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 1:b58719a76fc3 195 samples=8;
DevinAlexander 1:b58719a76fc3 196 }
DevinAlexander 1:b58719a76fc3 197 else if (val==CR1_AVG_TC_SAMPLES_16) {
DevinAlexander 1:b58719a76fc3 198 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_6_4, val);
DevinAlexander 1:b58719a76fc3 199 samples=16;
DevinAlexander 1:b58719a76fc3 200 }
DevinAlexander 1:b58719a76fc3 201 else {
DevinAlexander 0:456e9e702d57 202 LOG("Incorrect parameter selected for Control Register 1 (CR1) bits 6:4. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:456e9e702d57 203 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:456e9e702d57 204 }
DevinAlexander 0:456e9e702d57 205 return return_val;
DevinAlexander 0:456e9e702d57 206 }
DevinAlexander 0:456e9e702d57 207
DevinAlexander 1:b58719a76fc3 208 //Register:CR1 Bits: 3:0
DevinAlexander 1:b58719a76fc3 209 bool MAX31856::setThermocoupleType(uint8_t val) {
DevinAlexander 1:b58719a76fc3 210 bool return_val;
DevinAlexander 0:456e9e702d57 211 //Check if the parameter passed in is valid
DevinAlexander 1:b58719a76fc3 212 if (val==CR1_TC_TYPE_B || val==CR1_TC_TYPE_E || val==CR1_TC_TYPE_J || val==CR1_TC_TYPE_K || val==CR1_TC_TYPE_N || val==CR1_TC_TYPE_R || val==CR1_TC_TYPE_S || val==CR1_TC_TYPE_T) {
DevinAlexander 1:b58719a76fc3 213 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 1:b58719a76fc3 214 voltage_mode=false;
DevinAlexander 1:b58719a76fc3 215 }
DevinAlexander 1:b58719a76fc3 216 else if (val==CR1_TC_TYPE_VOLT_MODE_GAIN_8 || val==CR1_TC_TYPE_VOLT_MODE_GAIN_32) {
DevinAlexander 1:b58719a76fc3 217 return_val=registerReadWriteByte(ADDRESS_CR1_READ, ADDRESS_CR1_WRITE, CR1_CLEAR_BITS_3_0, val);
DevinAlexander 1:b58719a76fc3 218 voltage_mode=true;
DevinAlexander 1:b58719a76fc3 219 }
DevinAlexander 1:b58719a76fc3 220 else {
DevinAlexander 1:b58719a76fc3 221 LOG("Incorrect parameter selected for Control Register 1 (CR1) bits 3:0. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 222 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 223 }
DevinAlexander 1:b58719a76fc3 224 return return_val;
DevinAlexander 1:b58719a76fc3 225 }
DevinAlexander 1:b58719a76fc3 226
DevinAlexander 1:b58719a76fc3 227 //Register:MASK Bits: 5:0
DevinAlexander 1:b58719a76fc3 228 bool MAX31856::setFaultMasks(uint8_t val, bool enable) {
DevinAlexander 1:b58719a76fc3 229 bool return_val;
DevinAlexander 1:b58719a76fc3 230 uint8_t temp_val;
DevinAlexander 1:b58719a76fc3 231 if(enable)
DevinAlexander 1:b58719a76fc3 232 temp_val=0;
DevinAlexander 1:b58719a76fc3 233 else
DevinAlexander 1:b58719a76fc3 234 temp_val=val;
DevinAlexander 1:b58719a76fc3 235 if (val==MASK_CJ_FAULT_THRESHOLD_HIGH) //Cold Junction High Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 236 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_5, temp_val);
DevinAlexander 1:b58719a76fc3 237 else if (val==MASK_CJ_FAULT_THRESHOLD_LOW) //Cold Junction Low Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 238 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_4, temp_val);
DevinAlexander 1:b58719a76fc3 239 else if (val==MASK_TC_FAULT_THRESHOLD_HIGH) //Thermocouple High Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 240 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_3, temp_val);
DevinAlexander 1:b58719a76fc3 241 else if (val==MASK_TC_FAULT_THRESHOLD_LOW) //Thermocouple Low Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 242 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_2, temp_val);
DevinAlexander 1:b58719a76fc3 243 else if (val==MASK_OVER_UNDER_VOLT_FAULT) //Over-Voltage/Under-Voltage Input Fault Mask
DevinAlexander 1:b58719a76fc3 244 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_1, temp_val);
DevinAlexander 1:b58719a76fc3 245 else if (val==MASK_OPEN_CIRCUIT_FAULT) //Thermocouple Open-Circuit Fault Mask
DevinAlexander 1:b58719a76fc3 246 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_0, temp_val);
DevinAlexander 1:b58719a76fc3 247 else {
DevinAlexander 1:b58719a76fc3 248 LOG("Incorrect parameter selected for Control Register 1 (CR1) bits 3:0. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 1:b58719a76fc3 249 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 1:b58719a76fc3 250 }
DevinAlexander 1:b58719a76fc3 251 return return_val;
DevinAlexander 1:b58719a76fc3 252 }
DevinAlexander 1:b58719a76fc3 253
DevinAlexander 1:b58719a76fc3 254 //Register:MASK Bits: 5:0
DevinAlexander 1:b58719a76fc3 255 float MAX31856::setFaultThresholds(uint8_t val, bool enable_mask, float temperature) {
DevinAlexander 1:b58719a76fc3 256 float return_val;
DevinAlexander 1:b58719a76fc3 257 uint8_t temp_val;
DevinAlexander 1:b58719a76fc3 258 if(enable_mask) {
DevinAlexander 1:b58719a76fc3 259 temp_val=0;
DevinAlexander 1:b58719a76fc3 260 }
DevinAlexander 1:b58719a76fc3 261 else {
DevinAlexander 1:b58719a76fc3 262 temp_val=val;
DevinAlexander 1:b58719a76fc3 263 }
DevinAlexander 1:b58719a76fc3 264 if (val==MASK_CJ_FAULT_THRESHOLD_HIGH) { //Cold Junction High Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 265 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_5, temp_val);
DevinAlexander 1:b58719a76fc3 266
DevinAlexander 1:b58719a76fc3 267 int8_t temperature_byte=temperature;
DevinAlexander 1:b58719a76fc3 268
DevinAlexander 1:b58719a76fc3 269 if (temperature_byte>CJ_MAX_VAL_FAULT)
DevinAlexander 1:b58719a76fc3 270 temperature_byte=CJ_MAX_VAL_FAULT;
DevinAlexander 1:b58719a76fc3 271 else if (temperature_byte<=0 || temperature_byte>=CJ_MIN_VAL_FAULT)
DevinAlexander 1:b58719a76fc3 272 temperature_byte=twosComplimentToSigned8(temperature_byte); //Convert the 2's compliment int into a signed value
DevinAlexander 1:b58719a76fc3 273 else if (temperature_byte<CJ_MIN_VAL_FAULT)
DevinAlexander 1:b58719a76fc3 274 temperature_byte=twosComplimentToSigned8(CJ_MIN_VAL_FAULT); //Convert the 2's compliment int into a signed value
DevinAlexander 1:b58719a76fc3 275 //else the data is within range, no more manipulation of data is needed
DevinAlexander 1:b58719a76fc3 276 return_val=registerWriteByte(ADDRESS_CJHF_WRITE, temperature_byte);
DevinAlexander 1:b58719a76fc3 277 }
DevinAlexander 1:b58719a76fc3 278 else if (val==MASK_CJ_FAULT_THRESHOLD_LOW) { //Cold Junction Low Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 279 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_4, temp_val);
DevinAlexander 1:b58719a76fc3 280
DevinAlexander 1:b58719a76fc3 281 int8_t temperature_byte=temperature;
DevinAlexander 1:b58719a76fc3 282
DevinAlexander 1:b58719a76fc3 283 if (temperature_byte>CJ_MAX_VAL_FAULT)
DevinAlexander 1:b58719a76fc3 284 temperature_byte=CJ_MAX_VAL_FAULT;
DevinAlexander 1:b58719a76fc3 285 else if (temperature_byte<=0 || temperature_byte>=CJ_MIN_VAL_FAULT)
DevinAlexander 1:b58719a76fc3 286 temperature_byte=twosComplimentToSigned8(temperature_byte); //Convert the 2's compliment int into a signed value
DevinAlexander 1:b58719a76fc3 287 else if (temperature_byte<CJ_MIN_VAL_FAULT)
DevinAlexander 1:b58719a76fc3 288 temperature_byte=twosComplimentToSigned8(CJ_MIN_VAL_FAULT); //Convert the 2's compliment int into a signed value
DevinAlexander 1:b58719a76fc3 289 //else the data is within range, no more manipulation of data is needed
DevinAlexander 1:b58719a76fc3 290
DevinAlexander 1:b58719a76fc3 291 return_val=registerWriteByte(ADDRESS_CJLF_WRITE, temperature_byte);
DevinAlexander 1:b58719a76fc3 292 }
DevinAlexander 1:b58719a76fc3 293 else if (val==MASK_TC_FAULT_THRESHOLD_HIGH) { //Thermocouple High Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 294 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_3, temp_val);
DevinAlexander 1:b58719a76fc3 295
DevinAlexander 1:b58719a76fc3 296 if (temperature) {
DevinAlexander 1:b58719a76fc3 297 int8_t temperature_byte[2];
DevinAlexander 1:b58719a76fc3 298 int16_t temperature_multi_byte =(int16_t)(temperature*4.0);
DevinAlexander 1:b58719a76fc3 299 if (temperature_multi_byte>(TC_MAX_VAL_FAULT*4.0f))
DevinAlexander 1:b58719a76fc3 300 temperature_multi_byte=TC_MAX_VAL_FAULT*4.0f;
DevinAlexander 1:b58719a76fc3 301 else if (temperature_multi_byte<=0 || temperature_multi_byte>=(TC_MIN_VAL_FAULT*4.0f))
DevinAlexander 1:b58719a76fc3 302 temperature_multi_byte=twosComplimentToSigned16(temperature_multi_byte); //Convert the 2's compliment int into a signed value
DevinAlexander 1:b58719a76fc3 303 else if (temperature_multi_byte<(TC_MIN_VAL_FAULT*4.0f))
DevinAlexander 1:b58719a76fc3 304 temperature_multi_byte=twosComplimentToSigned16(TC_MIN_VAL_FAULT*4.0f); //Convert the 2's compliment int into a signed value
DevinAlexander 1:b58719a76fc3 305
DevinAlexander 1:b58719a76fc3 306 //now split up the 32bit int into two bytes to program the registers with
DevinAlexander 1:b58719a76fc3 307 temperature_byte[0]=((uint8_t)((temperature_multi_byte)&(0xFF00) >> 8));
DevinAlexander 1:b58719a76fc3 308 temperature_byte[1]=((uint8_t)((temperature_multi_byte)&(0x00FF)));
DevinAlexander 1:b58719a76fc3 309
DevinAlexander 1:b58719a76fc3 310 return_val=registerWriteByte(ADDRESS_LTHFTH_WRITE, temperature_byte[0]);
DevinAlexander 1:b58719a76fc3 311 return_val=registerWriteByte(ADDRESS_LTHFTL_WRITE, temperature_byte[1]);
DevinAlexander 1:b58719a76fc3 312
DevinAlexander 1:b58719a76fc3 313 return_val=temperature;
DevinAlexander 0:456e9e702d57 314 }
DevinAlexander 1:b58719a76fc3 315 // else {
DevinAlexander 1:b58719a76fc3 316 // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////return_val="WHATEVER IS IN THE REGISTERS WHEN YOU SET THE FLAG JUST INCASE YOU NEED TO SEE WHAT IS INSISIDE THE REGISTER";
DevinAlexander 1:b58719a76fc3 317 // }
DevinAlexander 0:456e9e702d57 318 }
DevinAlexander 1:b58719a76fc3 319 else if (val==MASK_TC_FAULT_THRESHOLD_LOW) //Thermocouple Low Threshold Fault Mask
DevinAlexander 1:b58719a76fc3 320 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_2, temp_val);
DevinAlexander 1:b58719a76fc3 321 else if (val==MASK_OVER_UNDER_VOLT_FAULT) //Over-Voltage/Under-Voltage Input Fault Mask
DevinAlexander 1:b58719a76fc3 322 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_1, temp_val);
DevinAlexander 1:b58719a76fc3 323 else if (val==MASK_OPEN_CIRCUIT_FAULT) //Thermocouple Open-Circuit Fault Mask
DevinAlexander 1:b58719a76fc3 324 return_val=registerReadWriteByte(ADDRESS_MASK_READ, ADDRESS_MASK_WRITE, MASK_CLEAR_BITS_0, temp_val);
DevinAlexander 1:b58719a76fc3 325 else {
DevinAlexander 1:b58719a76fc3 326 LOG("Incorrect parameter selected for MASK Register. Default value not changed.\r\nPlease see MAX31856.h for list of valid parameters. \r\n");
DevinAlexander 0:456e9e702d57 327 return_val=0; //returns a 0 to flag that the parameter wasn't programmed due to wrong parameter in function call
DevinAlexander 0:456e9e702d57 328 }
DevinAlexander 0:456e9e702d57 329 return return_val;
DevinAlexander 0:456e9e702d57 330 }
DevinAlexander 0:456e9e702d57 331
DevinAlexander 0:456e9e702d57 332
DevinAlexander 1:b58719a76fc3 333
DevinAlexander 1:b58719a76fc3 334
DevinAlexander 1:b58719a76fc3 335
DevinAlexander 1:b58719a76fc3 336
DevinAlexander 1:b58719a76fc3 337 //The following functions are for internal library use only
DevinAlexander 1:b58719a76fc3 338 void MAX31856::spiEnable() {
DevinAlexander 1:b58719a76fc3 339 ncs=0; //Set CS high to start transmission (interrupts conversion)
DevinAlexander 1:b58719a76fc3 340 return;
DevinAlexander 1:b58719a76fc3 341 }
DevinAlexander 1:b58719a76fc3 342 void MAX31856::spiDisable() {
DevinAlexander 1:b58719a76fc3 343 ncs=1; //Set CS low to stop transmission (restarts conversion)
DevinAlexander 1:b58719a76fc3 344 return;
DevinAlexander 1:b58719a76fc3 345 }
DevinAlexander 1:b58719a76fc3 346
DevinAlexander 1:b58719a76fc3 347 bool MAX31856::registerReadWriteByte(uint8_t read_address, uint8_t write_address, uint8_t clear_bits, uint8_t val) {
DevinAlexander 1:b58719a76fc3 348 uint8_t buf_read[2];
DevinAlexander 1:b58719a76fc3 349
DevinAlexander 0:456e9e702d57 350 //Read the current contents of a register
DevinAlexander 0:456e9e702d57 351 spiEnable();
DevinAlexander 1:b58719a76fc3 352 for(int i=0; i<2; i++) {
DevinAlexander 1:b58719a76fc3 353 buf_read[i]=spi.write(read_address);
DevinAlexander 0:456e9e702d57 354 }
DevinAlexander 0:456e9e702d57 355 spiDisable();
DevinAlexander 1:b58719a76fc3 356
DevinAlexander 1:b58719a76fc3 357 //Modify contents pulled from the register
DevinAlexander 1:b58719a76fc3 358 buf_read[1]&=clear_bits; //Clear the contents of bits of parameter you are trying to clear for later or equal operation
DevinAlexander 1:b58719a76fc3 359 buf_read[1]|=val; //Bitwise OR the input parameter with cleaned buf_read[1] to create new byte
DevinAlexander 0:456e9e702d57 360 val=buf_read[1];
DevinAlexander 1:b58719a76fc3 361
DevinAlexander 0:456e9e702d57 362 //Write the updated byte to the register
DevinAlexander 0:456e9e702d57 363 spiEnable();
DevinAlexander 1:b58719a76fc3 364 buf_read[0]=spi.write(write_address);
DevinAlexander 1:b58719a76fc3 365 buf_read[1]=spi.write(val);
DevinAlexander 1:b58719a76fc3 366 spiDisable();
DevinAlexander 1:b58719a76fc3 367 return true;
DevinAlexander 1:b58719a76fc3 368 }
DevinAlexander 1:b58719a76fc3 369
DevinAlexander 1:b58719a76fc3 370 bool MAX31856::registerWriteByte(uint8_t write_address, uint8_t val) {
DevinAlexander 1:b58719a76fc3 371 uint8_t buf_read[2];
DevinAlexander 1:b58719a76fc3 372 //Write the updated byte to the register
DevinAlexander 1:b58719a76fc3 373 spiEnable();
DevinAlexander 1:b58719a76fc3 374 buf_read[0]=spi.write(write_address);
DevinAlexander 0:456e9e702d57 375 buf_read[1]=spi.write(val);
DevinAlexander 0:456e9e702d57 376 spiDisable();
DevinAlexander 0:456e9e702d57 377 return true;
DevinAlexander 0:456e9e702d57 378 }
DevinAlexander 0:456e9e702d57 379
DevinAlexander 1:b58719a76fc3 380 int8_t MAX31856::twosComplimentToSigned8(int8_t temp){
DevinAlexander 1:b58719a76fc3 381 temp=(~(temp)+1); //Take two's complement of the negative number
DevinAlexander 1:b58719a76fc3 382 temp|=(int8_t)(0x80UL); //And convert it into 7-bit val with msb as sign bit
DevinAlexander 1:b58719a76fc3 383 return temp;
DevinAlexander 1:b58719a76fc3 384 }
DevinAlexander 1:b58719a76fc3 385 int16_t MAX31856::twosComplimentToSigned16(int16_t temp){
DevinAlexander 1:b58719a76fc3 386 temp=(~(temp)+1); //Take two's complement of the negative number
DevinAlexander 1:b58719a76fc3 387 temp|=(int16_t)(0x8000UL); //And convert it into 15-bit val with msb as sign bit
DevinAlexander 1:b58719a76fc3 388 return temp;
DevinAlexander 1:b58719a76fc3 389 }
DevinAlexander 1:b58719a76fc3 390
DevinAlexander 1:b58719a76fc3 391 //bool MAX31856::checkForFaults() {
DevinAlexander 1:b58719a76fc3 392 //
DevinAlexander 1:b58719a76fc3 393 //}
DevinAlexander 1:b58719a76fc3 394
DevinAlexander 1:b58719a76fc3 395
DevinAlexander 0:456e9e702d57 396
DevinAlexander 0:456e9e702d57 397
DevinAlexander 1:b58719a76fc3 398 ///Define parameters for control register one (CR1)
DevinAlexander 1:b58719a76fc3 399 /** Adding Samples increases the conversion time and reduces noise.
DevinAlexander 1:b58719a76fc3 400 Typical conversion times:
DevinAlexander 1:b58719a76fc3 401 1-shot or first conversion in Auto mode:
DevinAlexander 1:b58719a76fc3 402 = t_Conversion + (samples-1)*33.33mS (60Hz rejection)
DevinAlexander 1:b58719a76fc3 403 = t_Conversion + (samples-1)*40.00mS (50Hz rejection)
DevinAlexander 1:b58719a76fc3 404 2 thru n conversions in Auto mode:
DevinAlexander 1:b58719a76fc3 405 = t_Conversion + (samples-1)*16.67mS (60Hz rejection)
DevinAlexander 1:b58719a76fc3 406 = t_Conversion + (samples-1)*20.00mS (50Hz rejection)
DevinAlexander 1:b58719a76fc3 407 */
DevinAlexander 1:b58719a76fc3 408
DevinAlexander 0:456e9e702d57 409
DevinAlexander 0:456e9e702d57 410
DevinAlexander 1:b58719a76fc3 411 //uint32_t MAX31856::calculateDelayTime() {
DevinAlexander 1:b58719a76fc3 412 // uint32_t delayTime;
DevinAlexander 1:b58719a76fc3 413 //
DevinAlexander 1:b58719a76fc3 414 // if (auto_convert_mode==1 && samples==1) { //single conversion
DevinAlexander 1:b58719a76fc3 415 // if (filter_mode==0) //60Hz
DevinAlexander 1:b58719a76fc3 416 // delayTime=82+(samples-1)*33.33f;
DevinAlexander 1:b58719a76fc3 417 // if (filter_mode==1) //50Hz
DevinAlexander 1:b58719a76fc3 418 // delayTime=98+(samples-1)*40.00f;
DevinAlexander 1:b58719a76fc3 419 // }
DevinAlexander 1:b58719a76fc3 420 // else if (auto_convert_mode==1 && samples>1) { //single conversion
DevinAlexander 1:b58719a76fc3 421 // if (filter_mode==0) //60Hz
DevinAlexander 1:b58719a76fc3 422 // delayTime=82+(samples-1)*33.33f;
DevinAlexander 1:b58719a76fc3 423 // if (filter_mode==1) //50Hz
DevinAlexander 1:b58719a76fc3 424 // delayTime=98+(samples-1)*40.00f;
DevinAlexander 1:b58719a76fc3 425 // }
DevinAlexander 1:b58719a76fc3 426 //
DevinAlexander 1:b58719a76fc3 427 //
DevinAlexander 1:b58719a76fc3 428 //
DevinAlexander 1:b58719a76fc3 429 //
DevinAlexander 1:b58719a76fc3 430 //auto 50 169
DevinAlexander 1:b58719a76fc3 431 //auto 60 143
DevinAlexander 1:b58719a76fc3 432 //1shot 50 98
DevinAlexander 1:b58719a76fc3 433 //1shot 60 82