Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
SoftwareI2C.h
- Committer:
- p3p
- Date:
- 2012-04-01
- Revision:
- 0:6f6cfcdfe3d8
- Child:
- 2:8670e78c4b63
File content as of revision 0:6f6cfcdfe3d8:
/*
* mbed Library to use a software master i2c interface on any GPIO pins
* Copyright (c) 2012 Christopher Pepper
* Released under the MIT License: http://mbed.org/license/mit
*/
#ifndef _SOFTWARE_I2C_H_
#define _SOFTWARE_I2C_H_
#include "mbed.h"
/**
* @brief SoftwareI2C class
*/
class SoftwareI2C {
public:
SoftwareI2C(PinName sda, PinName scl);
~SoftwareI2C();
void read(uint8_t device_address, uint8_t* data, uint8_t data_bytes);
void write(uint8_t device_address, uint8_t* data, uint8_t data_bytes);
void write(uint8_t device_address, uint8_t byte);
void randomRead(uint8_t device_address, uint8_t start_address, uint8_t* data, uint8_t data_bytes);
void randomWrite(uint8_t device_address, uint8_t start_address, uint8_t* data, uint8_t data_bytes);
void randomWrite(uint8_t device_address, uint8_t start_address, uint8_t byte);
uint8_t read8(uint8_t device_address, uint8_t start_address);
uint16_t read16(uint8_t device_address, uint8_t start_address);
uint32_t read24(uint8_t device_address, uint8_t start_address);
uint32_t read32(uint8_t device_address, uint8_t start_address);
void setDeviceAddress(uint8_t address){
_device_address = address;
}
inline void initialise() {
_scl.output();
_sda.output();
_sda = 1;
_scl = 0;
wait_us(10);
for ( int n = 0; n <= 3; ++n ) {
stop();
}
}
private:
inline void start() {
_sda.output();
wait_us(1);
_scl = 1;
_sda = 1;
wait_us(1);
_sda = 0;
wait_us(1);
_scl = 0;
wait_us(1);
}
inline void stop() {
_sda.output();
wait_us(1);
_sda = 0;
wait_us(1);
_scl = 1;
wait_us(1);
_sda = 1;
}
inline void putByte(uint8_t byte) {
_sda.output();
for ( int n = 8; n > 0; --n) {
wait_us(1);
_sda = byte & (1 << (n-1));
_scl = 1;
wait_us(1);
_scl = 0;
}
_sda = 1;
}
inline uint8_t getByte() {
uint8_t byte = 0;
_sda.input(); //release the data line
_sda.mode(OpenDrain);
wait_us(1);
for ( int n = 8; n > 0; --n ) {
_scl=1; //set clock high
wait_us(1);
byte |= _sda << (n-1); //read the bit
wait_us(1);
_scl=0; //set clock low
wait_us(1);
}
_sda.output(); //take data line back
return byte;
}
inline void giveAck() {
_sda.output();
wait_us(1);
_sda = 0;
_scl = 1;
wait_us(1);
_scl = 0;
_sda = 1;
}
inline bool getAck() {
_sda.output();
_sda = 1;
_scl = 1;
_sda.input();
_sda.mode(OpenDrain);
wait_us(1);
_scl = 0;
if(_sda != 0){return false;}
wait_us(1);
return true;
}
DigitalInOut _sda;
DigitalInOut _scl;
uint8_t _device_address;
};
#endif