(MBED) implementation of the I2C interface
Dependents: MCP23009tst AT30TSE752TST MCP4728setaddrProg mbedSerialInterface_talkback2 ... more
MBEDI2CInterface.h
- Committer:
- wbeaumont
- Date:
- 2019-09-10
- Revision:
- 3:06e9e208a2b0
- Parent:
- 2:b7ebe53e8fac
File content as of revision 3:06e9e208a2b0:
#ifndef __MBEDI2CINTERFACE_H #define __MBEDI2CINTERFACE_H #include <mbed_version.h> /* * This is a MBED implementation of the I2CInterface class * This file make part of the PeriperalDevice package see repository * https://github.com/wimbeaumont/PeripheralDevices * For more info see the README.md in the top of repository * version 1.10 :added wait_for_ms * version 1.21 : followed changes of I2CInterface for start stop frequency * version 1.30 : upated to mbed os5 interface should still work for mbed os2 * version 1.40 : implemented read_reg methode * version 1.41 : correction on implemented read_reg methode * version 1.50 : added comerr for I2C access * version 1.53 : correction on implemented read_reg methode * (C) Wim Beaumont Universiteit Antwerpen 2019 * * License see * https://github.com/wimbeaumont/PeripheralDevices/blob/master/LICENSE */ #include "I2CInterface.h" #define VERSION_MBEDI2CInterface_HDR "1.53" class MBEDI2CInterface :public I2CInterface { I2C i2cdev; public : MBEDI2CInterface(PinName sda, PinName scl): getVersion( VERSION_MBEDI2CInterface_HDR,VERSION_MBEDI2CInterface_HDR, __TIME__, __DATE__),i2cdev(sda,scl){ // no init code yet } ; // next could perhaps more efficient but not yet investigated virtual int frequency (int hz){ i2cdev.frequency(hz) ; return 0;}; virtual int read (int address, char *data, int length, bool repeated=false){ return comerr=i2cdev.read ( address, data, length, repeated); }; virtual int read (int& data, int ack){ data= i2cdev.read ( ack); return 0;};// Read a single byte from the I2C bus. // gererate a write (see write function_ with repeat is flase , writing the value reg to the device // the register size is in byte and has the be equal or smaller then the len (int) // it is assumed that the most significant byte off the regeister address is sent first virtual int read_reg( int address, char *data, int length, int reg, int regsize=1) { // first check the register size char regbytes[sizeof(int)]; if ( (unsigned int) regsize > sizeof(int) ) return -11; for ( int lc = regsize-1 ; lc >= 0 ; lc--) { regbytes[lc] = (char )( reg & 0xFF); reg = reg >>8; } comerr= i2cdev.write ( address, regbytes, regsize,true ); // no stop !! if ( comerr == 0) { comerr = i2cdev.read ( address, data, length, false); // now stop I2C } else { comerr= 10*comerr;//so -10 to get the difference with read error } return comerr; } virtual int write (int address, const char *data, int length, bool repeated=false){ return comerr=i2cdev.write ( address, data, length, repeated); } virtual int write (int data){return i2cdev.write (data);};// Write single byte out on the I2C bus. virtual int start (void){i2cdev.start (); return 0; };// Creates a start condition on the I2C bus. virtual int stop (void){i2cdev.stop(); return 0; };// Creates a stop condition on the I2C bus. #if DEVICE_I2C_ASYNCH virtual int transfer (int address, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, void* callbackfunction, bool repeated=false){ return comerr=i2cdev.transfer (address, tx_buffer, tx_length, rx_buffer, rx_length, callback, event, repeated); }; #else virtual int transfer (int address, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, void* callbackfunction, bool repeated=false){ return setnotsupported(); } #endif // new since mbed os 5 #if (MBED_MAJOR_VERSION > 4 ) #if DEVICE_I2C_ASYNCH virtual int abort_transfer(void) {i2cdev.abort_transfer();return 0;} // assumes it always works so return 0 #else virtual int abort_transfer(void) {return setnotsupported();} #endif virtual int lock(void) {i2cdev.lock(); return 0; } virtual int unlock(void) { i2cdev.unlock(); return 0; } #endif // mbed version // #else use the functions from the I2C interface virtual void wait_for_ms(int x) { wait_ms(x); } } ; #endif