6 #include <linux/i2c-dev.h>
9 // Строки ниже необходимы для rasbian/debian.В Suse должны быть закаментированы.
10 #include <linux/i2c.h>
13 #define mcp_I2C_ADDRESS 0x20 // адрес устройства в сети i2c,задается перемычками A0,A1,A2 на микросхеме.
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 порт
35 // Open a connection to the mcp
40 char *fileName = "/dev/i2c-7"; // указать Ваш адрес
42 // Open port for reading and writing
43 if ((fd = open(fileName, O_RDWR)) < 0){
44 printf("i2c device not found \n");
47 // Set the port options and set the address of the device
48 if (ioctl(fd, I2C_SLAVE, mcp_I2C_ADDRESS) < 0) {
50 printf("on i2c mcp device not found \n");
58 __s32 mcp_i2c_Read_byte(int fd, __u8 address)
60 __s32 res = i2c_smbus_read_byte_data(fd, address);
71 void mcp_i2c_Write_Byte(int fd, __u8 address, __u8 value)
73 if (i2c_smbus_write_byte_data(fd, address, value) < 0) {
78 // чтение состояния порта
79 int mcp_read (int mcppin)
81 if (mcppin < 0 || mcppin >15) {
82 printf("Please select a valid GPIO pin \n");
86 int fd = mcp_i2c_Begin();
91 mcp_i2c_Write_Byte(fd,0x00,mcp_bank_a);
92 mcp_i2c_Write_Byte(fd,0x0c,gppu_bank_a);
99 mcp_i2c_Write_Byte(fd,0x01,mcp_bank_b);
100 mcp_i2c_Write_Byte(fd,0x0d,gppu_bank_b);
105 // printf("bank B\n");
108 utv = mcp_i2c_Read_byte(fd,regbank);
117 if (utv & l) return 1;
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);
133 if ((mcp_bank_a & l)) {
134 if ((utv & l)) printf ("%d 1\n",x);
135 else printf ("%d 0\n",x);
137 } else printf ("%d -\n",x);
146 utv = mcp_i2c_Read_byte(fd,0x13);
147 // printf ("--%d--\n",utv);
150 if ((mcp_bank_b & l)) {
151 if ((utv & l)) printf ("%d 1\n",x+8);
152 else printf ("%d 0\n",x+8);
154 } else printf ("%d -\n",x+8);
162 // установка состояния порта
163 void mcp_write (int mcppin,int mcpst)
165 if (mcppin < 0 || mcppin >15) {
166 printf("Please select a valid GPIO pin \n");
169 if (mcpst != 0 && mcpst != 1) {
170 printf("Не верно задан статус порта 0 или 1\n");
174 int fd = mcp_i2c_Begin();
179 mcp_i2c_Write_Byte(fd,0x00,mcp_bank_a);
180 mcp_i2c_Write_Byte(fd,0x0c,gppu_bank_a);
184 //printf("bank A\n");
187 mcp_i2c_Write_Byte(fd,0x01,mcp_bank_b);
188 mcp_i2c_Write_Byte(fd,0x0d,gppu_bank_b);
193 // printf("bank B\n");
196 utv = mcp_i2c_Read_byte(fd,regbank);
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);
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);
221 if (!(mcp_bank_a & l)) {
222 if ((utv & l)) printf ("%d 1\n",x);
223 else printf ("%d 0\n",x);
225 } else printf ("%d -\n",x);
234 utv = mcp_i2c_Read_byte(fd,0x15);
235 // printf ("--%d--\n",utv);
238 if (!(mcp_bank_b & l)) {
239 if ((utv & l)) printf ("%d 1\n",x+8);
240 else printf ("%d 0\n",x+8);
242 } else printf ("%d -\n",x+8);
250 // основное тело программы
252 int main(int argc, char **argv)
256 printf("%s <команда>\nin -чтение данных из порта,установленых на ввод\nout-установка состояния порта,установленного на вывод.\n", argv[0]);
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");
266 if(strcmp(argv[1], "out") == 0) {
269 printf("Настройка порта: %s <порт> <состояние>\n", argv[0]);
273 int mcppin = atoi(argv[2]);
274 int mcpst = atoi(argv[3]);
276 mcp_write (mcppin,mcpst);
280 else if(strcmp(argv[1], "in")== 0) {
282 printf("Чтение одного порта: %s <порт>\n", argv[0]);
286 int mcppin = atoi(argv[2]);
288 printf ("%d\n",mcp_read (mcppin));