Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of app-shield-LM75B by
Diff: main.cpp
- Revision:
- 0:ce7a8546502b
- Child:
- 1:6484448034e3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Jan 16 02:41:51 2010 +0000 @@ -0,0 +1,140 @@ +/* + * NXP LM75B temperature sensor test + * www.nxp.com/pip/LM75B_2.html + * + * Expecting to use the pins 9 and 10 for I2C bus + * these pins should be pulled-up properly. + * + * The temperature read out will be shown on terminal on the PC screen. + * + * In this demo code, two LM75B devices can be driven. + * These two devices should have different I2C address setting + * using its address pins (LM75B's A0 to A2 (pins 5 to 7)). + * One LM75B should have all those pins tied to GND. + * And another should have the pin A0(pin7) pulled-up. + * + * From the software, those devices can be accessed by I2C addresses + * "0x90" and "0x92". + * It will not be as "0x90" and "0x91" because the address has + * 7 bit only and stuffed to left. So the "A0" setting become 0xX2. + * The LSB does not care because it will be set by I2C libraly when + * it transfer the data for read and write. + */ + +#include "mbed.h" +//#include "SDFileSystem.h" + +// LM75B IIC address +#define LM75B_ADDR 0x90 + +// LM75B registers +#define Conf 0x01 +#define Temp 0x00 +#define Tos 0x03 +#define Thyst 0x02 + + +DigitalOut led[] = { LED4, LED3, LED2, LED1 }; +Serial pc(USBTX, USBRX); // tx, rx + +I2C i2c( p9, p10 ); // sda, scl + + +void iic_write( char addr, char reg, char data ); +char iic_read( char addr, char reg ); +short iic_read_short( char addr, char reg ); +void iic_error( void ); + +void init_temp_sensor( char dev_num ); +float get_temp( char dev_num ); + +int main() { + int i; + + init_temp_sensor( 0 ); + init_temp_sensor( 1 ); + + while(1) { + pc.printf( " (%d) temp[0]=%6.3f, temp[1]=%6.3f(degree-C)\n", i++, get_temp( 0 ), get_temp( 1 ) ); + wait( 1 ); + } +} + +void init_temp_sensor( char dev_num ) +{ + dev_num <<= 1; + + iic_write( LM75B_ADDR | dev_num, Conf, 0x00 ); // configuration + pc.printf( "sensor[%d] : Conf register read out = 0x%02X\n", dev_num, iic_read( LM75B_ADDR | dev_num, Conf ) ); + pc.printf( "sensor[%d] : Tos register read out = 0x%04X\n", dev_num, iic_read_short( LM75B_ADDR | dev_num, Tos ) ); + pc.printf( "sensor[%d] : Thyst register read out = 0x%04X\n", dev_num, iic_read_short( LM75B_ADDR | dev_num, Thyst ) ); +} + + +float get_temp( char dev_num ) +{ + dev_num <<= 1; + + return ( (float)(iic_read_short( LM75B_ADDR | dev_num, Temp )) / 256.0 ); +} + +void iic_write( char addr, char reg, char data ) +{ + char cmd[2]; + + cmd[ 0 ] = reg; + cmd[ 1 ] = data; + + if ( i2c.write( addr, cmd, 2) ) + iic_error(); +} + +char iic_read( char addr, char reg ) +{ + char cmd; + int nack; + + cmd = reg; + + nack = i2c.write( addr, &cmd, 1); // Send command string + nack |= i2c.read( addr, &cmd, 1); // Send command string + + if ( nack ) + iic_error(); + + return ( cmd ); +} + + +short iic_read_short( char addr, char reg ) +{ + char cmd[ 2 ]; + int nack; + + cmd[ 0 ] = reg; + + nack = i2c.write( addr, cmd, 1); // Send command string + nack |= i2c.read( addr, cmd, 2); // Send command string + + if ( nack ) + iic_error(); + + return ( ((short)cmd[ 0 ]) << 8 | cmd[ 1 ] ); +} + + +void iic_error( void ) +{ + pc.printf( "I2C error\n" ); + + for ( int i = 0; i < 4; i++ ) + led[ i ] = i & 0x01; + + wait ( 0.2 ); + + for ( int i = 0; i < 4; i++ ) + led[ i ] = !(i & 0x01); + + wait ( 0.2 ); +} +