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

Committer:
spinal
Date:
Sun Nov 18 15:47:54 2018 +0000
Revision:
64:6e6c6c2b664e
Parent:
31:f4b9b85c7b62
added fix for directrectangle()

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