IO-based I2C functions with PCF8574 to proof my HW is correctly wired. Working on my LPC4088

Dependencies:   mbed

Committer:
karelv
Date:
Sun Dec 07 13:56:12 2014 +0000
Revision:
0:b0247e85bf0e
IO-based I2C function, to show my HW is correctly wired

Who changed what in which revision?

UserRevisionLine numberNew contents of line
karelv 0:b0247e85bf0e 1 #include "mbed.h"
karelv 0:b0247e85bf0e 2 #include "my_i2c.h"
karelv 0:b0247e85bf0e 3
karelv 0:b0247e85bf0e 4 DigitalInOut sda(p9);
karelv 0:b0247e85bf0e 5 DigitalInOut scl(p10);
karelv 0:b0247e85bf0e 6
karelv 0:b0247e85bf0e 7
karelv 0:b0247e85bf0e 8 #define SDA(state) if (state) { \
karelv 0:b0247e85bf0e 9 sda.input (); \
karelv 0:b0247e85bf0e 10 sda = 1; \
karelv 0:b0247e85bf0e 11 } else { \
karelv 0:b0247e85bf0e 12 sda = 0; \
karelv 0:b0247e85bf0e 13 sda.output (); \
karelv 0:b0247e85bf0e 14 }
karelv 0:b0247e85bf0e 15
karelv 0:b0247e85bf0e 16 #define SCL(state) if (state) { \
karelv 0:b0247e85bf0e 17 scl.input (); \
karelv 0:b0247e85bf0e 18 scl = 1; \
karelv 0:b0247e85bf0e 19 } else { \
karelv 0:b0247e85bf0e 20 scl = 0; \
karelv 0:b0247e85bf0e 21 scl.output (); \
karelv 0:b0247e85bf0e 22 }
karelv 0:b0247e85bf0e 23
karelv 0:b0247e85bf0e 24 #define IO_DELAY() wait_us (1)
karelv 0:b0247e85bf0e 25
karelv 0:b0247e85bf0e 26
karelv 0:b0247e85bf0e 27 void my_i2cWriteByte (unsigned char byte);
karelv 0:b0247e85bf0e 28 bool my_i2cGetAck ();
karelv 0:b0247e85bf0e 29 unsigned char my_i2cReadByte ();
karelv 0:b0247e85bf0e 30
karelv 0:b0247e85bf0e 31
karelv 0:b0247e85bf0e 32 bool
karelv 0:b0247e85bf0e 33 my_i2cStart (unsigned char slaveAddress)
karelv 0:b0247e85bf0e 34 {
karelv 0:b0247e85bf0e 35 SDA(1);
karelv 0:b0247e85bf0e 36 SCL(1);
karelv 0:b0247e85bf0e 37 IO_DELAY();
karelv 0:b0247e85bf0e 38 SDA(0);
karelv 0:b0247e85bf0e 39 IO_DELAY();
karelv 0:b0247e85bf0e 40
karelv 0:b0247e85bf0e 41 my_i2cWriteByte (slaveAddress);
karelv 0:b0247e85bf0e 42
karelv 0:b0247e85bf0e 43 return my_i2cGetAck ();
karelv 0:b0247e85bf0e 44 }
karelv 0:b0247e85bf0e 45
karelv 0:b0247e85bf0e 46
karelv 0:b0247e85bf0e 47 bool
karelv 0:b0247e85bf0e 48 my_i2cStop ()
karelv 0:b0247e85bf0e 49 {
karelv 0:b0247e85bf0e 50 SDA(0);
karelv 0:b0247e85bf0e 51 SCL(0);
karelv 0:b0247e85bf0e 52 IO_DELAY();
karelv 0:b0247e85bf0e 53
karelv 0:b0247e85bf0e 54 SCL(1);
karelv 0:b0247e85bf0e 55 IO_DELAY();
karelv 0:b0247e85bf0e 56
karelv 0:b0247e85bf0e 57 SDA(1);
karelv 0:b0247e85bf0e 58 IO_DELAY();
karelv 0:b0247e85bf0e 59
karelv 0:b0247e85bf0e 60 return true;
karelv 0:b0247e85bf0e 61 }
karelv 0:b0247e85bf0e 62
karelv 0:b0247e85bf0e 63
karelv 0:b0247e85bf0e 64 bool
karelv 0:b0247e85bf0e 65 my_i2cRepeatedStart (unsigned char slaveAddress)
karelv 0:b0247e85bf0e 66 {
karelv 0:b0247e85bf0e 67 SCL(0);
karelv 0:b0247e85bf0e 68 IO_DELAY();
karelv 0:b0247e85bf0e 69
karelv 0:b0247e85bf0e 70 SDA(1);
karelv 0:b0247e85bf0e 71
karelv 0:b0247e85bf0e 72 IO_DELAY();
karelv 0:b0247e85bf0e 73
karelv 0:b0247e85bf0e 74 SCL(1);
karelv 0:b0247e85bf0e 75
karelv 0:b0247e85bf0e 76 IO_DELAY();
karelv 0:b0247e85bf0e 77
karelv 0:b0247e85bf0e 78 SDA(0);
karelv 0:b0247e85bf0e 79 my_i2cWriteByte (slaveAddress);
karelv 0:b0247e85bf0e 80
karelv 0:b0247e85bf0e 81 return my_i2cGetAck ();
karelv 0:b0247e85bf0e 82 }
karelv 0:b0247e85bf0e 83
karelv 0:b0247e85bf0e 84
karelv 0:b0247e85bf0e 85 bool
karelv 0:b0247e85bf0e 86 my_i2cWrite (unsigned char data)
karelv 0:b0247e85bf0e 87 {
karelv 0:b0247e85bf0e 88 my_i2cWriteByte (data);
karelv 0:b0247e85bf0e 89 return my_i2cGetAck ();
karelv 0:b0247e85bf0e 90 }
karelv 0:b0247e85bf0e 91
karelv 0:b0247e85bf0e 92
karelv 0:b0247e85bf0e 93 unsigned char
karelv 0:b0247e85bf0e 94 my_i2cReadByte ()
karelv 0:b0247e85bf0e 95 {
karelv 0:b0247e85bf0e 96 unsigned char data = 0;
karelv 0:b0247e85bf0e 97
karelv 0:b0247e85bf0e 98 for (int i = 0x80; i > 0x00; i >>= 1)
karelv 0:b0247e85bf0e 99 {
karelv 0:b0247e85bf0e 100 SCL(0);
karelv 0:b0247e85bf0e 101 SDA(1);
karelv 0:b0247e85bf0e 102 IO_DELAY();
karelv 0:b0247e85bf0e 103
karelv 0:b0247e85bf0e 104 SCL(1);
karelv 0:b0247e85bf0e 105 IO_DELAY();
karelv 0:b0247e85bf0e 106
karelv 0:b0247e85bf0e 107 if (sda)
karelv 0:b0247e85bf0e 108 { // turn bit to 1...
karelv 0:b0247e85bf0e 109 data |= i;
karelv 0:b0247e85bf0e 110 }
karelv 0:b0247e85bf0e 111 }
karelv 0:b0247e85bf0e 112 return data;
karelv 0:b0247e85bf0e 113 }
karelv 0:b0247e85bf0e 114
karelv 0:b0247e85bf0e 115
karelv 0:b0247e85bf0e 116 unsigned char
karelv 0:b0247e85bf0e 117 my_i2cReadAck ()
karelv 0:b0247e85bf0e 118 {
karelv 0:b0247e85bf0e 119 unsigned char data = my_i2cReadByte ();
karelv 0:b0247e85bf0e 120
karelv 0:b0247e85bf0e 121 SCL(0);
karelv 0:b0247e85bf0e 122 SDA(0);
karelv 0:b0247e85bf0e 123 IO_DELAY();
karelv 0:b0247e85bf0e 124
karelv 0:b0247e85bf0e 125 SCL(1);
karelv 0:b0247e85bf0e 126
karelv 0:b0247e85bf0e 127 // wait till scl is high
karelv 0:b0247e85bf0e 128 IO_DELAY();
karelv 0:b0247e85bf0e 129
karelv 0:b0247e85bf0e 130 return data;
karelv 0:b0247e85bf0e 131 }
karelv 0:b0247e85bf0e 132
karelv 0:b0247e85bf0e 133
karelv 0:b0247e85bf0e 134 unsigned char
karelv 0:b0247e85bf0e 135 my_i2cReadNak ()
karelv 0:b0247e85bf0e 136 {
karelv 0:b0247e85bf0e 137 unsigned char data = my_i2cReadByte ();
karelv 0:b0247e85bf0e 138
karelv 0:b0247e85bf0e 139 SCL(0);
karelv 0:b0247e85bf0e 140 SDA(1);
karelv 0:b0247e85bf0e 141 IO_DELAY();
karelv 0:b0247e85bf0e 142
karelv 0:b0247e85bf0e 143 SCL(1);
karelv 0:b0247e85bf0e 144 // wait till scl is high
karelv 0:b0247e85bf0e 145 IO_DELAY();
karelv 0:b0247e85bf0e 146
karelv 0:b0247e85bf0e 147 return data;
karelv 0:b0247e85bf0e 148 }
karelv 0:b0247e85bf0e 149
karelv 0:b0247e85bf0e 150
karelv 0:b0247e85bf0e 151 unsigned char
karelv 0:b0247e85bf0e 152 my_i2cRead (unsigned char ack)
karelv 0:b0247e85bf0e 153 {
karelv 0:b0247e85bf0e 154 if (ack)
karelv 0:b0247e85bf0e 155 {
karelv 0:b0247e85bf0e 156 return my_i2cReadAck ();
karelv 0:b0247e85bf0e 157 }
karelv 0:b0247e85bf0e 158 return my_i2cReadNak ();
karelv 0:b0247e85bf0e 159 }
karelv 0:b0247e85bf0e 160
karelv 0:b0247e85bf0e 161
karelv 0:b0247e85bf0e 162 void
karelv 0:b0247e85bf0e 163 my_i2cWriteByte (unsigned char byte)
karelv 0:b0247e85bf0e 164 {
karelv 0:b0247e85bf0e 165 for (int i = 0x80; i > 0x00; i >>= 1)
karelv 0:b0247e85bf0e 166 {
karelv 0:b0247e85bf0e 167 SCL(0);
karelv 0:b0247e85bf0e 168 SDA((byte & i) ? true : false);
karelv 0:b0247e85bf0e 169 IO_DELAY();
karelv 0:b0247e85bf0e 170
karelv 0:b0247e85bf0e 171 SCL(1);
karelv 0:b0247e85bf0e 172 IO_DELAY();
karelv 0:b0247e85bf0e 173 }
karelv 0:b0247e85bf0e 174 }
karelv 0:b0247e85bf0e 175
karelv 0:b0247e85bf0e 176
karelv 0:b0247e85bf0e 177 bool
karelv 0:b0247e85bf0e 178 my_i2cGetAck ()
karelv 0:b0247e85bf0e 179 {
karelv 0:b0247e85bf0e 180 SCL(0);
karelv 0:b0247e85bf0e 181 SDA(1);
karelv 0:b0247e85bf0e 182 IO_DELAY();
karelv 0:b0247e85bf0e 183
karelv 0:b0247e85bf0e 184 SCL(1);
karelv 0:b0247e85bf0e 185 // wait till clock = 1...
karelv 0:b0247e85bf0e 186 IO_DELAY();
karelv 0:b0247e85bf0e 187
karelv 0:b0247e85bf0e 188 bool ack = false;
karelv 0:b0247e85bf0e 189 ack = sda;
karelv 0:b0247e85bf0e 190
karelv 0:b0247e85bf0e 191 return !ack;
karelv 0:b0247e85bf0e 192 }