The I²C full master
MSSP module is
available with a number of PIC MCU models. mikroC PRO for PIC provides library
which supports the master I²C mode.
Important :
- Some MCUs have multiple I²C modules. In order to use the
desired I²C library routine,
simply change the number
1
in the prototype with the appropriate module number, i.e.I2C2_Init(100000);
Library Routines
- I2C1_Init
- I2C1_Start
- I2C1_Repeated_Start
- I2C1_Is_Idle
- I2C1_Rd
- I2C1_Wr
- I2C1_Stop
I2C1_Init
Prototype | void I2C1_Init(const unsigned long clock); |
---|---|
Returns | Nothing. |
Description |
Initializes I²C with
desired clock (refer to device data sheet for correct values in
respect with Fosc). Needs to be called before using other functions of
I²C Library.You don’t need to configure ports manually for using the module; library will take care of the initialization. |
Requires |
Library requires MSSP module.
Note : Calculation of the I²C clock
value is carried out by the compiler, as it would produce a relatively large
code if performed on the library level. Therefore, compiler needs to know the
value of the parameter in the compile time. That is why this parameter needs to
be a constant, and not a variable.
|
Example | I2C1_Init(100000); |
I2C1_Start
Prototype | unsigned short I2C1_Start(void); |
---|---|
Returns | If there is no error, function returns 0. |
Description | Determines if I²C bus is free and issues START signal. |
Requires | I²C must be configured before using this function. |
Example | I2C1_Start(); |
I2C1_Repeated_Start
Prototype | void I2C1_Repeated_Start(void); |
---|---|
Returns | Nothing. |
Description | Issues repeated START signal. |
Requires | I²C must be configured before using this function. |
Example | I2C1_Repeated_Start(); |
I2C1_Is_Idle
Prototype | unsigned short I2C1_Is_Idle(void); |
---|---|
Returns | Returns 1 if I²C bus is free, otherwise returns 0. |
Description | Tests if I²C bus is free. |
Requires | I²C must be configured before using this function. |
Example | if (I2C1_Is_Idle()) {...} |
I2C1_Rd
Prototype | unsigned short I2C1_Rd(unsigned short ack); |
---|---|
Returns | Returns one byte from the slave. |
Description |
Reads one byte from the slave, and sends not acknowledge signal if
parameter ack is 0, otherwise it sends
acknowledge. |
Requires |
I²C must be configured
before using this function. Also, START signal needs to be issued in order to use this function. |
Example |
Read data and send not acknowledge signal:unsigned short take; ... take = I2C1_Rd(0); |
I2C1_Wr
Prototype | unsigned short I2C1_Wr(unsigned short data_); |
---|---|
Returns | Returns 0 if there were no errors. |
Description |
Sends data byte (parameter data ) via I²C bus. |
Requires |
I²C must be configured
before using this function. Also, START signal needs to be issued in order to use this function. |
Example | I2C1_Write(0xA3); |
I2C1_Stop
Prototype | void I2C1_Stop(void); |
---|---|
Returns | Nothing. |
Description | Issues STOP signal. |
Requires | I²C must be configured before using this function. |
Example | I2C1_Stop(); |
Code Example
This code demonstrates use of I²C library. PIC MCU is connected
(SCL, SDA pins) to 24c02 EEPROM.
Program sends data to EEPROM
(data is written at address 2). Then, we read data via I²C from EEPROM and send
its value to PORTB, to check if the cycle was successful (see the figure below
how to interface 24c02 to PIC).
void main(){
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
PORTB = 0;
TRISB = 0; // Configure PORTB as output
I2C1_Init(100000); // initialize I2C communication
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(2); // send byte (address of EEPROM location)
I2C1_Wr(0xAA); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
Delay_100ms();
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(2); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA3); // send byte (device address + R)
PORTB = I2C1_Rd(0u); // Read the data (NO acknowledge)
I2C1_Stop(); // issue I2C stop signal
}
No comments:
Post a Comment