Linux应用:i2c接口操作指南 (linux 应用端i2c接口)

总览:

在Linux应用中,I2C接口操作是很常见的,I2C口和SPI口一样,都是串行接口的一种,其特点是数据传输速率较慢,但是使用线路简单,能够与多个设备进行通讯。本文将为大家介绍如何在Linux中使用i2c接口,并对常用i2c外设进行详细的操作指南。

之一部分:i2c接口的介绍

i2c接口(Inter-Integrated Circuit)是一个由任意数目的主机、从机和总线构成的串行总线标准。i2c是一种串行通信协议,由Philips公司开发,主要用于集成电路(IC)之间短距离通信。

i2c总线的主要特点是使用双线传输,包含一个时钟线SCL(Serial Clock Line)和一个数据线SDA(Serial Data Line)。i2c总线和SPI总线不同,它是一种多主机的通信方式,即在同一个总线上可以连接多个主机和多个从机,所有设备都共享一个时钟和数据线。i2c总线上的设备地址是可编程的,而且一般默认都是使用7位的地址,更高位为0表示写操作,更高位为1表示读操作。

第二部分:i2c内核驱动

i2c设备的驱动程序分为两类,一种是适用于User Space(用户空间)的I2C驱动,另一种是适用于Kernel Space(内核空间)的I2C驱动。

在Linux内核中,i2c驱动已经被内置,因此只需要在驱动模块中进行引用即可,我们可以使用以下命令来查看当前内核是否已经集成了i2c设备驱动:

# ls /dev/i2c*

在i2c设备驱动中,需要使用以下头文件:

#include

另外,我们还需要使用以下结构体和函数:

struct i2c_msg – 这个结构体定义了一个I2C数据交换缓冲区

struct i2c_rdwr_ioctl_data– 这个结构体定义了一个完整的I2C数据交换序列,包含多个msg

ioctl()函数 – 这个函数用于处理I2C数据链路路径的IO控制请求

使用以下命令即可在驱动中配置i2c设备:

# modprobe i2c-dev

在使用i2c总线接口与外设通讯时,首先需要通过I2C函数来打开I2C设备:

fd = open(“/dev/i2c-0”, O_RDWR);

其中fd就是打开设备返回的文件描述符。可以使用以下函数来配置I2C的从设备地址、寄存器地址等相关信息。

ioctl(fd, I2C_SLAVE, slave_address);

这里slave_address就是所要访问的从设备地址。使用了一些通用的ioctl()来进行I2C链路的控制。

接下来便可以通过write()和read()函数来访问I2C从设备中的寄存器和信息等。

第三部分:常用i2c从设备操作

1. i2c温度传感器

当想控制一个需要知道温度变化的应用程序时,可以考虑使用I2C温度传感器。这里我们以LMT84温度传感器为例,来介绍如何使用I2C读取温度值。

在对i2c数据链路路径的IO控制请求中,我们需要指定读取8位的温度值,并将高+低2位数据进行转换:

unsigned char buf[2] = {0};

struct i2c_msg msg_recv[] = {

{slave_address, I2C_M_RD, 2, buf}

};

struct i2c_rdwr_ioctl_data rdwr_data_recv = {

msgs : msg_recv,

nmsgs : 1

};

ioctl(fd, I2C_RDWR, &rdwr_data_recv);

int temp = (buf[0]

temp >>= 5;

temp *= 100;

temp >>= 6;

如上代码,我们使用I2C数据交换缓冲区结构体struct i2c_msg,向i2c设备进行读取,并将读取数据放在buf数组中。

2. i2c触摸屏

i2c触摸屏是一种常见的I2C外设,它可以帮助我们实现人机交互的界面操作。触摸屏常常使用ADS7843芯片,通过I2C协议与主控制器通讯。我们可以通过I2C设备驱动程序,对ADS7843芯片进行初始化参数配置,实现I2C触摸屏的基本操作。

初始化I2C:

int gs_i2c_module_open( void )

{

int iResult = 0;

iResult = open( “/dev/i2c-1”, O_RDWR );

if( iResult

printf( “%s : %d , error-code = %d\n”, __func__, __LINE__, errno );

return iResult;

}

return iResult;

}

初始化ADS7843:

int gs_i2c_adc_init( void )

{

i2c_api_open();

i2c_api_write_byte( ADS7843_CMD_MODE );

i2c_api_write_byte( ADS7843_SER_START );

i2c_api_write_byte( ADS7843_CMD_CONTROL1 );

i2c_api_write_byte( ( 0

i2c_api_write_byte( ADS7843_CMD_CONTROL2 );

i2c_api_write_byte( ( 0

i2c_api_write_byte( ADS7843_CMD_START );

return 0;

}

读取X、Y坐标值和触摸状态:

#define GS_ST_RETRY (0)

#define GS_ST_FL (1)

#define GS_ST_SUCCESS (2)

int gs_i2c_adc_read( gs_point_t *pst_coord )

{

unsigned short us_x = 0, us_y = 0;

unsigned char uc_i = 0, uc_count = 25;

i2c_api_open();

for( uc_i = 0; uc_i

{

i2c_api_write_byte( ADS7843_CMD_START );

usleep( 200 );

us_x = i2c_api_read_word( ADS7843_CMD_READ_X );

usleep( 200 );

us_y = i2c_api_read_word( ADS7843_CMD_READ_Y );

if( us_x = 4000 || us_y = 4000 )

{

continue;

}

us_x = gs_adc_x_raw_to_value( us_x );

us_y = gs_adc_y_raw_to_value( us_y );

pst_coord->us_x = us_x;

pst_coord->us_y = us_y;

pst_coord->uc_scale = 0;

return GS_ST_SUCCESS;

}

return GS_ST_FL;

}

在手机和平板等移动设备的控制中,通常都会用到I2C接口。iPhone和iPad中的感应器、大多数Android设备的触摸屏都是通过I2C与主机通讯的,因此I2C接口成为当今移动设备上最重要的控制方式之一。

相关问题拓展阅读:

ARM开发板linux下用I2C读取mpu6050的数据

linux 内核版本银谈? 有可能内核里已经有mpu6050的driver了,如果有的话并且编译进内核的花/sys下应该有对应的文件,读取的话要看driver怎么写;直接通过/dev/下锋茄碰的i2c总线节点也可以纳卜读,不过需要地址

如果是像德州仪派滑液器这种奇葩的mcu来读取,那尘物么地址是0x68,但如果是像stm32或atmel8051这种比较正常的mcu来读取,那么让芹地址就是0xd0。德州仪器的i2c地址和其他许多种mcu相比,右偏了一位。

linux内核中i2c总线驱动对所有的i2c设备是否是通用的

i2C总线的驱动程序一般针对不同的CPU是不一样的,所岁帆以都位于arch目录下对应的cpu架构的common文件夹下。

对同一种架轿雀和构的来看,I2C驱动仅实现底层的通信。故其是通闭盯用的。

linux 应用端i2c接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 应用端i2c接口,Linux应用:i2c接口操作指南,ARM开发板linux下用I2C读取mpu6050的数据,linux内核中i2c总线驱动对所有的i2c设备是否是通用的的信息别忘了在本站进行查找喔。


数据运维技术 » Linux应用:i2c接口操作指南 (linux 应用端i2c接口)