LM74 temperature sensor Library on SPI I/F

Committer:
atpolitis
Date:
Fri Mar 11 09:55:23 2011 +0000
Revision:
1:a29c5af6c1f0
Parent:
0:9293a89e30e2
correction for negative temperarures

Who changed what in which revision?

UserRevisionLine numberNew contents of line
atpolitis 0:9293a89e30e2 1
atpolitis 0:9293a89e30e2 2 #include "mbed.h"
atpolitis 0:9293a89e30e2 3 #include "TmpLM74.h"
atpolitis 0:9293a89e30e2 4
atpolitis 0:9293a89e30e2 5
atpolitis 0:9293a89e30e2 6 TmpLM74::TmpLM74(PinName mosi, PinName miso, PinName sclk, PinName csLM74):
atpolitis 0:9293a89e30e2 7 SPI(mosi, miso, sclk), _csLM74(csLM74) {
atpolitis 0:9293a89e30e2 8
atpolitis 0:9293a89e30e2 9 _csLM74 = 1;
atpolitis 0:9293a89e30e2 10
atpolitis 0:9293a89e30e2 11 format(8,3); // initialize SPI peripheral
atpolitis 0:9293a89e30e2 12 frequency(1000000); // initialize SPI peripheral
atpolitis 0:9293a89e30e2 13
atpolitis 0:9293a89e30e2 14 startLM74();
atpolitis 0:9293a89e30e2 15 }
atpolitis 0:9293a89e30e2 16
atpolitis 0:9293a89e30e2 17 float TmpLM74::readTemp(void){
atpolitis 0:9293a89e30e2 18
atpolitis 0:9293a89e30e2 19 float realTemp;
atpolitis 1:a29c5af6c1f0 20 int16_t tempRegister;
atpolitis 0:9293a89e30e2 21
atpolitis 0:9293a89e30e2 22 _csLM74 = 0;
atpolitis 0:9293a89e30e2 23
atpolitis 0:9293a89e30e2 24 tempRegister = ((uint16_t) write(0xFF)) << 8;
atpolitis 1:a29c5af6c1f0 25 tempRegister |= write(0xFF);
atpolitis 1:a29c5af6c1f0 26
atpolitis 0:9293a89e30e2 27 _csLM74 = 1;
atpolitis 0:9293a89e30e2 28
atpolitis 1:a29c5af6c1f0 29 // tempRegister = (((uint16_t) 0xE4) << 8) | 0x84; // -55.0 C
atpolitis 1:a29c5af6c1f0 30 // tempRegister = (((uint16_t) 0xFB) << 8) | 0x04; // -10.0 C
atpolitis 1:a29c5af6c1f0 31 // tempRegister = 0x8000; // power down
atpolitis 1:a29c5af6c1f0 32
atpolitis 1:a29c5af6c1f0 33 // pc.printf("TempRegister = 0x%x\n", tempRegister); debugging ONLY
atpolitis 0:9293a89e30e2 34
atpolitis 1:a29c5af6c1f0 35 if ((tempRegister & 0x0004) == 0) { // temp reading NOT ready or LM74 in power down
atpolitis 1:a29c5af6c1f0 36 if((tempRegister & 0xFFFC) == 0x8000) { // Manufacturer's Device ID Register (power down) ?
atpolitis 1:a29c5af6c1f0 37 startLM74();
atpolitis 1:a29c5af6c1f0 38 }
atpolitis 1:a29c5af6c1f0 39 tempRegister = INVALID_LM74_TEMP;
atpolitis 1:a29c5af6c1f0 40 } else {
atpolitis 1:a29c5af6c1f0 41 tempRegister >>= 3;
atpolitis 0:9293a89e30e2 42 }
atpolitis 1:a29c5af6c1f0 43 realTemp = ((float) tempRegister) * 0.0625;
atpolitis 0:9293a89e30e2 44
atpolitis 0:9293a89e30e2 45 return realTemp;
atpolitis 0:9293a89e30e2 46 }
atpolitis 0:9293a89e30e2 47 // ******************************************************************
atpolitis 0:9293a89e30e2 48
atpolitis 0:9293a89e30e2 49 void TmpLM74::startLM74(void){
atpolitis 0:9293a89e30e2 50
atpolitis 0:9293a89e30e2 51 _csLM74 = 0;
atpolitis 0:9293a89e30e2 52
atpolitis 0:9293a89e30e2 53 uint8_t dummy = write(0x00);
atpolitis 0:9293a89e30e2 54 dummy = write(0x00);
atpolitis 0:9293a89e30e2 55 dummy = write(0x00);
atpolitis 0:9293a89e30e2 56 dummy = write(0x00); // this byte sets LM74 to continuous conversion
atpolitis 0:9293a89e30e2 57
atpolitis 0:9293a89e30e2 58 _csLM74 = 1;
atpolitis 0:9293a89e30e2 59 }
atpolitis 0:9293a89e30e2 60 // ******************************************************************
atpolitis 0:9293a89e30e2 61
atpolitis 0:9293a89e30e2 62 void TmpLM74::shutLM74down(void){
atpolitis 0:9293a89e30e2 63
atpolitis 0:9293a89e30e2 64 _csLM74 = 0;
atpolitis 0:9293a89e30e2 65
atpolitis 0:9293a89e30e2 66 uint8_t dummy = write(0xFF);
atpolitis 0:9293a89e30e2 67 dummy = write(0xFF);
atpolitis 0:9293a89e30e2 68 dummy = write(0xFF); // these 2 bytes set LM74 to power down
atpolitis 0:9293a89e30e2 69 dummy = write(0xFF); // these 2 bytes set LM74 to power down
atpolitis 0:9293a89e30e2 70
atpolitis 0:9293a89e30e2 71 _csLM74 = 1;
atpolitis 0:9293a89e30e2 72 }
atpolitis 0:9293a89e30e2 73 // ******************************************************************