Jack Hansdampf / LCD_i2c_GSOE

Dependents:   DigitaleingabeBluetooth_TI4 Temperatursever_TI4 BelueftungMitDS1820 ZustandCodeschloss ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SoftwareI2C.h Source File

SoftwareI2C.h

00001 /* 
00002  * mbed Library to use a software master i2c interface on any GPIO pins
00003  * Copyright (c) 2012 Christopher Pepper
00004  * Released under the MIT License: http://mbed.org/license/mit
00005  */
00006 
00007 #ifndef _SOFTWARE_I2C_H_
00008 #define _SOFTWARE_I2C_H_
00009 
00010 #include "mbed.h"
00011 
00012 /**
00013   * @brief SoftwareI2C class
00014   */
00015 
00016 class SoftwareI2C {
00017 public:
00018     SoftwareI2C(PinName sda, PinName scl);
00019     ~SoftwareI2C();
00020 
00021     void read(uint8_t device_address, uint8_t* data, uint8_t data_bytes);
00022     void write(uint8_t device_address, uint8_t* data,  uint8_t data_bytes);
00023     void write(uint8_t device_address, uint8_t byte);
00024     void randomRead(uint8_t device_address, uint8_t start_address, uint8_t* data, uint8_t data_bytes);
00025     void randomWrite(uint8_t device_address, uint8_t start_address, uint8_t* data, uint8_t data_bytes);
00026     void randomWrite(uint8_t device_address, uint8_t start_address, uint8_t byte);
00027     
00028     uint8_t read8(uint8_t device_address, uint8_t start_address);
00029     uint16_t read16(uint8_t device_address, uint8_t start_address);
00030     uint32_t read24(uint8_t device_address, uint8_t start_address);
00031     uint32_t read32(uint8_t device_address, uint8_t start_address);
00032     
00033     void setDeviceAddress(uint8_t address){
00034         _device_address = address;
00035     }
00036     
00037     void setFrequency(uint32_t frequency){
00038         _frequency_delay = 1000000 / frequency;
00039     }
00040 
00041     inline void initialise() {
00042         //masse=0;
00043         _scl.output();
00044         //GPIOA->OSPEEDR=0xFF3FFFFF;
00045         _sda.output();
00046         
00047         _sda = 1;
00048         _scl = 0;
00049         warte(_frequency_delay);
00050 
00051         for ( int n = 0; n <= 3; ++n ) {
00052             stop();
00053         }
00054     }
00055 
00056 private:
00057     void warte(int zeit)
00058     {
00059      for (int i=0;i<zeit*5;i++)
00060      {
00061       asm("nop\n\t");   
00062      }   
00063     }
00064     inline void start() {
00065         _sda.output();
00066         warte(_frequency_delay);
00067         _scl = 1;
00068         _sda = 1;
00069         warte(_frequency_delay);
00070         _sda = 0;
00071         warte(_frequency_delay);
00072         _scl = 0;
00073         warte(_frequency_delay);
00074     }
00075 
00076     inline void stop() {
00077         _sda.output();
00078         warte(_frequency_delay);
00079         _sda = 0;
00080         warte(_frequency_delay);
00081         _scl = 1;
00082         warte(_frequency_delay);
00083         _sda = 1;
00084     }
00085 
00086     inline void putByte(uint8_t byte) {
00087         _sda.output();
00088         for ( int n = 8; n > 0; --n) {
00089             warte(_frequency_delay);
00090             _sda = byte & (1 << (n-1));
00091             warte(_frequency_delay); //2.12.21
00092             _scl = 1;
00093             warte(_frequency_delay);
00094             _scl = 0;
00095         }
00096         _sda = 1;
00097     }
00098 
00099     inline uint8_t getByte() {
00100         uint8_t byte = 0;
00101 
00102         _sda.input();          //release the data line
00103         _sda.mode(OpenDrain);
00104         
00105         warte(_frequency_delay);
00106 
00107         for ( int n = 8; n > 0; --n ) {
00108             _scl=1;            //set clock high
00109             warte(_frequency_delay);
00110             byte |= _sda << (n-1); //read the bit
00111             warte(_frequency_delay);
00112             _scl=0;            //set clock low
00113             warte(_frequency_delay);
00114         }
00115 
00116         _sda.output();         //take data line back
00117 
00118         return byte;
00119     }
00120 
00121     inline void giveAck() {
00122         _sda.output();
00123         warte(_frequency_delay);
00124         _sda = 0;
00125         warte(_frequency_delay); //2.12.21
00126         _scl = 1;
00127         warte(_frequency_delay);
00128         _scl = 0;
00129         _sda = 1;
00130 
00131     }
00132 
00133     inline bool getAck() {
00134         _sda.output();
00135         _sda = 1;
00136         _scl = 1;
00137         _sda.input();
00138         _sda.mode(OpenDrain);
00139         warte(_frequency_delay);
00140         _scl = 0;
00141 
00142         if(_sda != 0){return false;}
00143 
00144         warte(_frequency_delay);
00145         return true;
00146     }
00147 
00148     DigitalInOut _sda;
00149     DigitalInOut _scl;
00150     //DigitalOut masse(PA_10);
00151     //DigitalOut _scl;
00152     
00153     uint8_t _device_address;
00154     uint32_t _frequency_delay;
00155 };
00156 
00157 #endif