Professional Documents
Culture Documents
I2C BUS
Rp
Rp
BUT: 16 reserved addresses maximum 112 nodes canEEPROM MCU Sensor ADC Master Slave Slave Slave communicate on the same bus
MCU Slave
127 Slaves
IC (Inter-Integrated Circuit)
MODE SPEED Standard mode: 100 kbit/s
Low-speed mode: 10kbit/s Fast mode: Fast mode plus: 400 kbit/s 1 Mbit/s
IC (Inter-Integrated Circuit)
Idle Status
Transper data
Start sequence
Stop sequence
ReStart sequence
Stop sequence
Write
Read
NAK
AK
AK NAK
AK
= 0 = 1
AK
AK
AK
AK
NAK
Write
AK
AK
AK
IC (Inter-Integrated Circuit)
IC (Inter-Integrated Circuit)
TRIAC Module
IC (Inter-Integrated Circuit) In PIC 16F887 MASTER SYNCHRONOUS SERIAL PORT (MSSP) MODULE MCU can be Master or Slave on I2C Bus 7-bit and 10-bit addressing
// Send Start sequence to Slave void i2c_start(); // Send Stop sequence to Slave void i2c_stop(); // Initialize i2c module void i2c_init(); unsigned char i2c_read(unsigned char ack); // ack = 1: Not Acknowledge // ack = 0: Acknowledge unsigned char i2c_write(unsigned char d); // d: 8-bit data
IC (Inter-Integrated Circuit) i2c_init function in i2c.c (Hi-tech PIC) void i2c_init() { RC3 = 1; RC4 = 1; TRISC3 = 1; TRISC4 = 1; //control by MSSP SSPADD = 9;// Baudrate = Fosc/4/(SSPADDR+1) SMP = 1; // slew rate control disabled for 100KHz baudrate SSPCON2 = 0; SSPCON = 0x28; //I2C Master Hardware mode }
IC (Inter-Integrated Circuit) #include i2c.h How to write Hi-tech C code for I2C module
// DS1307 7-bit address = 0b 110 1000 = 0x68 #define SLAVE_ADD 0x68 #define READ 1 #define WRITE 0 void main() { i2c_init(); }
IC (Inter-Integrated Circuit) How to write Hi-tech C code for I2C module Example: Read multi-byte //Send Start condition i2c_start(); //Send Slave address + WRITE command i2c_write((SLAVE_ADD<<1)|WRITE)); // ((SLAVE_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0 //Send register address (register of Slave the first register need to read data) i2c_write(0x00); //ReStart condition i2c_stop(); i2c_start();
IC (Inter-Integrated Circuit) How to write Hi-tech C code for I2C module Example: Read multi-byte <cont.> //Send Slave address + READ command i2c_write((SLAVE_ADD<<1)|READ)); // ((SLAVE_ADD<<1)| READ) = ((0x68<<1)|1) = 0xD1 //read data //unsigned char i2c_read(unsigned char ack); data_array[0] = i2c_read(0); //1st byte and ACK data_array[1] = i2c_read(0); //2nd byte and ACK data_array[2] = i2c_read(1); //3rd byte and NACK