总览:
在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接口成为当今移动设备上最重要的控制方式之一。
相关问题拓展阅读:
linux 内核版本银谈? 有可能内核里已经有mpu6050的driver了,如果有的话并且编译进内核的花/sys下应该有对应的文件,读取的话要看driver怎么写;直接通过/dev/下锋茄碰的i2c总线节点也可以纳卜读,不过需要地址
如果是像德州仪派滑液器这种奇葩的mcu来读取,那尘物么地址是0x68,但如果是像stm32或atmel8051这种比较正常的mcu来读取,那么让芹地址就是0xd0。德州仪器的i2c地址和其他许多种mcu相比,右偏了一位。
i2C总线的驱动程序一般针对不同的CPU是不一样的,所岁帆以都位于arch目录下对应的cpu架构的common文件夹下。
对同一种架轿雀和构的来看,I2C驱动仅实现底层的通信。故其是通闭盯用的。
linux 应用端i2c接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 应用端i2c接口,Linux应用:i2c接口操作指南,ARM开发板linux下用I2C读取mpu6050的数据,linux内核中i2c总线驱动对所有的i2c设备是否是通用的的信息别忘了在本站进行查找喔。
成都创新互联科技有限公司,是一家专注于互联网、IDC服务、应用软件开发、网站建设推广的公司,为客户提供互联网基础服务!
创新互联(www.cdcxhl.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。创新互联——四川成都IDC机房服务器托管/机柜租用。为您精选优质idc数据中心机房租用、服务器托管、机柜租赁、大带宽租用,高电服务器托管,算力服务器租用,可选线路电信、移动、联通机房等。
分享文章:Linux应用:i2c接口操作指南(linux应用端i2c接口)
分享地址:http://www.shufengxianlan.com/qtweb/news33/327883.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联