어플에서 I2C 버스로 디바이스 접근하는 방법
출처 : http://forum.falinux.com/zbxe/index.php?document_srl=504163&mid=ezboard
1. 보드에서 i2c 드라이버의 Major, minor 번호를 찾습니다.
cat /proc/devices
2. nodefile 을 만듭니다.
mknod /dev/i2c-0 c Major minor
3. 프로그램을 작성합니다.
fd = open( "/dev/i2c-0", O_RDWR ); // 만들어진 노드파일을 엽니다.
4. 접근할 디바이스의 슬레이브주소를 설정합니다.
ioctl( fd, I2C_SLAVE, ADDR_MY_DEV );
5. write 할때
unsigned char buf[32];
buf[0] = 0x10; // 접근할 디바이스의 레지스터 주소
buf[1] = 0xaa; // 0x10 번지에 쓸 데이타
buf[2] = 0xbb; // 0x11 번지에 쓸 데이타
rtn = write( fd, buf, 3 ); // reg_addr + data + data 버퍼의 유효개수는 3개이다.
rtn 값으로 성공했는지 확인한다.
6. read 할때
unsigned char buf[32];
buf[0] = 0x10; // 접근할 디바이스의 레지스터 주소
rtn = write( fd, buf, 1 ); // 접근할 레지스터의 주소를 설정한다.
rtn 값으로 성공했는지 확인한다.
rtn = read( fd, buf, 2 ); // 2개의 데이타를 읽어온다.
rtn 값으로 성공했는지 확인한다.
제가 하는 방식인데 쩝..
커널에 Documentation/i2c/smbus-protocol 문서를 참조로 작업하시면 편하실겁니다.
- i2c open
sprintf(filename,"/dev/i2c-%d",adapter_nr);
if ((file = open(filename,O_RDWR)) < 0)
{
printf("nFile Open Error");
exit(1);
}
if (ioctl(file,I2C_SLAVE, addr) < 0) {
printf("nError : Slave Address...");
exit(1);
}
open & address 지정뒤
읽고자하는 레지스터를 아래와 같은 방식으로 읽으시면 됩니다.
t_reg = 0x83; //register address
t_value = 0x00; //register value
i2c_smbus_write_byte( file, t_reg );
t_value = i2c_smbus_read_byte( file );
printf("TVP5150 Rom Ver = 0x%xrn", t_value);
ic마다 address / register 가 틀리니 Documentation/i2c/smbus-protocol 의 문서를 참고로 하셔서 쓰시면 됩니다.
'Embeded' 카테고리의 다른 글
bluetooth 포팅 하면서 본 싸이트들. (0) | 2013.11.29 |
---|---|
임베디드 리눅스로 I2C 버스에 접근하자 (0) | 2013.04.03 |
임베디드 리눅스로 I2C 버스에 접근하자 (0) | 2013.03.26 |