1 /* Test DS1621 sur interface I2C GPIO Fonera (3/2008) */
2 /* Inspir de "Un bus i2c pour La Fonera" */
3 /* http://www.lefinnois.net/wp/index.php/2007/05/05/un-bus-i2c-pour-la-fonera/ */
5 /* Affichage de la t */
6 /* Par domos domos78<at>free<point>fr */
7 /* http://vesta.homelinux.net/ */
15 #include <sys/ioctl.h>
16 #include <linux/i2c-dev.h>
17 #include <linux/i2c.h>
19 #define I2C_SLAVE 0x0703 // Change slave address
24 #define DEVICE "/dev/i2c-0"
25 #define ds1621_addr 0x9E >> 1 // 0x4f - Address (A0+A1+A2 to Vcc)
28 /*------------------------------------------------------------------------------*/
30 /*------------------------------------------------------------------------------*/
33 if ((i2c_fd = open(DEVICE, O_RDWR)) < 0)
35 fprintf(stderr, "Erreur ouverture port: %s (%d)\n", strerror(errno), errno);
40 //-----------------------------------------------------------------------------
41 void SelectSlave(unsigned char slaveaddr)
43 if (ioctl(i2c_fd, I2C_SLAVE, slaveaddr) < 0)
45 fprintf(stderr, "Erreur selection esclave i2c: %s (%d)\n", strerror(errno), errno);
51 /*------------------------------------------------------------------------------*/
52 /* Fonctions DS1621 */
53 /*------------------------------------------------------------------------------*/
54 int i2c_init_ds1621(unsigned char addr)
62 res = write( i2c_fd, buff, 2 );
65 printf("Erreur init DS1621 addr 0x%x: '%s', Abandon programme !", addr, strerror(errno));
69 /* start temperature conversion */
72 write( i2c_fd, buff, 1 );
77 //-----------------------------------------------------------------------------
78 double i2c_gettemp_ds1621(unsigned char addr)
80 int k, count, slope, temp;
88 if ( write( i2c_fd, buff, 1 ) < 0 ) return 255 ; // Write retourne -1 et strerror(errno))='Remote I/O error' si adr. i2c non connecte.
91 /* Temperature reading (1 Celsius degree precision) */
93 write( i2c_fd, buff, 1 );
94 read(i2c_fd, buff, 1) ;
96 /* Counter reading (fraction of degree) ) */
98 write( i2c_fd, buff, 1 );
99 read(i2c_fd, buff, 1) ;
103 write( i2c_fd, buff, 1 );
104 read(i2c_fd, buff, 1) ;
109 k = temp*100-25+(100*(slope-count))/slope;
111 /* start temperature conversion */
113 write( i2c_fd, buff, 1 );
114 return (float)k/100 ;
118 /*------------------------------------------------------------------------------*/
119 int main ( int argc, char ** argv )
125 i2c_init_ds1621(ds1621_addr) ;
128 printf("%2.1f\n", i2c_gettemp_ds1621(ds1621_addr) ) ;
133 /*------------------------------------------------------------------------------*/