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 mikroBasic PRO for dsPIC30/33 and PIC24 provides a library which supports the master I²C mode.

- 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 Routines
I2Cx_Init
Prototype |
sub procedure I2Cx_Init(dim scl as 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:
|
Parameters |
|
Returns |
Nothing. |
Requires |
MCU with the I²C module. |
Example |
' Initialize the I2C1 module with clock_rate=100000 I2C1_Init(100000) |
Notes |
Refer to the MCU's datasheet for correct values of the 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 |
sub 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 |
sub 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 |
sub function I2Cx_Is_Idle() as word |
---|---|
Description |
Waits for the I²C bus to become free. This is a blocking function. |
Parameters |
None. |
Returns |
|
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 |
dim data_ as byte ... if I2C1_Is_Idle() then I2C1_Write(data_) end if ... |
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 |
sub function I2Cx_Read(dim ack as word) as byte |
---|---|
Description |
Reads a byte from the I²C bus. |
Parameters |
|
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 |
dim take as 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 |
sub function I2Cx_Write(dim data_ as byte) as word |
---|---|
Description |
Sends data byte via the I²C bus. |
Parameters |
|
Returns |
|
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 |
dim data_ as byte error as 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 |
sub 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.
program I2C_Simple main: 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
What do you think about this topic ? Send us feedback!