/* Title: I2C_Master_Software_1.ino Author: Florin Dragan florind@mas.utcluj.ro Date Created: 01-10-2017 Last Modified: 02-03-2020 Purpose: This is an example how to use I2C interface with Software implementation and Arduino functions */ #define SDA_Pin 2 //PD2 #define SCL_Pin 3 //PD3 void I2CInit() { digitalWrite(SDA_Pin, 1); digitalWrite(SCL_Pin, 1); } void I2CStart() { digitalWrite(SDA_Pin, 0); digitalWrite(SCL_Pin, 0); } void I2CRestart() { digitalWrite(SDA_Pin, 1); digitalWrite(SCL_Pin, 1); digitalWrite(SDA_Pin, 0); digitalWrite(SCL_Pin, 0); } void I2CStop() { digitalWrite(SCL_Pin, 0); digitalWrite(SDA_Pin, 0); digitalWrite(SCL_Pin, 1); digitalWrite(SDA_Pin, 1); } void I2CAck() { digitalWrite(SDA_Pin, 0); digitalWrite(SCL_Pin, 1); digitalWrite(SCL_Pin, 0); digitalWrite(SDA_Pin, 1); } void I2CNak() { digitalWrite(SDA_Pin, 1); digitalWrite(SCL_Pin, 1); digitalWrite(SCL_Pin, 0); digitalWrite(SDA_Pin, 1); } unsigned char I2CSend(unsigned char Data) { unsigned char i, ack_bit; for (i = 0; i < 8; i++) { if ((Data & 0x80) == 0) digitalWrite(SDA_Pin, 0); else digitalWrite(SDA_Pin, 1); digitalWrite(SCL_Pin, 1); digitalWrite(SCL_Pin, 0); Data<<=1; } digitalWrite(SDA_Pin, 1); digitalWrite(SCL_Pin, 1); ack_bit = digitalRead(SDA_Pin); digitalWrite(SCL_Pin, 0); return ack_bit; } unsigned char I2CRead() { unsigned char i, Data=0; for (i = 0; i < 8; i++) { digitalWrite(SCL_Pin, 1); if(digitalRead(SDA_Pin)) Data |=1; if(i<7) Data<<=1; digitalWrite(SCL_Pin, 0); } return Data; } int main(void) { unsigned char ack, data; /***************************************** * Write to slave device with * slave address e.g. say 0x20 *****************************************/ /* Init i2c ports first */ I2CInit(); /* Send start condition */ I2CStart(); /* Send slave address */ ack = I2CSend(0x20); /* * ack == 1 => NAK * ack == 0 => ACK */ ack = I2CSend(0x07); /* Send another data */ ack = I2CSend(0x10); /* Send stop condition */ I2CStop(); /***************************************** * Read from slave device with * slave address e.g. say 0x20 *****************************************/ /* Init i2c ports first - Should be done once in main */ I2CInit(); /* Send start condition */ I2CStart(); /* * Send slave address with Read bit set * So address is 0x20 | 1 = 0x21 */ I2CSend(0x21); data = I2CRead(); /* Send ack */ I2CAck(); /* Read last byte */ data = I2CRead(); /* * Send nak for last byte to indicate * End of transmission */ I2CNak(); /* Send stop condition */ I2CStop(); }