karelv
/
i2c_io_lpc4088
IO-based I2C functions with PCF8574 to proof my HW is correctly wired. Working on my LPC4088
my_i2c.cpp@0:b0247e85bf0e, 2014-12-07 (annotated)
- 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?
User | Revision | Line number | New 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 | } |