I2C Master library


Detailed Description

I2C (TWI) Master Software Library.

 #include <i2cmaster.h> 

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
API Usage Example
The following code shows typical usage of this library, see example test_i2cmaster.c
 #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(;;);
 }


Defines

#define I2C_READ   1
#define I2C_WRITE   0
#define i2c_read(ack)   (ack) ? i2c_readAck() : i2c_readNak();

Functions

void i2c_init (void)
 initialize the I2C master interace. Need to be called only once
void i2c_stop (void)
 Terminates the data transfer and releases the I2C bus.
unsigned char i2c_start (unsigned char addr)
 Issues a start condition and sends address and transfer direction.
unsigned char i2c_rep_start (unsigned char addr)
 Issues a repeated start condition and sends address and transfer direction.
void i2c_start_wait (unsigned char addr)
 Issues a start condition and sends address and transfer direction.
unsigned char i2c_write (unsigned char data)
 Send one byte to I2C device.
unsigned char i2c_readAck (void)
 read one byte from the I2C device, request more data from device
unsigned char i2c_readNak (void)
 read one byte from the I2C device, read is followed by a stop condition
unsigned char i2c_read (unsigned char ack)
 read one byte from the I2C device


Define Documentation

#define I2C_READ   1
 

defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start()

#define I2C_WRITE   0
 

defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start()


Function Documentation

void i2c_init void   ) 
 

initialize the I2C master interace. Need to be called only once

Parameters:
void 
Returns:
none

void i2c_stop void   ) 
 

Terminates the data transfer and releases the I2C bus.

Parameters:
void 
Returns:
none

unsigned char i2c_start unsigned char  addr  ) 
 

Issues a start condition and sends address and transfer direction.

Parameters:
addr address and transfer direction of I2C device
Return values:
0 device accessible
1 failed to access device

unsigned char i2c_rep_start unsigned char  addr  ) 
 

Issues a repeated start condition and sends address and transfer direction.

Parameters:
addr address and transfer direction of I2C device
Return values:
0 device accessible
1 failed to access device

void i2c_start_wait unsigned char  addr  ) 
 

Issues a start condition and sends address and transfer direction.

If device is busy, use ack polling to wait until device ready

Parameters:
addr address and transfer direction of I2C device
Returns:
none

unsigned char i2c_write unsigned char  data  ) 
 

Send one byte to I2C device.

Parameters:
data byte to be transfered
Return values:
0 write successful
1 write failed

unsigned char i2c_readAck void   ) 
 

read one byte from the I2C device, request more data from device

Returns:
byte read from I2C device

unsigned char i2c_readNak void   ) 
 

read one byte from the I2C device, read is followed by a stop condition

Returns:
byte read from I2C device

unsigned char i2c_read unsigned char  ack  ) 
 

read one byte from the I2C device

Implemented as a macro, which calls either i2c_readAck or i2c_readNak

Parameters:
ack 1 send ack, request more data from device
0 send nak, read is followed by a stop condition
Returns:
byte read from I2C device


Generated on Tue Mar 29 16:54:08 2005 for AVR-GCC libraries by  doxygen 1.4.1