9 static inline HUBTEXT
void all_low(
i2c *dev)
11 OUTA &= (dev->scl_mask_inv | dev->sda_mask_inv);
12 DIRA |= (dev->scl_mask | dev->sda_mask);
15 static inline HUBTEXT
void all_high(
i2c *dev)
18 OUTA &= dev->sda_mask_inv;
19 OUTA |= dev->scl_mask;
22 dirmask = (dev->scl_mask | dev->sda_mask);
25 dirmask = (dev->scl_mask_inv & dev->sda_mask);
30 static inline HUBTEXT
void scl_low(
i2c *bus)
32 OUTA &= bus->scl_mask_inv;
33 DIRA |= bus->scl_mask;
36 static inline HUBTEXT
void sda_low(
i2c *bus)
38 OUTA &= bus->sda_mask_inv;
39 DIRA |= bus->sda_mask;
42 static inline HUBTEXT
void scl_high(
i2c *bus)
45 OUTA |= bus->scl_mask;
46 DIRA |= bus->scl_mask;
49 OUTA &= bus->scl_mask_inv;
50 DIRA &= bus->scl_mask_inv;
54 static inline HUBTEXT
void sda_high(
i2c *bus)
56 DIRA &= bus->sda_mask_inv;
60 HUBTEXT
i2c *i2c_open(
i2c *bus,
int sclPin,
int sdaPin,
int sclDrive)
62 bus->scl_mask = (1 << sclPin);
63 bus->sda_mask = (1 << sdaPin);
64 bus->scl_mask_inv = ~(1 << sclPin);
65 bus->sda_mask_inv = ~(1 << sdaPin);
66 bus->drivescl = sclDrive;
71 HUBTEXT
void i2c_start(
i2c *bus)
78 HUBTEXT
void i2c_stop(
i2c *bus)
82 #ifndef __PROPELLER_CMM__ 89 #ifdef SPLIT_WRITE_DRIVE 91 static HUBTEXT
int i2c_writeByteDrive(
i2c *bus,
int byte)
99 DIRA &= bus->sda_mask_inv;
101 DIRA |= bus->sda_mask;
102 OUTA |= bus->scl_mask;
103 DIRA |= bus->scl_mask;
106 }
while(--count > 0);
107 DIRA &= bus->sda_mask_inv;
110 result = (INA & bus->sda_mask);
115 static HUBTEXT
int i2c_writeBytePullup(
i2c *bus,
int byte)
123 DIRA &= bus->sda_mask_inv;
125 DIRA |= bus->sda_mask;
127 DIRA &= bus->scl_mask_inv;
130 }
while(--count > 0);
131 DIRA &= bus->sda_mask_inv;
133 DIRA &= bus->scl_mask_inv;
134 result = (INA & bus->sda_mask);
135 DIRA |= bus->scl_mask;
139 HUBTEXT
int i2c_writeByte(
i2c *dev,
int byte)
143 return i2c_writeByteDrive(dev, byte);
145 return i2c_writeBytePullup(dev, byte);
151 HUBTEXT
int i2c_writeByte(
i2c *bus,
int byte)
159 DIRA &= bus->sda_mask_inv;
161 DIRA |= bus->sda_mask;
165 }
while(--count > 0);
166 DIRA &= bus->sda_mask_inv;
169 result = (INA & bus->sda_mask);
175 HUBTEXT
int i2c_readByte(
i2c *bus,
int ackState)
180 DIRA &= bus->sda_mask_inv;
182 for (count = 8; --count >= 0; ) {
185 byte |= (INA & bus->sda_mask) ? 1 : 0;
186 while(!(INA & bus->scl_mask));
188 OUTA &= bus->scl_mask_inv;
189 DIRA |= bus->scl_mask;
194 DIRA &= bus->sda_mask_inv;
196 DIRA |= bus->sda_mask;
203 HUBTEXT
int i2c_writeData(
i2c *bus,
const unsigned char *data,
int count)
208 rc |= i2c_writeByte(bus, (
int) data[n]);
216 HUBTEXT
int i2c_readData(
i2c *bus,
unsigned char *data,
int count)
220 data[n] = (
unsigned char) i2c_readByte(bus, 0);
223 data[n] = (
unsigned char) i2c_readByte(bus, 1);
227 HUBTEXT
int i2c_poll(
i2c *bus,
int devaddr)
231 ack = i2c_writeByte(bus, devaddr);