I²C Library

The I²C full master I²C module is available with a number of the dsPIC30/33 and PIC24 MCU models. The mikroPascal PRO for dsPIC30/33 and PIC24 provides a library which supports the master I²C mode.


  Important :

Library Routines

I2Cx_Init

Prototype

procedure I2Cx_Init(scl : longint);

Description

Configures and initializes the desired I²C module with default settings.

This function enables the I²C module by setting the I2CEN bit. The rest of the bits in I²C control register remains unchanged. Default initialization (after reset) of I²C module is:

  • continue operation in IDLE mode
  • IPMI mode disabled
  • 7-bit slave address
  • slew rate control enabled
  • general call address disabled
  • software or receive clock stretching disabled

Parameters
  • scl: requested serial clock rate.
Returns

Nothing.

Requires

MCU with the I²C module.

Example
// Initialize the I2C1 module with clock_rate of 100000
I2C1_Init(100000);
Notes

Refer to the MCU's datasheet for correct values of the scl in respect with Fosc.

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

I2Cx_Start

Prototype

procedure I2Cx_Start();

Description

Determines if the I²C bus is free and issues START signal.

Parameters

None.

Returns

Nothing.

Requires

MCU with at least one I²C module.

Used I²C module must be initialized before using this function. See I2Cx_Init routine.

Example
// Issue START signal
I2C1_Start();
Notes

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

I2Cx_Restart

Prototype

procedure I2Cx_Restart();

Description

Issues repeated START signal.

Parameters

None.

Returns

Nothing.

Requires

MCU with at least one I²C module.

Used I²C module must be initialized before using this function. See I2Cx_Init routine.

Example
// Issue RESTART signal
I2C1_Restart();
Notes

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

I2Cx_Is_Idle

Prototype

function I2Cx_Is_Idle() : word;

Description

Waits for the I²C bus to become free. This is a blocking function.

Parameters

None.

Returns

  • 0 if I²C bus is free.
  • 1 if I²C bus is not free.

Requires

MCU with at least one I²C module.

Used I²C module must be initialized before using this function. See I2Cx_Init routine.

Example
var data_ : byte;
...
if !(I2C1_Is_Idle)
  I2C1_Write(data_);
...
Notes

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

I2Cx_Read

Prototype

function I2Cx_Read(ack : word) : byte;

Description

Reads a byte from the I²C bus.

Parameters
  • ack: acknowledge signal parameter. If the ack = 0, acknowledge signal will be sent after reading, otherwise the not acknowledge signal will be sent.
Returns

Received data.

Requires

MCU with at least one I²C module.

Used I²C module must be initialized before using this function. See I2Cx_Init routine.

Also, START signal needs to be issued in order to use this function. See I2Cx_Start.

Example
var take : byte;
...
// Read data and send the not_acknowledge signal
take := I2C1_Read(1);
Notes

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

I2Cx_Write

Prototype

function I2Cx_Write(data_ : byte) : word;

Description

Sends data byte via the I²C bus.

Parameters
  • data_: data to be sent
Returns

  • 0 if there were no errors.
  • 1 if write collision was detected on the I²C bus.

Requires

MCU with at least one I²C module.

Used I²C module must be initialized before using this function. See I2Cx_Init routine.

Also, START signal needs to be issued in order to use this function. See I2Cx_Start.

Example
var data_ : byte;
    error : word;
...
error := I2C1_Write(data_);
error := I2C1_Write(0xA3);
Notes

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

I2Cx_Stop

Prototype

procedure I2Cx_Stop();

Description

Issues STOP signal.

Parameters

None.

Returns

Nothing.

Requires

MCU with at least one I²C module.

Used I²C module must be initialized before using this function. See I2Cx_Init routine.

Example
// Issue STOP signal
I2C1_Stop();
Notes

I²C library routines require you to specify the module you want to use. To select the desired I²C module, simply change the letter x in the routine prototype for a number from 1 to 3.

Number of I²C modules per MCU differs from chip to chip. Please, read the appropriate datasheet before utilizing this library.

Library Example

This code demonstrates working with the I²C library. Program sends data to EEPROM (data is written at the address 2). After that, program reads data from the same EEPROM address and displays it on PORTB for visual check. See the figure below how to interface the 24C02 to dsPIC30/33 and PIC24.

Copy Code To ClipboardCopy Code To Clipboard
program I2C_Simple;

  begin
    ADPCFG := 0xFFFF;       // initialize AN pins as digital

    LATB := 0;
    TRISB := 0;             // Configure PORTB as output

    I2C1_Init(100000);      // initialize I2C communication
    I2C1_Start();           // issue I2C start signal
    I2C1_Write(0xA2);       // send byte via I2C  (device address + W)
    I2C1_Write(2);          // send byte (address of EEPROM location)
    I2C1_Write(0xAA);       // send data (data to be written)
    I2C1_Stop();            // issue I2C stop signal

    Delay_100ms();

    I2C1_Start();           // issue I2C start signal
    I2C1_Write(0xA2);       // send byte via I2C  (device address + W)
    I2C1_Write(2);          // send byte (data address)
    I2C1_Restart();         // issue I2C signal repeated start
    I2C1_Write(0xA3);       // send byte (device address + R)
    PORTB := I2C1_Read(1);  // Read the data (NO acknowledge)
    I2C1_Stop();            // issue I2C stop signal
  end.	

HW Connection

Interfacing 24c02 to dsPIC30/33 and PIC24 via I²C

Interfacing 24c02 to dsPIC30/33 and PIC24 via I²C

Copyright (c) 2002-2012 mikroElektronika. All rights reserved.
What do you think about this topic ? Send us feedback!
Want more examples and libraries? 
Find them on LibStock - A place for the code