-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmcp23017.cpp
144 lines (125 loc) · 2.92 KB
/
mcp23017.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include <stdlib.h>
#include <unistd.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <poll.h>
#include <chrono>
char buff[10];
char buff1[10];
char arr[10];
int wbyte,wbyte1,io,rd;
void write_reg(int fh, uint8_t reg, uint8_t val);
int read_reg(int fh, uint8_t reg, int count);
pollfd init_interuptPin(int gpio);
int main()
{
int fd=open("/dev/i2c-1",O_RDWR);
if(fd<0){
perror("Cannot open fd\n");
exit(1);
}
else
{
printf("I2c working\n");
}
buff[0]=0x00;
buff[1]=0x00;
buff1[0]=0x12;
buff1[1]=0xFF;
//arr[0]=0x12;
//arr[1]=0x00;
io=ioctl(fd,I2C_SLAVE,0x20);
if(io<0)
{
printf("ERROR IOCTL \n");
}
/*
write_reg(fd,0x00,0x00); //bank a output
write_reg(fd,0x12,0x00); //alles uit
usleep(1000000);
write_reg(fd,0x12,0xFF); //alles aan
usleep(1000*1000);*/
struct pollfd pfd;
pfd=init_interuptPin(4);
write_reg(fd,0x00,0xFF); //bank a input
write_reg(fd,0x0C,0xFF); //bank a pullup alles
write_reg(fd,0x01,0xFF); //bank a input
write_reg(fd,0x0D,0xFF); //bank a pullup alles
write_reg(fd, 0x04, 0xFF);
write_reg(fd, 0x05, 0xFF);
write_reg(fd, 0x0A, 0x40);
write_reg(fd, 0x0B, 0x40);
read_reg(fd,0x12,1);
read_reg(fd,0x13,1);
char bufinterupt[8];
while(1)
{
lseek(pfd.fd, 0, SEEK_SET); /* consume any prior interrupt */
read(pfd.fd, bufinterupt, sizeof bufinterupt);
poll(&pfd, 1, -1); /* wait for interrupt */
lseek(pfd.fd, 0, SEEK_SET); /* consume interrupt */
read(pfd.fd, bufinterupt, sizeof bufinterupt);
rd=read_reg(fd,0x13,1);
printf("After : GPIOB 0x%02X\n",rd);
int hexMask=0x01;
int hexAND01=hexMask & rd;
printf("GPIOB changed: %d\n",hexAND01);rd=read_reg(fd,0x12,1);
printf("After : GPIOA 0x%02X\n",rd);
hexAND01=hexMask & rd;
printf("GPIOA changed: %d\n",hexAND01);
write_reg(fd, 0x04, 0xFF);
write_reg(fd, 0x05, 0xFF);
}
printf("Everything goes right\n");
return 1;
}
void write_reg(int fd, uint8_t reg, uint8_t val)
{
uint8_t data[2];
data[0] = reg;
data[1] = val;
if (write(fd, &data, 2) != 2) {
perror("write");
}
}
pollfd init_interuptPin(int gpio)
{
char str[256];
struct pollfd pfd;
int fd;
char buf[8];
sprintf(str, "/sys/class/gpio/gpio%d/value", gpio);
if ((fd = open(str, O_RDONLY)) < 0)
{
fprintf(stderr, "Failed, gpio %d not exported.\n", gpio);
exit(1);
}
pfd.fd = fd;
pfd.events = POLLPRI;
lseek(fd, 0, SEEK_SET); /* consume any prior interrupt */
read(fd, buf, sizeof buf);
return pfd;
}
int read_reg(int fh, uint8_t reg, int count)
{
uint8_t data[2];
data[0] = reg;
if (write(fh, &data, 1) != 1) {
perror("write before read");
return -1;
}
data[1] = 0;
if (read(fh, &data, count) != count) {
perror("read");
return -1;
}
return (data[1] << 8) + data[0];
}