AVR-GCC Libraries
Macros | Functions
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 pfleu.nosp@m.ry@g.nosp@m.mx.ch http://tinyurl.com/peterfleury
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
for(;;);
}

Macros

#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 More...
 
void i2c_stop (void)
 Terminates the data transfer and releases the I2C bus. More...
 
unsigned char i2c_start (unsigned char addr)
 Issues a start condition and sends address and transfer direction. More...
 
unsigned char i2c_rep_start (unsigned char addr)
 Issues a repeated start condition and sends address and transfer direction. More...
 
void i2c_start_wait (unsigned char addr)
 Issues a start condition and sends address and transfer direction. More...
 
unsigned char i2c_write (unsigned char data)
 Send one byte to I2C device. More...
 
unsigned char i2c_readAck (void)
 read one byte from the I2C device, request more data from device More...
 
unsigned char i2c_readNak (void)
 read one byte from the I2C device, read is followed by a stop condition More...
 
unsigned char i2c_read (unsigned char ack)
 read one byte from the I2C device More...
 

Macro Definition 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

Returns
none
void i2c_stop ( void  )

Terminates the data transfer and releases the I2C bus.

Returns
none
unsigned char i2c_start ( unsigned char  addr)

Issues a start condition and sends address and transfer direction.

Parameters
addraddress and transfer direction of I2C device
Return values
0device accessible
1failed to access device
unsigned char i2c_rep_start ( unsigned char  addr)

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

Parameters
addraddress and transfer direction of I2C device
Return values
0device accessible
1failed 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
addraddress and transfer direction of I2C device
Returns
none
unsigned char i2c_write ( unsigned char  data)

Send one byte to I2C device.

Parameters
databyte to be transfered
Return values
0write successful
1write 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
ack1 send ack, request more data from device
0 send nak, read is followed by a stop condition
Returns
byte read from I2C device