PokittoLib is the library needed for programming the Pokitto DIY game console (www.pokitto.com)

Dependents:   YATTT sd_map_test cPong SnowDemo ... more

PokittoLib

Library for programming Pokitto hardware

How to Use

  1. Import this library to online compiler (see button "import" on the right hand side
  2. DO NOT import mbed-src anymore, a better version is now included inside PokittoLib
  3. Change My_settings.h according to your project
  4. Start coding!
Committer:
Pokitto
Date:
Wed Dec 25 23:59:52 2019 +0000
Revision:
71:531419862202
Parent:
31:f4b9b85c7b62
Changed Mode2 C++ refresh code (graphical errors)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Pokitto 31:f4b9b85c7b62 1 /*
Pokitto 31:f4b9b85c7b62 2 * mbed Library to use a software master i2c interface on any GPIO pins
Pokitto 31:f4b9b85c7b62 3 * Copyright (c) 2012 Christopher Pepper
Pokitto 31:f4b9b85c7b62 4 * Released under the MIT License: http://mbed.org/license/mit
Pokitto 31:f4b9b85c7b62 5 */
Pokitto 31:f4b9b85c7b62 6
Pokitto 31:f4b9b85c7b62 7 #ifndef _SOFTWARE_I2C_H_
Pokitto 31:f4b9b85c7b62 8 #define _SOFTWARE_I2C_H_
Pokitto 31:f4b9b85c7b62 9
Pokitto 31:f4b9b85c7b62 10 #include "mbed.h"
Pokitto 31:f4b9b85c7b62 11
Pokitto 31:f4b9b85c7b62 12 /**
Pokitto 31:f4b9b85c7b62 13 * @brief SoftwareI2C class
Pokitto 31:f4b9b85c7b62 14 */
Pokitto 31:f4b9b85c7b62 15
Pokitto 31:f4b9b85c7b62 16 class SoftwareI2C {
Pokitto 31:f4b9b85c7b62 17 public:
Pokitto 31:f4b9b85c7b62 18 SoftwareI2C(PinName sda, PinName scl);
Pokitto 31:f4b9b85c7b62 19 ~SoftwareI2C();
Pokitto 31:f4b9b85c7b62 20
Pokitto 31:f4b9b85c7b62 21 void read(uint8_t device_address, uint8_t* data, uint8_t data_bytes);
Pokitto 31:f4b9b85c7b62 22 void write(uint8_t device_address, uint8_t* data, uint8_t data_bytes);
Pokitto 31:f4b9b85c7b62 23 void write(uint8_t device_address, uint8_t byte);
Pokitto 31:f4b9b85c7b62 24 void randomRead(uint8_t device_address, uint8_t start_address, uint8_t* data, uint8_t data_bytes);
Pokitto 31:f4b9b85c7b62 25 void randomWrite(uint8_t device_address, uint8_t start_address, uint8_t* data, uint8_t data_bytes);
Pokitto 31:f4b9b85c7b62 26 void randomWrite(uint8_t device_address, uint8_t start_address, uint8_t byte);
Pokitto 31:f4b9b85c7b62 27
Pokitto 31:f4b9b85c7b62 28 uint8_t read8(uint8_t device_address, uint8_t start_address);
Pokitto 31:f4b9b85c7b62 29 uint16_t read16(uint8_t device_address, uint8_t start_address);
Pokitto 31:f4b9b85c7b62 30 uint32_t read24(uint8_t device_address, uint8_t start_address);
Pokitto 31:f4b9b85c7b62 31 uint32_t read32(uint8_t device_address, uint8_t start_address);
Pokitto 31:f4b9b85c7b62 32
Pokitto 31:f4b9b85c7b62 33 void setDeviceAddress(uint8_t address){
Pokitto 31:f4b9b85c7b62 34 _device_address = address;
Pokitto 31:f4b9b85c7b62 35 }
Pokitto 31:f4b9b85c7b62 36
Pokitto 31:f4b9b85c7b62 37 void setFrequency(uint32_t frequency){
Pokitto 31:f4b9b85c7b62 38 _frequency_delay = 1000000 / frequency;
Pokitto 31:f4b9b85c7b62 39 }
Pokitto 31:f4b9b85c7b62 40
Pokitto 31:f4b9b85c7b62 41 inline void initialise() {
Pokitto 31:f4b9b85c7b62 42 _scl.output();
Pokitto 31:f4b9b85c7b62 43 _sda.output();
Pokitto 31:f4b9b85c7b62 44
Pokitto 31:f4b9b85c7b62 45 _sda = 1;
Pokitto 31:f4b9b85c7b62 46 _scl = 0;
Pokitto 31:f4b9b85c7b62 47 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 48
Pokitto 31:f4b9b85c7b62 49 for ( int n = 0; n <= 3; ++n ) {
Pokitto 31:f4b9b85c7b62 50 stop();
Pokitto 31:f4b9b85c7b62 51 }
Pokitto 31:f4b9b85c7b62 52 }
Pokitto 31:f4b9b85c7b62 53
Pokitto 31:f4b9b85c7b62 54 private:
Pokitto 31:f4b9b85c7b62 55 inline void start() {
Pokitto 31:f4b9b85c7b62 56 _sda.output();
Pokitto 31:f4b9b85c7b62 57 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 58 _scl = 1;
Pokitto 31:f4b9b85c7b62 59 _sda = 1;
Pokitto 31:f4b9b85c7b62 60 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 61 _sda = 0;
Pokitto 31:f4b9b85c7b62 62 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 63 _scl = 0;
Pokitto 31:f4b9b85c7b62 64 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 65 }
Pokitto 31:f4b9b85c7b62 66
Pokitto 31:f4b9b85c7b62 67 inline void stop() {
Pokitto 31:f4b9b85c7b62 68 _sda.output();
Pokitto 31:f4b9b85c7b62 69 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 70 _sda = 0;
Pokitto 31:f4b9b85c7b62 71 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 72 _scl = 1;
Pokitto 31:f4b9b85c7b62 73 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 74 _sda = 1;
Pokitto 31:f4b9b85c7b62 75 }
Pokitto 31:f4b9b85c7b62 76
Pokitto 31:f4b9b85c7b62 77 inline void putByte(uint8_t byte) {
Pokitto 31:f4b9b85c7b62 78 _sda.output();
Pokitto 31:f4b9b85c7b62 79 for ( int n = 8; n > 0; --n) {
Pokitto 31:f4b9b85c7b62 80 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 81 _sda = byte & (1 << (n-1));
Pokitto 31:f4b9b85c7b62 82 _scl = 1;
Pokitto 31:f4b9b85c7b62 83 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 84 _scl = 0;
Pokitto 31:f4b9b85c7b62 85 }
Pokitto 31:f4b9b85c7b62 86 _sda = 1;
Pokitto 31:f4b9b85c7b62 87 }
Pokitto 31:f4b9b85c7b62 88
Pokitto 31:f4b9b85c7b62 89 inline uint8_t getByte() {
Pokitto 31:f4b9b85c7b62 90 uint8_t byte = 0;
Pokitto 31:f4b9b85c7b62 91
Pokitto 31:f4b9b85c7b62 92 _sda.input(); //release the data line
Pokitto 31:f4b9b85c7b62 93 _sda.mode(OpenDrain);
Pokitto 31:f4b9b85c7b62 94
Pokitto 31:f4b9b85c7b62 95 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 96
Pokitto 31:f4b9b85c7b62 97 for ( int n = 8; n > 0; --n ) {
Pokitto 31:f4b9b85c7b62 98 _scl=1; //set clock high
Pokitto 31:f4b9b85c7b62 99 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 100 byte |= _sda << (n-1); //read the bit
Pokitto 31:f4b9b85c7b62 101 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 102 _scl=0; //set clock low
Pokitto 31:f4b9b85c7b62 103 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 104 }
Pokitto 31:f4b9b85c7b62 105
Pokitto 31:f4b9b85c7b62 106 _sda.output(); //take data line back
Pokitto 31:f4b9b85c7b62 107
Pokitto 31:f4b9b85c7b62 108 return byte;
Pokitto 31:f4b9b85c7b62 109 }
Pokitto 31:f4b9b85c7b62 110
Pokitto 31:f4b9b85c7b62 111 inline void giveAck() {
Pokitto 31:f4b9b85c7b62 112 _sda.output();
Pokitto 31:f4b9b85c7b62 113 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 114 _sda = 0;
Pokitto 31:f4b9b85c7b62 115 _scl = 1;
Pokitto 31:f4b9b85c7b62 116 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 117 _scl = 0;
Pokitto 31:f4b9b85c7b62 118 _sda = 1;
Pokitto 31:f4b9b85c7b62 119
Pokitto 31:f4b9b85c7b62 120 }
Pokitto 31:f4b9b85c7b62 121
Pokitto 31:f4b9b85c7b62 122 inline bool getAck() {
Pokitto 31:f4b9b85c7b62 123 _sda.output();
Pokitto 31:f4b9b85c7b62 124 _sda = 1;
Pokitto 31:f4b9b85c7b62 125 _scl = 1;
Pokitto 31:f4b9b85c7b62 126 _sda.input();
Pokitto 31:f4b9b85c7b62 127 _sda.mode(OpenDrain);
Pokitto 31:f4b9b85c7b62 128 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 129 _scl = 0;
Pokitto 31:f4b9b85c7b62 130
Pokitto 31:f4b9b85c7b62 131 if(_sda != 0){return false;}
Pokitto 31:f4b9b85c7b62 132
Pokitto 31:f4b9b85c7b62 133 wait_us(_frequency_delay);
Pokitto 31:f4b9b85c7b62 134 return true;
Pokitto 31:f4b9b85c7b62 135 }
Pokitto 31:f4b9b85c7b62 136
Pokitto 31:f4b9b85c7b62 137 DigitalInOut _sda;
Pokitto 31:f4b9b85c7b62 138 DigitalInOut _scl;
Pokitto 31:f4b9b85c7b62 139
Pokitto 31:f4b9b85c7b62 140 uint8_t _device_address;
Pokitto 31:f4b9b85c7b62 141 uint32_t _frequency_delay;
Pokitto 31:f4b9b85c7b62 142 };
Pokitto 31:f4b9b85c7b62 143
Pokitto 31:f4b9b85c7b62 144 #endif
Pokitto 31:f4b9b85c7b62 145
Pokitto 31:f4b9b85c7b62 146