ads1115 analog-to-digital 4-channel added
[i2c-telemetry.git] / mcp_rw.c
1 #include <stdio.h>
2 #include <stdint.h>
3 #include <fcntl.h>
4 #include <stdlib.h>
5 #include <unistd.h>
6 #include <linux/i2c-dev.h>
7 #include <sys/ioctl.h>
8 #include <string.h>
9 // Строки ниже необходимы для rasbian/debian.В Suse должны быть закаментированы.
10 #include <linux/i2c.h>
11 #include "smbus.h" 
12
13 #define mcp_I2C_ADDRESS 0x20 // адрес устройства в сети i2c,задается перемычками A0,A1,A2 на микросхеме.
14
15
16 // ниже 2 строки задают направление порта ,1 - на ввод,0 - на вывод.
17 #define mcp_bank_a 0b00000100  //байты 7 по 0 порт
18 #define mcp_bank_b 0b00000000 //байты 8 по 15 порт
19 // следущие 2 строки-подтяжка резистором 100 кОм на +, 1 - включен.Актуально для режима на ввод.
20 #define gppu_bank_a 0b00000100 //байты 7 по 0 порт
21 #define gppu_bank_b 0b00000000 //байты 8 по 15 порт
22 // регистры 02 03 для инвертирования
23 #define iopol_bank_a 0b00000110 //байты 7 по 0 порт
24 #define iopol_bank_b 0b00000000 //байты 8 по 15 порт
25
26
27
28
29
30 int fd;
31 unsigned int  utv;
32 int l=1;
33 int x=0;
34
35 // Open a connection to the mcp
36 // Returns a file id
37 int mcp_i2c_Begin()
38 {
39  
40    char *fileName = "/dev/i2c-7"; // указать Ваш адрес
41    
42    // Open port for reading and writing
43    if ((fd = open(fileName, O_RDWR)) < 0){
44      printf("i2c device not found \n");
45       exit(1);
46    } 
47    // Set the port options and set the address of the device
48    if (ioctl(fd, I2C_SLAVE, mcp_I2C_ADDRESS) < 0) {               
49       close(fd);
50       printf("on i2c mcp device not found \n");
51       exit(1);
52    }
53
54    return fd;
55 }
56
57 // Read a byte to mcp
58 __s32 mcp_i2c_Read_byte(int fd, __u8 address)
59 {
60    __s32 res = i2c_smbus_read_byte_data(fd, address);
61    if (res < 0) {
62       printf("error \n");
63       close(fd);
64       exit(1);
65    }
66
67    return res;
68 }
69
70 //Write a byte to mcp
71 void mcp_i2c_Write_Byte(int fd, __u8 address, __u8 value)
72 {
73    if (i2c_smbus_write_byte_data(fd, address, value) < 0) {
74       close(fd);
75       exit(1);
76    }
77 }
78 // чтение состояния порта
79 int mcp_read (int mcppin)
80 {
81  if (mcppin < 0 || mcppin >15) {
82        printf("Please select a valid GPIO pin \n");
83         exit(1);
84  }
85
86  int fd =  mcp_i2c_Begin();
87  int regbank;
88
89 if (mcppin < 8){
90   
91  mcp_i2c_Write_Byte(fd,0x00,mcp_bank_a);
92  mcp_i2c_Write_Byte(fd,0x0c,gppu_bank_a);
93  
94     regbank=0x12;
95
96 //printf("bank A\n");
97 } else {
98   
99     mcp_i2c_Write_Byte(fd,0x01,mcp_bank_b);
100     mcp_i2c_Write_Byte(fd,0x0d,gppu_bank_b);
101       
102    regbank=0x13;
103    mcppin=mcppin-8;
104
105  //  printf("bank B\n");
106 }
107
108     utv = mcp_i2c_Read_byte(fd,regbank);
109
110       while(x <  mcppin)
111     {
112       x = x+ 1;
113       l=l*2;
114 }
115
116
117 if (utv & l) return 1;
118 else return 0;
119
120 close(fd);
121
122 }
123
124
125 // запрос таблицы статусов портов
126 void mcp_state_in () {   
127       int fd =  mcp_i2c_Begin();
128      utv = mcp_i2c_Read_byte(fd,0x12);
129  //    printf ("--%d--\n",utv);
130              while(x <  8)
131     {
132       
133  if ((mcp_bank_a & l)) {
134       if ((utv & l)) printf ("%d 1\n",x);
135      else printf ("%d 0\n",x);
136
137 } else printf ("%d -\n",x);
138       l=l*2;
139      x = x+ 1;
140      
141 }
142
143       x=0;
144       l=1;
145
146           utv = mcp_i2c_Read_byte(fd,0x13);
147 //            printf ("--%d--\n",utv);
148              while(x <  8)
149     {
150        if ((mcp_bank_b & l)) {
151       if ((utv & l)) printf ("%d 1\n",x+8);
152      else printf ("%d 0\n",x+8);
153
154      } else printf ("%d -\n",x+8);
155            l=l*2;
156      x = x+ 1;
157 }
158               
159 close(fd);
160
161 }
162 // установка состояния порта
163 void mcp_write (int mcppin,int mcpst)
164 {
165  if (mcppin < 0 || mcppin >15) {
166        printf("Please select a valid GPIO pin \n");
167         exit(1);
168  }
169    if (mcpst != 0 && mcpst != 1) {
170       printf("Не верно задан статус порта 0 или 1\n");
171         exit(1);
172  }
173   
174  int fd =  mcp_i2c_Begin();
175  int regbank;
176
177 if (mcppin < 8){
178   
179  mcp_i2c_Write_Byte(fd,0x00,mcp_bank_a);
180  mcp_i2c_Write_Byte(fd,0x0c,gppu_bank_a);
181  
182     regbank=0x14;
183
184 //printf("bank A\n");
185 } else {
186   
187     mcp_i2c_Write_Byte(fd,0x01,mcp_bank_b);
188     mcp_i2c_Write_Byte(fd,0x0d,gppu_bank_b);
189       
190    regbank=0x15;
191    mcppin=mcppin-8;
192
193  //  printf("bank B\n");
194 }
195
196     utv = mcp_i2c_Read_byte(fd,regbank);
197
198       while(x <  mcppin)
199     {
200       x = x+ 1;
201       l=l*2;
202 }
203
204
205 if (!(utv & l) && mcpst==1) mcp_i2c_Write_Byte(fd,regbank,utv+l);
206 if (utv & l && mcpst==0) mcp_i2c_Write_Byte(fd,regbank,utv-l);
207
208 close(fd);
209
210 }
211
212
213 // запрос таблицы статусов портов
214 void mcp_state_out () {   
215       int fd =  mcp_i2c_Begin();
216      utv = mcp_i2c_Read_byte(fd,0x14);
217  //    printf ("--%d--\n",utv);
218              while(x <  8)
219     {
220       
221  if (!(mcp_bank_a & l)) {
222       if ((utv & l)) printf ("%d 1\n",x);
223      else printf ("%d 0\n",x);
224
225 } else printf ("%d -\n",x);
226       l=l*2;
227      x = x+ 1;
228      
229 }
230
231       x=0;
232       l=1;
233
234           utv = mcp_i2c_Read_byte(fd,0x15);
235 //            printf ("--%d--\n",utv);
236              while(x <  8)
237     {
238        if (!(mcp_bank_b & l)) {
239       if ((utv & l)) printf ("%d 1\n",x+8);
240      else printf ("%d 0\n",x+8);
241
242      } else printf ("%d -\n",x+8);
243            l=l*2;
244      x = x+ 1;
245 }
246               
247 close(fd);
248
249 }
250 // основное тело программы
251
252 int main(int argc, char **argv)
253
254 {
255    if (argc == 1) {
256      printf("%s <команда>\nin -чтение данных из порта,установленых на ввод\nout-установка состояния порта,установленного на вывод.\n", argv[0]);
257      return 1;
258    } 
259    else if (argc == 2) {
260   if(strcmp(argv[1], "out") == 0) mcp_state_out();
261   else if(strcmp(argv[1], "in") == 0) mcp_state_in();
262   else printf("Нет такой команды\n");
263   return 1;
264    }
265    
266    if(strcmp(argv[1], "out") == 0) {
267    
268         if (argc != 4) {
269              printf("Настройка порта: %s <порт> <состояние>\n", argv[0]);
270
271 return 1;
272 }
273 int mcppin = atoi(argv[2]);
274 int mcpst = atoi(argv[3]);
275
276 mcp_write (mcppin,mcpst);
277      
278      
279    }
280    else if(strcmp(argv[1], "in")== 0) {
281    if (argc != 3) {
282              printf("Чтение одного порта: %s <порт>\n", argv[0]);
283      mcp_state_in();
284      return 1;
285    }
286    int mcppin = atoi(argv[2]);
287
288    printf ("%d\n",mcp_read (mcppin));
289    
290    }
291
292
293
294
295
296    return 0;
297 }