LM74 temperature sensor Library on SPI I/F
TmpLM74.cpp@0:9293a89e30e2, 2011-03-10 (annotated)
- 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?
User | Revision | Line number | New 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 | // ****************************************************************** |