LM74 temperature sensor Library on SPI I/F

Committer:
atpolitis
Date:
Thu Mar 10 18:23:12 2011 +0000
Revision:
0:9293a89e30e2
Child:
1:a29c5af6c1f0
First attempt

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 0:9293a89e30e2 20 int16_t binTemp;
atpolitis 0:9293a89e30e2 21 uint16_t tempRegister;
atpolitis 0:9293a89e30e2 22
atpolitis 0:9293a89e30e2 23 _csLM74 = 0;
atpolitis 0:9293a89e30e2 24
atpolitis 0:9293a89e30e2 25 tempRegister = ((uint16_t) write(0xFF)) << 8;
atpolitis 0:9293a89e30e2 26 tempRegister += write(0xFF);
atpolitis 0:9293a89e30e2 27
atpolitis 0:9293a89e30e2 28 _csLM74 = 1;
atpolitis 0:9293a89e30e2 29
atpolitis 0:9293a89e30e2 30 binTemp = tempRegister >> 3;
atpolitis 0:9293a89e30e2 31
atpolitis 0:9293a89e30e2 32 if((tempRegister & 0xFFFC) == 0x8000) { // Manufacturer's Device ID Register (power down)
atpolitis 0:9293a89e30e2 33 startLM74();
atpolitis 0:9293a89e30e2 34 binTemp = INVALID_LM74_TEMP;
atpolitis 0:9293a89e30e2 35 } else if ((tempRegister & 0x0004) == 0) { // temp reading NOT ready
atpolitis 0:9293a89e30e2 36 binTemp = INVALID_LM74_TEMP;
atpolitis 0:9293a89e30e2 37 } else if (binTemp > 0x0FFF) { // negative temperature
atpolitis 0:9293a89e30e2 38 binTemp &= 0xFFF;
atpolitis 0:9293a89e30e2 39 binTemp = ~binTemp;
atpolitis 0:9293a89e30e2 40 }
atpolitis 0:9293a89e30e2 41 realTemp = ((float) binTemp) * 0.0625;
atpolitis 0:9293a89e30e2 42
atpolitis 0:9293a89e30e2 43 return realTemp;
atpolitis 0:9293a89e30e2 44 }
atpolitis 0:9293a89e30e2 45 // ******************************************************************
atpolitis 0:9293a89e30e2 46
atpolitis 0:9293a89e30e2 47 void TmpLM74::startLM74(void){
atpolitis 0:9293a89e30e2 48
atpolitis 0:9293a89e30e2 49 _csLM74 = 0;
atpolitis 0:9293a89e30e2 50
atpolitis 0:9293a89e30e2 51 uint8_t dummy = write(0x00);
atpolitis 0:9293a89e30e2 52 dummy = write(0x00);
atpolitis 0:9293a89e30e2 53 dummy = write(0x00);
atpolitis 0:9293a89e30e2 54 dummy = write(0x00); // this byte sets LM74 to continuous conversion
atpolitis 0:9293a89e30e2 55
atpolitis 0:9293a89e30e2 56 _csLM74 = 1;
atpolitis 0:9293a89e30e2 57 }
atpolitis 0:9293a89e30e2 58 // ******************************************************************
atpolitis 0:9293a89e30e2 59
atpolitis 0:9293a89e30e2 60 void TmpLM74::shutLM74down(void){
atpolitis 0:9293a89e30e2 61
atpolitis 0:9293a89e30e2 62 _csLM74 = 0;
atpolitis 0:9293a89e30e2 63
atpolitis 0:9293a89e30e2 64 uint8_t dummy = write(0xFF);
atpolitis 0:9293a89e30e2 65 dummy = write(0xFF);
atpolitis 0:9293a89e30e2 66 dummy = write(0xFF); // these 2 bytes set LM74 to power down
atpolitis 0:9293a89e30e2 67 dummy = write(0xFF); // these 2 bytes set LM74 to power down
atpolitis 0:9293a89e30e2 68
atpolitis 0:9293a89e30e2 69 _csLM74 = 1;
atpolitis 0:9293a89e30e2 70 }
atpolitis 0:9293a89e30e2 71 // ******************************************************************