#include #include #include #include #include #include #include #define I2C_DEVICE "/dev/i2c-1" #define DIO84RD_ADDRESS 0x23 // レジスタ enum PCA9535_Register { PCA9535_Reg_InputPort0, PCA9535_Reg_InputPort1, PCA9535_Reg_OutputPort0, PCA9535_Reg_OutputPort1, PCA9535_Reg_PolarityInversionPort0, PCA9535_Reg_PolarityInversionPort1, PCA9535_Reg_ConfigurationPort0, PCA9535_Reg_ConfigurationPort1, }; // 初期化 int DIO84RD_Init(int fd) { if (ioctl(fd, I2C_SLAVE, DIO84RD_ADDRESS) < 0) { perror("DIO84RD_Init(ioctl)"); return 1; } // ポート設定 uint8_t reg[2]; reg[0] = PCA9535_Reg_ConfigurationPort0; reg[1] = 0xf0; if ((write(fd, reg, 2)) != 2) { perror("DIO84RD_Init(write)"); return 1; } return 0; } // デジタル出力 int DIO84RD_Output(int fd, uint8_t value) { uint8_t reg[] = { PCA9535_Reg_OutputPort0, (uint8_t)~value }; if ((write(fd, reg, 2)) != 2) { perror("DIO84RD_Output(write)"); return 1; } return 0; } // デジタル入力 uint8_t DIO84RD_Input(int fd) { uint8_t reg[] = { PCA9535_Reg_InputPort1 }; if ((write(fd, reg, 1)) != 1) { perror("DIO84RD_Input(write)"); return 0; } if (read(fd, reg, 1) != 1) { perror("DIO84RD_Input(read)"); return 0; } return ~reg[0] & 0xff; } int main(int argc, char **argv) { int fd; if ((fd = open(I2C_DEVICE, O_RDWR)) < 0) { perror("open"); exit(1); } if (DIO84RD_Init(fd) != 0) exit(1); // デジタル出力 // (例)OUT2とOUT0をオン(OUT3とOUT1をオフ) if (DIO84RD_Output(fd, 0x05) != 0) exit(1); // デジタル入力 printf("InputData: 0x%02x\n", DIO84RD_Input(fd)); close(fd); return 0; }