Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified LICENSE.txt
100644 → 100755
Empty file.
Empty file modified README.TXT
100644 → 100755
Empty file.
86 changes: 51 additions & 35 deletions SoftI2CMaster.cpp
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,15 @@
*
*/

#if (ARDUINO >= 100)

#include <Arduino.h>
#else
#include <WProgram.h>
#endif

#include "SoftI2CMaster.h"

#include <util/delay.h>
#include <string.h>

#define i2cbitdelay 50
#define i2cbitdelay 150

#define I2C_ACK 1
#define I2C_NAK 0
Expand Down Expand Up @@ -75,6 +72,11 @@ SoftI2CMaster::SoftI2CMaster(uint8_t sclPin, uint8_t sdaPin, uint8_t pullups)
i2c_init();
}

bool SoftI2CMaster::available()
{
return true;
}

//
// Turn Arduino pin numbers into PORTx, DDRx, and PINx
//
Expand Down Expand Up @@ -106,15 +108,15 @@ void SoftI2CMaster::setPins(uint8_t sclPin, uint8_t sdaPin, uint8_t pullups)
uint8_t SoftI2CMaster::beginTransmission(uint8_t address)
{
i2c_start();
uint8_t rc = i2c_write((address<<1) | 0); // clr read bit
uint8_t rc = i2c_write((address << 1) | 0); // clr read bit
return rc;
}

//
uint8_t SoftI2CMaster::requestFrom(uint8_t address)
{
i2c_start();
uint8_t rc = i2c_write((address<<1) | 1); // set read bit
uint8_t rc = i2c_write((address << 1) | 1); // set read bit
return rc;
}
//
Expand All @@ -123,6 +125,11 @@ uint8_t SoftI2CMaster::requestFrom(int address)
return requestFrom( (uint8_t) address);
}

uint8_t SoftI2CMaster::requestFrom(uint8_t address, uint8_t l)
{
return requestFrom( (uint8_t) address);
}

//
uint8_t SoftI2CMaster::beginTransmission(int address)
{
Expand All @@ -144,35 +151,56 @@ uint8_t SoftI2CMaster::endTransmission(void)
// or after beginTransmission(address)
uint8_t SoftI2CMaster::write(uint8_t data)
{
return i2c_write(data);
i2c_write(data);
return 1;
}

// must be called in:
// slave tx event callback
// or after beginTransmission(address)
void SoftI2CMaster::write(uint8_t* data, uint8_t quantity)
uint8_t SoftI2CMaster::write(uint8_t* data, uint8_t quantity)
{
int c = 0;
for(uint8_t i = 0; i < quantity; ++i){
write(data[i]);
c+=write(data[i]);
}
return c;
}

// must be called in:
// slave tx event callback
// or after beginTransmission(address)
void SoftI2CMaster::write(char* data)
uint8_t SoftI2CMaster::write(char* data)
{
write((uint8_t*)data, strlen(data));
return write((uint8_t*)data, strlen(data));
}

// must be called in:
// slave tx event callback
// or after beginTransmission(address)
void SoftI2CMaster::write(int data)
uint8_t SoftI2CMaster::write(int data)
{
write((uint8_t)data);
return write((uint8_t)data);
}


// FIXME: this isn't right, surely
uint8_t SoftI2CMaster::read( uint8_t ack )
{
return i2c_read( ack );
}

//
uint8_t SoftI2CMaster::read()
{
return i2c_read( I2C_ACK );
}

//
uint8_t SoftI2CMaster::readLast()
{
return i2c_read( I2C_NAK );
}
//--------------------------------------------------------------------


Expand All @@ -183,28 +211,27 @@ void SoftI2CMaster::i2c_writebit( uint8_t c )
} else {
i2c_sda_lo();
}
_delay_us(i2cbitdelay);

i2c_scl_hi();
_delay_us(i2cbitdelay);

i2c_scl_lo();
_delay_us(i2cbitdelay);

if ( c > 0 ) {
i2c_sda_lo();
}
_delay_us(i2cbitdelay);
}

//
uint8_t SoftI2CMaster::i2c_readbit(void)
{
i2c_sda_hi();
i2c_sda_hi(); // also set sda as an input
i2c_scl_hi();
_delay_us(i2cbitdelay);

uint8_t port = digitalPinToPort(_sdaPin);
volatile uint8_t* pinReg = portInputRegister(port);
//i2c_sda_release(); // normalement on l'a deja!

uint8_t c = *pinReg; // I2C_PIN;

i2c_scl_lo();
Expand Down Expand Up @@ -242,6 +269,8 @@ void SoftI2CMaster::i2c_start(void)

i2c_scl_lo();
_delay_us(i2cbitdelay);


}

void SoftI2CMaster::i2c_repstart(void)
Expand Down Expand Up @@ -269,6 +298,9 @@ void SoftI2CMaster::i2c_repstart(void)
//
void SoftI2CMaster::i2c_stop(void)
{
i2c_sda_lo();
_delay_us(i2cbitdelay);

i2c_scl_hi();
_delay_us(i2cbitdelay);

Expand Down Expand Up @@ -309,20 +341,4 @@ uint8_t SoftI2CMaster::i2c_read( uint8_t ack )
return res;
}

// FIXME: this isn't right, surely
uint8_t SoftI2CMaster::read( uint8_t ack )
{
return i2c_read( ack );
}

//
uint8_t SoftI2CMaster::read()
{
return i2c_read( I2C_ACK );
}

//
uint8_t SoftI2CMaster::readLast()
{
return i2c_read( I2C_NAK );
}
9 changes: 6 additions & 3 deletions SoftI2CMaster.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -53,16 +53,19 @@ class SoftI2CMaster
uint8_t beginTransmission(int address);
uint8_t endTransmission(void);
uint8_t write(uint8_t);
void write(uint8_t*, uint8_t);
void write(int);
void write(char*);
uint8_t write(uint8_t*, uint8_t);
uint8_t write(int);
uint8_t write(char*);
void begin(void) {return;};
uint8_t requestFrom(int address);
uint8_t requestFrom(uint8_t address);
uint8_t requestFrom(uint8_t address, uint8_t l);
uint8_t read( uint8_t ack );
uint8_t read();
uint8_t readLast();

bool available();

};

#endif
Empty file modified examples/BlinkMSoftI2CDemo/BlinkMSoftI2CDemo.ino
100644 → 100755
Empty file.
Empty file modified examples/BlinkMSoftI2CDemo/BlinkM_funcs_soft.h
100644 → 100755
Empty file.
Empty file modified examples/MMA8452Q_Example_SoftI2C/MMA8452Q_Example_SoftI2C.ino
100644 → 100755
Empty file.