]> git.friedersdorff.com Git - max/tmk_keyboard.git/commitdiff
Converting files to Unix-like format
authorOleg Kostyuk <cub.uanic@gmail.com>
Sun, 8 Sep 2013 22:30:44 +0000 (01:30 +0300)
committerOleg Kostyuk <cub.uanic@gmail.com>
Sun, 8 Sep 2013 22:30:44 +0000 (01:30 +0300)
keyboard/ergodox/i2cmaster.h
keyboard/ergodox/twimaster.c

index 70f51fd30bd23b0950b11675387b3b02d0bc29cb..3917b9e6c006c25d2d091e392dc122b24fdda695 100644 (file)
-#ifndef _I2CMASTER_H\r
-#define _I2CMASTER_H   1\r
-/************************************************************************* \r
-* Title:    C include file for the I2C master interface \r
-*           (i2cmaster.S or twimaster.c)\r
-* Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury\r
-* File:     $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $\r
-* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3\r
-* Target:   any AVR device\r
-* Usage:    see Doxygen manual\r
-**************************************************************************/\r
-\r
-#ifdef DOXYGEN\r
-/**\r
- @defgroup pfleury_ic2master I2C Master library\r
- @code #include <i2cmaster.h> @endcode\r
-  \r
- @brief I2C (TWI) Master Software Library\r
-\r
- Basic routines for communicating with I2C slave devices. This single master \r
- implementation is limited to one bus master on the I2C bus. \r
-\r
- This I2c library is implemented as a compact assembler software implementation of the I2C protocol \r
- which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).\r
- Since the API for these two implementations is exactly the same, an application can be linked either against the\r
- software I2C implementation or the hardware I2C implementation.\r
-\r
- Use 4.7k pull-up resistor on the SDA and SCL pin.\r
\r
- Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module \r
- i2cmaster.S to your target when using the software I2C implementation ! \r
\r
- Adjust the  CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.\r
-\r
- @note \r
-    The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted \r
-    to GNU assembler and AVR-GCC C call interface.\r
-    Replaced the incorrect quarter period delays found in AVR300 with \r
-    half period delays. \r
-    \r
- @author Peter Fleury pfleury@gmx.ch  http://jump.to/fleury\r
-\r
- @par API Usage Example\r
-  The following code shows typical usage of this library, see example test_i2cmaster.c\r
-\r
- @code\r
-\r
- #include <i2cmaster.h>\r
-\r
-\r
- #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet\r
-\r
- int main(void)\r
- {\r
-     unsigned char ret;\r
-\r
-     i2c_init();                             // initialize I2C library\r
-\r
-     // write 0x75 to EEPROM address 5 (Byte Write) \r
-     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode\r
-     i2c_write(0x05);                        // write address = 5\r
-     i2c_write(0x75);                        // write value 0x75 to EEPROM\r
-     i2c_stop();                             // set stop conditon = release bus\r
-\r
-\r
-     // read previously written value back from EEPROM address 5 \r
-     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode\r
-\r
-     i2c_write(0x05);                        // write address = 5\r
-     i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode\r
-\r
-     ret = i2c_readNak();                    // read one byte from EEPROM\r
-     i2c_stop();\r
-\r
-     for(;;);\r
- }\r
- @endcode\r
-\r
-*/\r
-#endif /* DOXYGEN */\r
-\r
-/**@{*/\r
-\r
-#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304\r
-#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"\r
-#endif\r
-\r
-#include <avr/io.h>\r
-\r
-/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */\r
-#define I2C_READ    1\r
-\r
-/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */\r
-#define I2C_WRITE   0\r
-\r
-\r
-/**\r
- @brief initialize the I2C master interace. Need to be called only once \r
- @param  void\r
- @return none\r
- */\r
-extern void i2c_init(void);\r
-\r
-\r
-/** \r
- @brief Terminates the data transfer and releases the I2C bus \r
- @param void\r
- @return none\r
- */\r
-extern void i2c_stop(void);\r
-\r
-\r
-/** \r
- @brief Issues a start condition and sends address and transfer direction \r
-  \r
- @param    addr address and transfer direction of I2C device\r
- @retval   0   device accessible \r
- @retval   1   failed to access device \r
- */\r
-extern unsigned char i2c_start(unsigned char addr);\r
-\r
-\r
-/**\r
- @brief Issues a repeated start condition and sends address and transfer direction \r
-\r
- @param   addr address and transfer direction of I2C device\r
- @retval  0 device accessible\r
- @retval  1 failed to access device\r
- */\r
-extern unsigned char i2c_rep_start(unsigned char addr);\r
-\r
-\r
-/**\r
- @brief Issues a start condition and sends address and transfer direction \r
-   \r
- If device is busy, use ack polling to wait until device ready \r
- @param    addr address and transfer direction of I2C device\r
- @return   none\r
- */\r
-extern void i2c_start_wait(unsigned char addr);\r
-\r
\r
-/**\r
- @brief Send one byte to I2C device\r
- @param    data  byte to be transfered\r
- @retval   0 write successful\r
- @retval   1 write failed\r
- */\r
-extern unsigned char i2c_write(unsigned char data);\r
-\r
-\r
-/**\r
- @brief    read one byte from the I2C device, request more data from device \r
- @return   byte read from I2C device\r
- */\r
-extern unsigned char i2c_readAck(void);\r
-\r
-/**\r
- @brief    read one byte from the I2C device, read is followed by a stop condition \r
- @return   byte read from I2C device\r
- */\r
-extern unsigned char i2c_readNak(void);\r
-\r
-/** \r
- @brief    read one byte from the I2C device\r
\r
- Implemented as a macro, which calls either i2c_readAck or i2c_readNak\r
\r
- @param    ack 1 send ack, request more data from device<br>\r
-               0 send nak, read is followed by a stop condition \r
- @return   byte read from I2C device\r
- */\r
-extern unsigned char i2c_read(unsigned char ack);\r
-#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak(); \r
-\r
-\r
-/**@}*/\r
-#endif\r
+#ifndef _I2CMASTER_H
+#define _I2CMASTER_H   1
+/************************************************************************* 
+* Title:    C include file for the I2C master interface 
+*           (i2cmaster.S or twimaster.c)
+* Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury
+* File:     $Id: i2cmaster.h,v 1.10 2005/03/06 22:39:57 Peter Exp $
+* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
+* Target:   any AVR device
+* Usage:    see Doxygen manual
+**************************************************************************/
+
+#ifdef DOXYGEN
+/**
+ @defgroup pfleury_ic2master I2C Master library
+ @code #include <i2cmaster.h> @endcode
+  
+ @brief I2C (TWI) Master Software Library
+
+ Basic routines for communicating with I2C slave devices. This single master 
+ implementation is limited to one bus master on the I2C bus. 
+
+ This I2c library is implemented as a compact assembler software implementation of the I2C protocol 
+ which runs on any AVR (i2cmaster.S) and as a TWI hardware interface for all AVR with built-in TWI hardware (twimaster.c).
+ Since the API for these two implementations is exactly the same, an application can be linked either against the
+ software I2C implementation or the hardware I2C implementation.
+
+ Use 4.7k pull-up resistor on the SDA and SCL pin.
+ Adapt the SCL and SDA port and pin definitions and eventually the delay routine in the module 
+ i2cmaster.S to your target when using the software I2C implementation ! 
+ Adjust the  CPU clock frequence F_CPU in twimaster.c or in the Makfile when using the TWI hardware implementaion.
+
+ @note 
+    The module i2cmaster.S is based on the Atmel Application Note AVR300, corrected and adapted 
+    to GNU assembler and AVR-GCC C call interface.
+    Replaced the incorrect quarter period delays found in AVR300 with 
+    half period delays. 
+    
+ @author Peter Fleury pfleury@gmx.ch  http://jump.to/fleury
+
+ @par API Usage Example
+  The following code shows typical usage of this library, see example test_i2cmaster.c
+
+ @code
+
+ #include <i2cmaster.h>
+
+
+ #define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet
+
+ int main(void)
+ {
+     unsigned char ret;
+
+     i2c_init();                             // initialize I2C library
+
+     // write 0x75 to EEPROM address 5 (Byte Write) 
+     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
+     i2c_write(0x05);                        // write address = 5
+     i2c_write(0x75);                        // write value 0x75 to EEPROM
+     i2c_stop();                             // set stop conditon = release bus
+
+
+     // read previously written value back from EEPROM address 5 
+     i2c_start_wait(Dev24C02+I2C_WRITE);     // set device address and write mode
+
+     i2c_write(0x05);                        // write address = 5
+     i2c_rep_start(Dev24C02+I2C_READ);       // set device address and read mode
+
+     ret = i2c_readNak();                    // read one byte from EEPROM
+     i2c_stop();
+
+     for(;;);
+ }
+ @endcode
+
+*/
+#endif /* DOXYGEN */
+
+/**@{*/
+
+#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
+#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
+#endif
+
+#include <avr/io.h>
+
+/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_READ    1
+
+/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
+#define I2C_WRITE   0
+
+
+/**
+ @brief initialize the I2C master interace. Need to be called only once 
+ @param  void
+ @return none
+ */
+extern void i2c_init(void);
+
+
+/** 
+ @brief Terminates the data transfer and releases the I2C bus 
+ @param void
+ @return none
+ */
+extern void i2c_stop(void);
+
+
+/** 
+ @brief Issues a start condition and sends address and transfer direction 
+  
+ @param    addr address and transfer direction of I2C device
+ @retval   0   device accessible 
+ @retval   1   failed to access device 
+ */
+extern unsigned char i2c_start(unsigned char addr);
+
+
+/**
+ @brief Issues a repeated start condition and sends address and transfer direction 
+
+ @param   addr address and transfer direction of I2C device
+ @retval  0 device accessible
+ @retval  1 failed to access device
+ */
+extern unsigned char i2c_rep_start(unsigned char addr);
+
+
+/**
+ @brief Issues a start condition and sends address and transfer direction 
+   
+ If device is busy, use ack polling to wait until device ready 
+ @param    addr address and transfer direction of I2C device
+ @return   none
+ */
+extern void i2c_start_wait(unsigned char addr);
+
+/**
+ @brief Send one byte to I2C device
+ @param    data  byte to be transfered
+ @retval   0 write successful
+ @retval   1 write failed
+ */
+extern unsigned char i2c_write(unsigned char data);
+
+
+/**
+ @brief    read one byte from the I2C device, request more data from device 
+ @return   byte read from I2C device
+ */
+extern unsigned char i2c_readAck(void);
+
+/**
+ @brief    read one byte from the I2C device, read is followed by a stop condition 
+ @return   byte read from I2C device
+ */
+extern unsigned char i2c_readNak(void);
+
+/** 
+ @brief    read one byte from the I2C device
+ Implemented as a macro, which calls either i2c_readAck or i2c_readNak
+ @param    ack 1 send ack, request more data from device<br>
+               0 send nak, read is followed by a stop condition 
+ @return   byte read from I2C device
+ */
+extern unsigned char i2c_read(unsigned char ack);
+#define i2c_read(ack)  (ack) ? i2c_readAck() : i2c_readNak(); 
+
+
+/**@}*/
+#endif
index f0d850c25710efb1ee67269d2f9edfb261fedc96..a4dc5c11ad2525c6574cfa41b3384eead29f54ff 100644 (file)
-/*************************************************************************\r
-* Title:    I2C master library using hardware TWI interface\r
-* Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury\r
-* File:     $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $\r
-* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3\r
-* Target:   any AVR device with hardware TWI \r
-* Usage:    API compatible with I2C Software Library i2cmaster.h\r
-**************************************************************************/\r
-#include <inttypes.h>\r
-#include <compat/twi.h>\r
-\r
-#include <i2cmaster.h>\r
-\r
-\r
-/* define CPU frequency in Mhz here if not defined in Makefile */\r
-#ifndef F_CPU\r
-#define F_CPU 4000000UL\r
-#endif\r
-\r
-/* I2C clock in Hz */\r
-#define SCL_CLOCK  100000L\r
-\r
-\r
-/*************************************************************************\r
- Initialization of the I2C bus interface. Need to be called only once\r
-*************************************************************************/\r
-void i2c_init(void)\r
-{\r
-  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */\r
-  \r
-  TWSR = 0;                         /* no prescaler */\r
-  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */\r
-\r
-}/* i2c_init */\r
-\r
-\r
-/*************************************************************************     \r
-  Issues a start condition and sends address and transfer direction.\r
-  return 0 = device accessible, 1= failed to access device\r
-*************************************************************************/\r
-unsigned char i2c_start(unsigned char address)\r
-{\r
-    uint8_t   twst;\r
-\r
-       // send START condition\r
-       TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);\r
-\r
-       // wait until transmission completed\r
-       while(!(TWCR & (1<<TWINT)));\r
-\r
-       // check value of TWI Status Register. Mask prescaler bits.\r
-       twst = TW_STATUS & 0xF8;\r
-       if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;\r
-\r
-       // send device address\r
-       TWDR = address;\r
-       TWCR = (1<<TWINT) | (1<<TWEN);\r
-\r
-       // wail until transmission completed and ACK/NACK has been received\r
-       while(!(TWCR & (1<<TWINT)));\r
-\r
-       // check value of TWI Status Register. Mask prescaler bits.\r
-       twst = TW_STATUS & 0xF8;\r
-       if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;\r
-\r
-       return 0;\r
-\r
-}/* i2c_start */\r
-\r
-\r
-/*************************************************************************\r
- Issues a start condition and sends address and transfer direction.\r
- If device is busy, use ack polling to wait until device is ready\r
\r
- Input:   address and transfer direction of I2C device\r
-*************************************************************************/\r
-void i2c_start_wait(unsigned char address)\r
-{\r
-    uint8_t   twst;\r
-\r
-\r
-    while ( 1 )\r
-    {\r
-           // send START condition\r
-           TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);\r
-    \r
-       // wait until transmission completed\r
-       while(!(TWCR & (1<<TWINT)));\r
-    \r
-       // check value of TWI Status Register. Mask prescaler bits.\r
-       twst = TW_STATUS & 0xF8;\r
-       if ( (twst != TW_START) && (twst != TW_REP_START)) continue;\r
-    \r
-       // send device address\r
-       TWDR = address;\r
-       TWCR = (1<<TWINT) | (1<<TWEN);\r
-    \r
-       // wail until transmission completed\r
-       while(!(TWCR & (1<<TWINT)));\r
-    \r
-       // check value of TWI Status Register. Mask prescaler bits.\r
-       twst = TW_STATUS & 0xF8;\r
-       if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) \r
-       {           \r
-           /* device busy, send stop condition to terminate write operation */\r
-               TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);\r
-               \r
-               // wait until stop condition is executed and bus released\r
-               while(TWCR & (1<<TWSTO));\r
-               \r
-           continue;\r
-       }\r
-       //if( twst != TW_MT_SLA_ACK) return 1;\r
-       break;\r
-     }\r
-\r
-}/* i2c_start_wait */\r
-\r
-\r
-/*************************************************************************\r
- Issues a repeated start condition and sends address and transfer direction \r
-\r
- Input:   address and transfer direction of I2C device\r
\r
- Return:  0 device accessible\r
-          1 failed to access device\r
-*************************************************************************/\r
-unsigned char i2c_rep_start(unsigned char address)\r
-{\r
-    return i2c_start( address );\r
-\r
-}/* i2c_rep_start */\r
-\r
-\r
-/*************************************************************************\r
- Terminates the data transfer and releases the I2C bus\r
-*************************************************************************/\r
-void i2c_stop(void)\r
-{\r
-    /* send stop condition */\r
-       TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);\r
-       \r
-       // wait until stop condition is executed and bus released\r
-       while(TWCR & (1<<TWSTO));\r
-\r
-}/* i2c_stop */\r
-\r
-\r
-/*************************************************************************\r
-  Send one byte to I2C device\r
-  \r
-  Input:    byte to be transfered\r
-  Return:   0 write successful \r
-            1 write failed\r
-*************************************************************************/\r
-unsigned char i2c_write( unsigned char data )\r
-{      \r
-    uint8_t   twst;\r
-    \r
-       // send data to the previously addressed device\r
-       TWDR = data;\r
-       TWCR = (1<<TWINT) | (1<<TWEN);\r
-\r
-       // wait until transmission completed\r
-       while(!(TWCR & (1<<TWINT)));\r
-\r
-       // check value of TWI Status Register. Mask prescaler bits\r
-       twst = TW_STATUS & 0xF8;\r
-       if( twst != TW_MT_DATA_ACK) return 1;\r
-       return 0;\r
-\r
-}/* i2c_write */\r
-\r
-\r
-/*************************************************************************\r
- Read one byte from the I2C device, request more data from device \r
\r
- Return:  byte read from I2C device\r
-*************************************************************************/\r
-unsigned char i2c_readAck(void)\r
-{\r
-       TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);\r
-       while(!(TWCR & (1<<TWINT)));    \r
-\r
-    return TWDR;\r
-\r
-}/* i2c_readAck */\r
-\r
-\r
-/*************************************************************************\r
- Read one byte from the I2C device, read is followed by a stop condition \r
\r
- Return:  byte read from I2C device\r
-*************************************************************************/\r
-unsigned char i2c_readNak(void)\r
-{\r
-       TWCR = (1<<TWINT) | (1<<TWEN);\r
-       while(!(TWCR & (1<<TWINT)));\r
-       \r
-    return TWDR;\r
-\r
-}/* i2c_readNak */\r
+/*************************************************************************
+* Title:    I2C master library using hardware TWI interface
+* Author:   Peter Fleury <pfleury@gmx.ch>  http://jump.to/fleury
+* File:     $Id: twimaster.c,v 1.3 2005/07/02 11:14:21 Peter Exp $
+* Software: AVR-GCC 3.4.3 / avr-libc 1.2.3
+* Target:   any AVR device with hardware TWI 
+* Usage:    API compatible with I2C Software Library i2cmaster.h
+**************************************************************************/
+#include <inttypes.h>
+#include <compat/twi.h>
+
+#include <i2cmaster.h>
+
+
+/* define CPU frequency in Mhz here if not defined in Makefile */
+#ifndef F_CPU
+#define F_CPU 4000000UL
+#endif
+
+/* I2C clock in Hz */
+#define SCL_CLOCK  100000L
+
+
+/*************************************************************************
+ Initialization of the I2C bus interface. Need to be called only once
+*************************************************************************/
+void i2c_init(void)
+{
+  /* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
+  
+  TWSR = 0;                         /* no prescaler */
+  TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */
+
+}/* i2c_init */
+
+
+/*************************************************************************     
+  Issues a start condition and sends address and transfer direction.
+  return 0 = device accessible, 1= failed to access device
+*************************************************************************/
+unsigned char i2c_start(unsigned char address)
+{
+    uint8_t   twst;
+
+       // send START condition
+       TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+
+       // wait until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
+
+       // send device address
+       TWDR = address;
+       TWCR = (1<<TWINT) | (1<<TWEN);
+
+       // wail until transmission completed and ACK/NACK has been received
+       while(!(TWCR & (1<<TWINT)));
+
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
+
+       return 0;
+
+}/* i2c_start */
+
+
+/*************************************************************************
+ Issues a start condition and sends address and transfer direction.
+ If device is busy, use ack polling to wait until device is ready
+ Input:   address and transfer direction of I2C device
+*************************************************************************/
+void i2c_start_wait(unsigned char address)
+{
+    uint8_t   twst;
+
+
+    while ( 1 )
+    {
+           // send START condition
+           TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
+    
+       // wait until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+    
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
+    
+       // send device address
+       TWDR = address;
+       TWCR = (1<<TWINT) | (1<<TWEN);
+    
+       // wail until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+    
+       // check value of TWI Status Register. Mask prescaler bits.
+       twst = TW_STATUS & 0xF8;
+       if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) ) 
+       {           
+           /* device busy, send stop condition to terminate write operation */
+               TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+               
+               // wait until stop condition is executed and bus released
+               while(TWCR & (1<<TWSTO));
+               
+           continue;
+       }
+       //if( twst != TW_MT_SLA_ACK) return 1;
+       break;
+     }
+
+}/* i2c_start_wait */
+
+
+/*************************************************************************
+ Issues a repeated start condition and sends address and transfer direction 
+
+ Input:   address and transfer direction of I2C device
+ Return:  0 device accessible
+          1 failed to access device
+*************************************************************************/
+unsigned char i2c_rep_start(unsigned char address)
+{
+    return i2c_start( address );
+
+}/* i2c_rep_start */
+
+
+/*************************************************************************
+ Terminates the data transfer and releases the I2C bus
+*************************************************************************/
+void i2c_stop(void)
+{
+    /* send stop condition */
+       TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
+       
+       // wait until stop condition is executed and bus released
+       while(TWCR & (1<<TWSTO));
+
+}/* i2c_stop */
+
+
+/*************************************************************************
+  Send one byte to I2C device
+  
+  Input:    byte to be transfered
+  Return:   0 write successful 
+            1 write failed
+*************************************************************************/
+unsigned char i2c_write( unsigned char data )
+{      
+    uint8_t   twst;
+    
+       // send data to the previously addressed device
+       TWDR = data;
+       TWCR = (1<<TWINT) | (1<<TWEN);
+
+       // wait until transmission completed
+       while(!(TWCR & (1<<TWINT)));
+
+       // check value of TWI Status Register. Mask prescaler bits
+       twst = TW_STATUS & 0xF8;
+       if( twst != TW_MT_DATA_ACK) return 1;
+       return 0;
+
+}/* i2c_write */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, request more data from device 
+ Return:  byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readAck(void)
+{
+       TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
+       while(!(TWCR & (1<<TWINT)));    
+
+    return TWDR;
+
+}/* i2c_readAck */
+
+
+/*************************************************************************
+ Read one byte from the I2C device, read is followed by a stop condition 
+ Return:  byte read from I2C device
+*************************************************************************/
+unsigned char i2c_readNak(void)
+{
+       TWCR = (1<<TWINT) | (1<<TWEN);
+       while(!(TWCR & (1<<TWINT)));
+       
+    return TWDR;
+
+}/* i2c_readNak */