#include <Arduino.h>
#include <Wire.h>
char SDAk = 20;
char SCLk = 21;
void I2c_start(void)
{
// start bit
pinMode(SDAk, OUTPUT);
digitalWrite(SDAk, LOW);
delayMicroseconds(100);
pinMode(SCLk, OUTPUT);
digitalWrite(SCLk, LOW);
delayMicroseconds(100);
}
void I2c_stop(void)
{
pinMode(SCLk, INPUT);
delayMicroseconds(100);
pinMode(SDAk, INPUT);
delayMicroseconds(100);
}
void I2c_clock_pulse(void)
{
pinMode(SCLk, INPUT);
delayMicroseconds(100);
pinMode(SCLk, OUTPUT); digitalWrite(SCLk, LOW);
delayMicroseconds(100);
}
unsigned char I2c_write(unsigned char dat)
{
unsigned char ctr;
unsigned char ak;
// msb first
for (ctr = 0; ctr < 8; ctr++)
{
if (dat & 128){ pinMode(SDAk, INPUT);}
else{ pinMode(SDAk, OUTPUT); digitalWrite(SDAk, LOW); }delayMicroseconds(100);
I2c_clock_pulse();
dat = dat << 1;
}
// listen for ack
pinMode(SDAk, INPUT);
ak = !digitalRead(SDAk);
pinMode(SDAk, OUTPUT); digitalWrite(SDAk, LOW);
I2c_clock_pulse();
return ak;
}
unsigned char I2c_read(void)
{
unsigned char r = 0;
unsigned char ctr = 0;
pinMode(SDAk, INPUT);
for (ctr = 0; ctr < 8; ctr++)
{
r = r * 2;
if (digitalRead(SDAk) == 1){ r += 1; } delayMicroseconds(100);
I2c_clock_pulse();
}
// send ack
pinMode(SDAk, OUTPUT); digitalWrite(SDAk, LOW); delayMicroseconds(100);
I2c_clock_pulse();
return r;
}
void I2c_setup(void)
{
unsigned char cnt;
// port outpuut
pinMode(SCLk, INPUT);
pinMode(SDAk, INPUT);
delayMicroseconds(100);
Serial.println("Looking for 2-Wire devices...");
for (cnt = 1; cnt < 127; cnt++)
{
I2c_start();
if (I2c_write(cnt << 1)){ Serial.println(cnt); }
I2c_stop();
delay(100);
}
Serial.println("Done");
}
unsigned char I2C_WriteDeviceRegister(unsigned char I2C_device_address1, unsigned char buffer, unsigned char val)
{
unsigned char ack = 0;
I2c_start();
ack += I2c_write(I2C_device_address1 << 1);
ack += 2* I2c_write(buffer);
ack += 4* I2c_write(val);
I2c_stop();
delay(100);
return ack;
}
unsigned char I2C_ReadDevice(unsigned char I2C_device_address1, unsigned char buffer, unsigned char return_bytes)
{
unsigned char ack = 0;
unsigned char ret = 0;
retry:
return_bytes = 1;
I2c_start();
ack += I2c_write(I2C_device_address1 << 1);
ack += 2 * I2c_write(buffer);
I2c_stop();
delay(100);
//if (ack < 4){ goto retry; }
I2c_start();
ack += 4 * I2c_write((I2C_device_address1 << 1) + 1);
ret = I2c_read();
I2c_stop();
delay(100);
return (ret);
}
void loop() {
uint8_t I2C_device_address = 0x0F;
uint8_t cnt = 0x0F;
unsigned int b = 0;
String s = "";
while (1){
begining:
pinMode(8, OUTPUT);
digitalWrite(22, HIGH);
//// TESTING I2C
Serial.println("new i2c:");
Serial.println(I2C_WriteDeviceRegister(I2C_device_address, 9, 123));
delay(1000);
Serial.println(I2C_ReadDevice(I2C_device_address, 9, 1));
delay(1000);
b = 0; s = "";
b += (I2C_ReadDevice(I2C_device_address, 5, 1)) * 256;
b += (I2C_ReadDevice(I2C_device_address, 6, 1));
s += "Capacitance = ";
s += b;
s += "\r\n";
Serial.println(s);
delay(1000);
goto begining;
}
}