使用odroid c2开发板读取10位绝对值编码器,由于端口不够,用了一片PCF8575,再用i2c读取PCF8575,即可读到编码器的位置值。
步骤:
一、硬件连接
把带有PCF8575芯片的电路板用杜邦线连接odroid c2开发板的40pins外接端口的I2CA-SDA、I2CA-SCL针。
二、编译odroid c2的kernel,增加i2c
1、$make menuconfig
Device Drivers --->
Amlogic Device Drivers --->
I2C Hardware Bus Support --->
<*> Amlogic I2C Driver
2、编译、安装、重启
三、用户程序
//i2c_demo.c-读取pcf8575端口值
//$gcc -o i2c_demo i2c_demo.c
//$sudo ./i2c_demo
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <errno.h>
#include <string.h>
/*
PCF8575的A2A1A0脚接GND,则 Address=0b0010,0000+000=0x20
PCF8575的A2A1脚接GND,A0脚接VDD,则 Address=0b010,0000+001=0x21
其中,0b0010,0000是I2C地址固定值。
*/
#define I2C_PCF8575_ADDR 0x20
#define READ_SIZE 2
int main (void) {
int i,value;
int i2c_fd;
// 打开设备
i2c_fd = open("/dev/i2c-1", O_RDWR);
if (i2c_fd < 0) {
printf("Error opening file: %s\n", strerror(errno));
return -1;
}
for( i = 0 ; i < 8 ; i++ ){
// 先写欲读的I2C从设备地址
if (ioctl(i2c_fd, I2C_SLAVE, I2C_PCF8575_ADDR) < 0) {
printf("ioctl error: %s\n", strerror(errno));
return -1;
}
if( read(i2c_fd , &value, READ_SIZE ) != READ_SIZE) {
printf("Error writing file: %s\n", strerror(errno));
else
printf("0x%0x\n",value);
}
usleep(500000); // 延时500ms
}
close(i2c_fd);
return 0;
}