pig2i2c.c
Go to the documentation of this file.
1 /*
2 */
3 
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdint.h>
7 #include <unistd.h>
8 #include <time.h>
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 #include <sys/time.h>
12 #include <fcntl.h>
13 
14 #include "pigpio.h"
15 
16 /*
17 This software reads pigpio notification reports monitoring the I2C signals.
18 
19 Notifications are pipe based so this software must be run on the Pi
20 being monitored.
21 
22 It should be able to handle a 100kHz bus. You are unlikely to get any
23 usable results if the bus is running at 400kHz.
24 
25 gcc -o pig2i2c pig2i2c.c
26 
27 Do something like
28 
29 sudo pigpiod -s 2
30 
31 # get a notification handle, assume handle 0 was returned
32 
33 pigs no
34 
35 # start notifications for SCL/SDA
36 
37 e.g. pigs nb 0 0x3 # Rev. 1 select gpios 0/1
38 e.g. pigs nb 0 0xC # Rev. 2 select gpios 2/3
39 e.g. pigs nb 0 0xA00 # select gpios 9/11 (1<<9|1<<11)
40 
41 # run the program, specifying SCL/SDA and notification pipe
42 
43 ./pig2i2c SCL SDA </dev/pigpioN # specify gpios for SCL/SDA and pipe N
44 
45 e.g. ./pig2i2c 1 0 </dev/pigpio0 # Rev.1 I2C gpios
46 e.g. ./pig2i2c 3 2 </dev/pigpio0 # Rev.2 I2C gpios
47 e.g. ./pig2i2c 9 11 </dev/pigpio0 # monitor external bus
48 */
49 
50 #define RS (sizeof(gpioReport_t))
51 
52 #define SCL_FALLING 0
53 #define SCL_RISING 1
54 #define SCL_STEADY 2
55 
56 #define SDA_FALLING 0
57 #define SDA_RISING 4
58 #define SDA_STEADY 8
59 
60 static char * timeStamp()
61 {
62  static char buf[32];
63 
64  struct timeval now;
65  struct tm tmp;
66 
67  gettimeofday(&now, NULL);
68 
69  localtime_r(&now.tv_sec, &tmp);
70  strftime(buf, sizeof(buf), "%F %T", &tmp);
71 
72  return buf;
73 }
74 
75 void parse_I2C(int SCL, int SDA)
76 {
77  static int in_data=0, byte=0, bit=0;
78  static int oldSCL=1, oldSDA=1;
79 
80  int xSCL, xSDA;
81 
82  if (SCL != oldSCL)
83  {
84  oldSCL = SCL;
85  if (SCL) xSCL = SCL_RISING;
86  else xSCL = SCL_FALLING;
87  }
88  else xSCL = SCL_STEADY;
89 
90  if (SDA != oldSDA)
91  {
92  oldSDA = SDA;
93  if (SDA) xSDA = SDA_RISING;
94  else xSDA = SDA_FALLING;
95  }
96  else xSDA = SDA_STEADY;
97 
98  switch (xSCL+xSDA)
99  {
100  case SCL_RISING + SDA_RISING:
101  case SCL_RISING + SDA_FALLING:
102  case SCL_RISING + SDA_STEADY:
103  if (in_data)
104  {
105  if (bit++ < 8)
106  {
107  byte <<= 1;
108  byte |= SDA;
109  }
110  else
111  {
112  printf("%02X", byte);
113  if (SDA) printf("-"); else printf("+");
114  bit = 0;
115  byte = 0;
116  }
117  }
118  break;
119 
120  case SCL_FALLING + SDA_RISING:
121  break;
122 
123  case SCL_FALLING + SDA_FALLING:
124  break;
125 
126  case SCL_FALLING + SDA_STEADY:
127  break;
128 
129  case SCL_STEADY + SDA_RISING:
130  if (SCL)
131  {
132  in_data = 0;
133  byte = 0;
134  bit = 0;
135 
136  printf("]\n"); // stop
137  fflush(NULL);
138  }
139  break;
140 
141  case SCL_STEADY + SDA_FALLING:
142  if (SCL)
143  {
144  in_data = 1;
145  byte = 0;
146  bit = 0;
147 
148  printf("["); // start
149  }
150  break;
151 
152  case SCL_STEADY + SDA_STEADY:
153  break;
154 
155  }
156 }
157 
158 int main(int argc, char * argv[])
159 {
160  int gSCL, gSDA, SCL, SDA, xSCL;
161  int r;
162  uint32_t level, changed, bI2C, bSCL, bSDA;
163 
165 
166  if (argc > 2)
167  {
168  gSCL = atoi(argv[1]);
169  gSDA = atoi(argv[2]);
170 
171  bSCL = 1<<gSCL;
172  bSDA = 1<<gSDA;
173 
174  bI2C = bSCL | bSDA;
175  }
176  else
177  {
178  exit(-1);
179  }
180 
181  /* default to SCL/SDA high */
182 
183  SCL = 1;
184  SDA = 1;
185  level = bI2C;
186 
187  while ((r=read(STDIN_FILENO, &report, RS)) == RS)
188  {
189  report.level &= bI2C;
190 
191  if (report.level != level)
192  {
193  changed = report.level ^ level;
194 
195  level = report.level;
196 
197  if (level & bSCL) SCL = 1; else SCL = 0;
198  if (level & bSDA) SDA = 1; else SDA = 0;
199 
200  parse_I2C(SCL, SDA);
201  }
202  }
203  return 0;
204 }
205 
void parse_I2C(int SCL, int SDA)
Definition: pig2i2c.c:75
#define SDA_FALLING
Definition: pig2i2c.c:56
#define SDA_STEADY
Definition: pig2i2c.c:58
int main(int argc, char *argv[])
Definition: pig2i2c.c:158
#define SCL_RISING
Definition: pig2i2c.c:53
#define RS
Definition: pig2i2c.c:50
int r
Definition: DHT22.py:259
#define SDA_RISING
Definition: pig2i2c.c:57
#define SCL_FALLING
Definition: pig2i2c.c:52
#define SCL_STEADY
Definition: pig2i2c.c:54
uint32_t level
Definition: pigpio.h:419
void report(int err, char *fmt,...)
Definition: pigs.c:64
static char * timeStamp()
Definition: pig2i2c.c:60


cob_hand_bridge
Author(s): Mathias Lüdtke
autogenerated on Tue Oct 20 2020 03:35:57