BULME

Dependencies:   mbed LM75B

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 );
+}
+