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: YATTT sd_map_test cPong SnowDemo ... more
PokittoLib
Library for programming Pokitto hardware
How to Use
- Import this library to online compiler (see button "import" on the right hand side
- DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
- Change My_settings.h according to your project
- Start coding!
Diff: POKITTO_HW/SoftwareI2C.h
- Revision:
- 52:c04087025cab
- Parent:
- 31:f4b9b85c7b62
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/POKITTO_HW/SoftwareI2C.h Sun Jul 01 06:32:37 2018 +0000
@@ -0,0 +1,146 @@
+/*
+ * 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;
+ }
+
+ void setFrequency(uint32_t frequency){
+ _frequency_delay = 1000000 / frequency;
+ }
+
+ inline void initialise() {
+ _scl.output();
+ _sda.output();
+
+ _sda = 1;
+ _scl = 0;
+ wait_us(_frequency_delay);
+
+ for ( int n = 0; n <= 3; ++n ) {
+ stop();
+ }
+ }
+
+private:
+ inline void start() {
+ _sda.output();
+ wait_us(_frequency_delay);
+ _scl = 1;
+ _sda = 1;
+ wait_us(_frequency_delay);
+ _sda = 0;
+ wait_us(_frequency_delay);
+ _scl = 0;
+ wait_us(_frequency_delay);
+ }
+
+ inline void stop() {
+ _sda.output();
+ wait_us(_frequency_delay);
+ _sda = 0;
+ wait_us(_frequency_delay);
+ _scl = 1;
+ wait_us(_frequency_delay);
+ _sda = 1;
+ }
+
+ inline void putByte(uint8_t byte) {
+ _sda.output();
+ for ( int n = 8; n > 0; --n) {
+ wait_us(_frequency_delay);
+ _sda = byte & (1 << (n-1));
+ _scl = 1;
+ wait_us(_frequency_delay);
+ _scl = 0;
+ }
+ _sda = 1;
+ }
+
+ inline uint8_t getByte() {
+ uint8_t byte = 0;
+
+ _sda.input(); //release the data line
+ _sda.mode(OpenDrain);
+
+ wait_us(_frequency_delay);
+
+ for ( int n = 8; n > 0; --n ) {
+ _scl=1; //set clock high
+ wait_us(_frequency_delay);
+ byte |= _sda << (n-1); //read the bit
+ wait_us(_frequency_delay);
+ _scl=0; //set clock low
+ wait_us(_frequency_delay);
+ }
+
+ _sda.output(); //take data line back
+
+ return byte;
+ }
+
+ inline void giveAck() {
+ _sda.output();
+ wait_us(_frequency_delay);
+ _sda = 0;
+ _scl = 1;
+ wait_us(_frequency_delay);
+ _scl = 0;
+ _sda = 1;
+
+ }
+
+ inline bool getAck() {
+ _sda.output();
+ _sda = 1;
+ _scl = 1;
+ _sda.input();
+ _sda.mode(OpenDrain);
+ wait_us(_frequency_delay);
+ _scl = 0;
+
+ if(_sda != 0){return false;}
+
+ wait_us(_frequency_delay);
+ return true;
+ }
+
+ DigitalInOut _sda;
+ DigitalInOut _scl;
+
+ uint8_t _device_address;
+ uint32_t _frequency_delay;
+};
+
+#endif
+
+