PropWare  3.0.0.229
C++ objects and CMake build system for Parallax Propeller
i2c_in.c
1 /*
2  * @file i2c_in.c
3  *
4  * @author Andy Lindsay
5  *
6  * @version 0.86
7  *
8  * @copyright Copyright (C) Parallax, Inc. 2013. See end of file for
9  * terms of use (MIT License).
10  *
11  * @brief i2c function source, see simpletools.h for documentation.
12  *
13  * @detail Please submit bug reports, suggestions, and improvements to
14  * this code to editor@parallax.com.
15  */
16 
17 #include "simpletools.h"
18 #include "simplei2c.h"
19 
20 HUBTEXT int i2c_in(i2c *busID, int i2cAddr,
21  int memAddr, int memAddrCount,
22  unsigned char *data, int dataCount)
23 {
24  int n = 0;
25  i2cAddr <<= 1;
26  i2cAddr &= -2; // Clear i2cAddr.bit0 (write)
27  i2c_start(busID);
28  if(i2c_writeByte(busID, i2cAddr)) return n; else n++;
29  if(memAddrCount)
30  {
31  int m;
32  if(memAddrCount)
33  {
34  if(memAddrCount > 0)
35  {
36  endianSwap(&m, &memAddr, memAddrCount);
37  }
38  else
39  {
40  m = memAddr;
41  memAddrCount = - memAddrCount;
42  }
43  n += i2c_writeData(busID, (unsigned char*) &m, memAddrCount);
44  }
45  }
46  i2cAddr |= 1; // Set i2cAddr.bit0 (read)
47  i2c_start(busID);
48  if(i2c_writeByte(busID, i2cAddr)) return n; else n++;
49  n += i2c_readData(busID, data, abs(dataCount));
50  i2c_stop(busID);
51  if(dataCount < 0)
52  {
53  dataCount = -dataCount;
54  char temp[dataCount];
55  memcpy(temp, data, dataCount);
56  endianSwap(data, temp, dataCount);
57  }
58  return n;
59 }
60 
i2c_start
HUBTEXT void i2c_start(i2c *bus)
Signal i2c start condition on bus.
Definition: simplei2c.c:71
i2c_readData
HUBTEXT int i2c_readData(i2c *bus, unsigned char *data, int count)
Receive a block of i2c data. Does not send start or stop conditions.
Definition: simplei2c.c:216
i2c_writeByte
HUBTEXT int i2c_writeByte(i2c *bus, int byte)
Send i2c byte and return acknowledgement from device. Does not set start or stop. Drives SCL line i...
Definition: simplei2c.c:151
endianSwap
void endianSwap(void *resultAddr, void *varAddr, int byteCount)
Take bytes in one variable at varAddr, swap their order, and store them in another variable at result...
Definition: endianSwap.c:15
i2c_in
HUBTEXT int i2c_in(i2c *busID, int i2cAddr, int memAddr, int memAddrCount, unsigned char *data, int dataCount)
Receive data from device using I2C protocol.
Definition: i2c_in.c:20
i2c_stop
HUBTEXT void i2c_stop(i2c *bus)
Send Signal i2c stop condition on bus.
Definition: simplei2c.c:78
simpletools.h
This library provides convenient functions for a variety of microcontroller I/O, timing,...
i2c_writeData
HUBTEXT int i2c_writeData(i2c *bus, const unsigned char *data, int count)
Send a block of i2c data. Does not set start or stop.
Definition: simplei2c.c:203
i2c_st
Definition: simplei2c.h:25
simplei2c.h
Provides simple i2c start, stop, read, and write functions. See simpletools library for additional I2...
HUBTEXT
#define HUBTEXT
HUBTEXT tells compiler to put code into HUB RAM section.
Definition: propeller.h:43