Hans Oppermann
/
Nucleo_DS1631
Reading temperature from DS1631 via I2C
main.cpp@0:b65d2cdf2cc8, 2014-03-25 (annotated)
- Committer:
- hoteloskar
- Date:
- Tue Mar 25 15:20:27 2014 +0000
- Revision:
- 0:b65d2cdf2cc8
First version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hoteloskar | 0:b65d2cdf2cc8 | 1 | #include "mbed.h" |
hoteloskar | 0:b65d2cdf2cc8 | 2 | |
hoteloskar | 0:b65d2cdf2cc8 | 3 | /*********************************************************************** |
hoteloskar | 0:b65d2cdf2cc8 | 4 | * Read temperature by using DS1631 |
hoteloskar | 0:b65d2cdf2cc8 | 5 | * |
hoteloskar | 0:b65d2cdf2cc8 | 6 | * Normal I2C-protocol (start,write,..,stop) does NOT work |
hoteloskar | 0:b65d2cdf2cc8 | 7 | * It has to be used |
hoteloskar | 0:b65d2cdf2cc8 | 8 | * i2c.write(address,data,length,repeat) |
hoteloskar | 0:b65d2cdf2cc8 | 9 | * which includes start and stop and a special addressing function |
hoteloskar | 0:b65d2cdf2cc8 | 10 | ************************************************************************/ |
hoteloskar | 0:b65d2cdf2cc8 | 11 | DigitalOut myled(LED2); |
hoteloskar | 0:b65d2cdf2cc8 | 12 | DigitalIn button(USER_BUTTON); |
hoteloskar | 0:b65d2cdf2cc8 | 13 | I2C i2c (PB_9,PB_8); // sda, scl |
hoteloskar | 0:b65d2cdf2cc8 | 14 | |
hoteloskar | 0:b65d2cdf2cc8 | 15 | int main() { |
hoteloskar | 0:b65d2cdf2cc8 | 16 | int data; |
hoteloskar | 0:b65d2cdf2cc8 | 17 | uint16_t cr1; |
hoteloskar | 0:b65d2cdf2cc8 | 18 | int ack; |
hoteloskar | 0:b65d2cdf2cc8 | 19 | char data_write[2]; |
hoteloskar | 0:b65d2cdf2cc8 | 20 | char data_read[2]; |
hoteloskar | 0:b65d2cdf2cc8 | 21 | //cr1 = I2C1->CR1; |
hoteloskar | 0:b65d2cdf2cc8 | 22 | //I2C1->CR2 = 0x0002; |
hoteloskar | 0:b65d2cdf2cc8 | 23 | |
hoteloskar | 0:b65d2cdf2cc8 | 24 | data_write[0] = 0xEE; |
hoteloskar | 0:b65d2cdf2cc8 | 25 | ack = i2c.write(0x90, data_write, 1, 0); |
hoteloskar | 0:b65d2cdf2cc8 | 26 | data_write[0] = 0xAC; // writes the 1-byte configuration register |
hoteloskar | 0:b65d2cdf2cc8 | 27 | data_write[1] = 0x0F; // 1shot;12bit;pol=1 |
hoteloskar | 0:b65d2cdf2cc8 | 28 | ack = i2c.write(0x90, data_write, 2, 0); |
hoteloskar | 0:b65d2cdf2cc8 | 29 | |
hoteloskar | 0:b65d2cdf2cc8 | 30 | while(1) { |
hoteloskar | 0:b65d2cdf2cc8 | 31 | while (button); // start measurement by user_button |
hoteloskar | 0:b65d2cdf2cc8 | 32 | |
hoteloskar | 0:b65d2cdf2cc8 | 33 | data_write[0] = 0x51; // Initiates temperature conversions |
hoteloskar | 0:b65d2cdf2cc8 | 34 | ack = i2c.write(0x90, data_write, 1, 0); |
hoteloskar | 0:b65d2cdf2cc8 | 35 | //printf("%d\n",ack); |
hoteloskar | 0:b65d2cdf2cc8 | 36 | wait_ms(1000); |
hoteloskar | 0:b65d2cdf2cc8 | 37 | |
hoteloskar | 0:b65d2cdf2cc8 | 38 | data_write[0] = 0xAA; // Reads last converted temperature value from the 2-byte temperature register |
hoteloskar | 0:b65d2cdf2cc8 | 39 | ack = i2c.write(0x90, data_write, 1, 1); |
hoteloskar | 0:b65d2cdf2cc8 | 40 | i2c.read(0x90, data_read, 2, 0); |
hoteloskar | 0:b65d2cdf2cc8 | 41 | |
hoteloskar | 0:b65d2cdf2cc8 | 42 | data=data_read[0]*100; |
hoteloskar | 0:b65d2cdf2cc8 | 43 | data=data+(((data_read[1] >> 4 )* 50)/8); |
hoteloskar | 0:b65d2cdf2cc8 | 44 | printf("%d\n",data); |
hoteloskar | 0:b65d2cdf2cc8 | 45 | //wait_ms(1000); |
hoteloskar | 0:b65d2cdf2cc8 | 46 | } |
hoteloskar | 0:b65d2cdf2cc8 | 47 | } |