linux user mode i2c dev 설정 및 온도 센서 lm75b i2c 통신 sample code
Linux user mode에서 i2c 드라이버 사용 예제와 이를 이용하여 온도센서
lm75b에서 온도 데이터를 읽어오는 예제이다.
Linux kernel configuration
1. Device Drivers에서 I2C Support를 선택한다.
2. I2C Hardware Bus support에서 사용하는 프로세서에 맞는 I2c 컨트롤러를
선택한다.
몇몇 프로세서의 플랫폼에서는 별도의 i2c 핀 설정 등을 요구하는 경우가
많다.
3. 커널 설정이 끝나고 새로 빌드하여 보드에 업로드 하면 아래 그림과 같이
/dev/폴더에 디바이스 이름이 나타나는 걸 볼 수 있다.
위 설정이 끝나면, open/read/write를 사용하여 i2c 디바이스의 데이터를 읽고
쓰는 것이 가능해진다.
Temperature sensor lm75b sample code
다음은 온도 센서 lm75b의 온도 데이터를 i2c를 통해 읽어오는 과정에 대한
예제이다.
온도 센서 초기화 : 온도센서가 연결된 i2c를 slave 모드로 열고, lm75b의
configuration register를 조정해 power on으로 만들어준다.
int lm75b_init(char *dev,int address)
{
int fd = open(dev, O_RDWR);
if (fd <= 0)
{
return 0;
}
if (ioctl(fd, I2C_SLAVE, address)<0)
{
close(fd);
return 0;
}
lm75b_write(fd, mb75b_reg_configuration,
mb75b_config_shutdown_poweron);
return fd;
}
I2c를 사용해 온도센서에 데이터를 읽고 쓰는 예제 코드이다.
int lm75b_read(int fd, uint8_t reg, int *oival)
{
uint8_t data[2] = { 0, };
if (fd <= 0 || !oival) return -1;
data[0] = reg;
if (write(fd, data, 1) != 1)
{
return -1;
}
if (read(fd, data, 2) != 2)
{
return -1;
}
*oival = ((((int)data[0] << 8 | data[1])) >> 5);
if (data[0] & 0x80)
{
*oival |= 0xfffffc00;
}
return 0;
}
int lm75b_write(int fd, uint8_t reg, uint8_t val)
{
uint8_t data[2] = { 0, };
if (fd <= 0) return -1;
data[0] = reg;
data[1] = val;
if (write(fd, data, 2) != 2)
{
return -1;
}
return 0;
}
온도센서 사용이 끝난 뒤 configuration register를 조정해 shutdown 모드로 만들어주고, close를 사용하여 i2c fd를 닫아준다.
void lm75b_deinit(int fd)
{
if (fd)
{
lm75b_write(fd, mb75b_reg_configuration,
mb75b_config_shutdown_shutdown);
close(fd);
}
}
다음은 위 함수를 사용한 예제이다.
#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#define lm75b_dev_path "/dev/i2c-1"
#define lm75b_address (0x90>>1)
//#define lm75b_powen_gpio
#define mb75b_reg_temperature 0x00
#define mb75b_reg_configuration 0x01
#define mb75b_config_shutdown_poweron
0x00
#define mb75b_config_shutdown_shutdown
0x01
int main(int argc, char *argv[])
{
int ival = 0;
int fd = 0;
#if defined(lm75b_powen_gpio)
gpio_export(lm75b_powen_gpio);
gpio_set_outdir(lm75b_powen_gpio, 1);
gpio_set(lm75b_powen_gpio, 1);
#endif
fd = lm75b_init(lm75b_dev_path, lm75b_address);
if (fd <= 0)
{
return 0;
}
if (lm75b_read(fd, mb75b_reg_temperature, &ival) == 0)
{
// 0.125'c per unit
int temperature = (ival * 125) / 1000;
}
lm75b_deinit(fd);
#if defined(lm75b_powen_gpio)
gpio_set(lm75b_powen_gpio, 0);
#endif
return 0;
}
[관련 포스트]
댓글
댓글 쓰기