copy of i2c master example

Committer:
tulanthoar
Date:
Fri Apr 21 19:50:38 2017 +0000
Revision:
1:9cdd4df37645
Parent:
0:94dbc6f9a730
switch to mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tulanthoar 0:94dbc6f9a730 1 #include "mbed.h"
tulanthoar 0:94dbc6f9a730 2
tulanthoar 0:94dbc6f9a730 3 #define LM75_REG_TEMP (0x00) // Temperature Register
tulanthoar 0:94dbc6f9a730 4 #define LM75_REG_CONF (0x01) // Configuration Register
tulanthoar 0:94dbc6f9a730 5 #define LM75_ADDR (0x90) // LM75 address
tulanthoar 0:94dbc6f9a730 6
tulanthoar 0:94dbc6f9a730 7 I2C i2c(I2C_SDA, I2C_SCL);
tulanthoar 0:94dbc6f9a730 8
tulanthoar 0:94dbc6f9a730 9 DigitalOut myled(LED1);
tulanthoar 0:94dbc6f9a730 10
tulanthoar 0:94dbc6f9a730 11 Serial pc(SERIAL_TX, SERIAL_RX);
tulanthoar 0:94dbc6f9a730 12
tulanthoar 0:94dbc6f9a730 13 volatile char TempCelsiusDisplay[] = "+abc.d C";
tulanthoar 0:94dbc6f9a730 14
tulanthoar 0:94dbc6f9a730 15 int main()
tulanthoar 0:94dbc6f9a730 16 {
tulanthoar 0:94dbc6f9a730 17
tulanthoar 0:94dbc6f9a730 18 char data_write[2];
tulanthoar 0:94dbc6f9a730 19 char data_read[2];
tulanthoar 0:94dbc6f9a730 20
tulanthoar 0:94dbc6f9a730 21 /* Configure the Temperature sensor device STLM75:
tulanthoar 0:94dbc6f9a730 22 - Thermostat mode Interrupt
tulanthoar 0:94dbc6f9a730 23 - Fault tolerance: 0
tulanthoar 0:94dbc6f9a730 24 */
tulanthoar 0:94dbc6f9a730 25 data_write[0] = LM75_REG_CONF;
tulanthoar 0:94dbc6f9a730 26 data_write[1] = 0x02;
tulanthoar 0:94dbc6f9a730 27 int status = i2c.write(LM75_ADDR, data_write, 2, 0);
tulanthoar 0:94dbc6f9a730 28 if (status != 0) { // Error
tulanthoar 0:94dbc6f9a730 29 while (1) {
tulanthoar 0:94dbc6f9a730 30 myled = !myled;
tulanthoar 0:94dbc6f9a730 31 wait(0.2);
tulanthoar 0:94dbc6f9a730 32 }
tulanthoar 0:94dbc6f9a730 33 }
tulanthoar 0:94dbc6f9a730 34
tulanthoar 0:94dbc6f9a730 35 while (1) {
tulanthoar 0:94dbc6f9a730 36 // Read temperature register
tulanthoar 0:94dbc6f9a730 37 data_write[0] = LM75_REG_TEMP;
tulanthoar 0:94dbc6f9a730 38 i2c.write(LM75_ADDR, data_write, 1, 1); // no stop
tulanthoar 0:94dbc6f9a730 39 i2c.read(LM75_ADDR, data_read, 2, 0);
tulanthoar 0:94dbc6f9a730 40
tulanthoar 0:94dbc6f9a730 41 // Calculate temperature value in Celcius
tulanthoar 0:94dbc6f9a730 42 int tempval = (int)((int)data_read[0] << 8) | data_read[1];
tulanthoar 0:94dbc6f9a730 43 tempval >>= 7;
tulanthoar 0:94dbc6f9a730 44 if (tempval <= 256) {
tulanthoar 0:94dbc6f9a730 45 TempCelsiusDisplay[0] = '+';
tulanthoar 0:94dbc6f9a730 46 } else {
tulanthoar 0:94dbc6f9a730 47 TempCelsiusDisplay[0] = '-';
tulanthoar 0:94dbc6f9a730 48 tempval = 512 - tempval;
tulanthoar 0:94dbc6f9a730 49 }
tulanthoar 0:94dbc6f9a730 50
tulanthoar 0:94dbc6f9a730 51 // Decimal part (0.5°C precision)
tulanthoar 0:94dbc6f9a730 52 if (tempval & 0x01) {
tulanthoar 0:94dbc6f9a730 53 TempCelsiusDisplay[5] = 0x05 + 0x30;
tulanthoar 0:94dbc6f9a730 54 } else {
tulanthoar 0:94dbc6f9a730 55 TempCelsiusDisplay[5] = 0x00 + 0x30;
tulanthoar 0:94dbc6f9a730 56 }
tulanthoar 0:94dbc6f9a730 57
tulanthoar 0:94dbc6f9a730 58 // Integer part
tulanthoar 0:94dbc6f9a730 59 tempval >>= 1;
tulanthoar 0:94dbc6f9a730 60 TempCelsiusDisplay[1] = (tempval / 100) + 0x30;
tulanthoar 0:94dbc6f9a730 61 TempCelsiusDisplay[2] = ((tempval % 100) / 10) + 0x30;
tulanthoar 0:94dbc6f9a730 62 TempCelsiusDisplay[3] = ((tempval % 100) % 10) + 0x30;
tulanthoar 0:94dbc6f9a730 63
tulanthoar 0:94dbc6f9a730 64 // Display result
tulanthoar 0:94dbc6f9a730 65 pc.printf("temp = %s\n", TempCelsiusDisplay);
tulanthoar 0:94dbc6f9a730 66 myled = !myled;
tulanthoar 0:94dbc6f9a730 67 wait(1.0);
tulanthoar 0:94dbc6f9a730 68 }
tulanthoar 0:94dbc6f9a730 69
tulanthoar 0:94dbc6f9a730 70 }
tulanthoar 0:94dbc6f9a730 71