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.
Dependents: DigitaleingabeBluetooth_TI4 Temperatursever_TI4 BelueftungMitDS1820 ZustandCodeschloss ... more
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
Generated on Mon Jul 18 2022 14:47:38 by
1.7.2