i2c总线是一种2线制的主从通讯协议,主要运用于器件之间的数据通讯,在嵌入式系统中得到非常广泛的应用。作为一款高性价比的嵌入式linux工控板,em9160的对i2c总线提供了良好的支持,其主要特点是em9160的16位gpio中的任意位都可作为i2c总线的时钟信号scl或数据地址信号sda,这样客户可根据自己整机的具体情况,灵活的配置em9160的gpio管脚来作为i2c总线信号。
在linux环境,i2c的驱动程序已自动加载,其设备文件名为“/dev/em9x60_i2c”。应用程序通过3个ioctl命令来操作i2c接口:首先需要配置i2c总线资源,包括scl、sda信号和通讯速度,然后才能根据具体芯片的特性对其内部寄存器进行读写操作。以下以电力智能终端中广泛使用的rtc芯片rx-8025为例,对i2c的操作流程作进一步的介绍。
硬件电路:rx-8025是一种带i2c总线接口的实时时钟(rtc)芯片,具有精确调整的晶体频率,可满足电力智能终端需求。在下图中,em9160的gpio6作为i2c总线的scl信号、gpio7作为sda信号,注意10k上拉是必须的。
i2c总线配置:pwm调用函数fd=open(”/dev/em9x60_i2c”, o_rdwr)打开设备文件后,首先需要配置总线,具体操作是把参数设置到指定的数据结构中,再调用ioctl命令如下:
struct i2c_config config; //定义在em9x60_drivers.h
config.scl_gpio_num = gpio6; //gpio6作为scl,定义见em9x60_drivers.h
config.sda_gpio_num = gpio7; //gpio7作为scl
config.speed = 0; //=0:正常速度;=1:高速;=2:全速
i2c总线的速度指波特率,=0是最通常的速度,大约200kbps,可用于大多数rtc、ad芯片;=1:高速时指波特率接近400kbps;=2:全速的波特率可高达1mbps,主要用于存储器类型的芯片。设置操作如下:
rc = ioctl(fd, em9x60_i2c_ioctl_config, &config);
i2c数据写:em9160的i2c总线写操作,由数据结构struct i2c_io来传递参数和数据,具体定义可查看em9x60_drivers.h。写操作支持一次最多可写入16个字节,但具体写入多少还受i2c器件本身的限制,如rx-8025只支持一次对一个寄存器写入,例如写入30秒到rtc的秒寄存器的具体代码操作如下:
struct i2c_io io_info;
io_info.dev_addr = rx8025_addr; //rx8025_addr定义在rx-8025.h
io_info.reg_addr = sec_reg; //sec_reg定义在rx-8025.h
io_info.data_len = 1; //1个字节
io_info.data_buf[0] = 0x30; //注意是bcd码
rc = ioctl(fd, em9x60_i2c_ioctl_write, &in_info); //执行写操作
i2c数据读:em9160的i2c总线读操作,由数据结构struct i2c_io来传递参数和数据,具体定义可查看em9x60_drivers.h。读操作支持一次最多可写入16个字节,但具体一次读出多少字节还受i2c器件本身的限制,rx-8025支持一次读出多个寄存器的数据,例如一次读取全部日期时间信息共7个字节,具体代码操作如下:
struct i2c_io io_info;
io_info.dev_addr = rx8025_addr; //rx8025_addr定义在rx-8025.h
io_info.reg_addr = sec_reg; //sec_reg定义在rx-8025.h
io_info.data_len = 7; //7个字节
rc = ioctl(fd, em9x60_i2c_ioctl_read, &in_info); //执行读操作
i2c数据读写所用的数据结构中,reg_addr表示被读写器件的寄存器地址,若为单字节地址,该变量的最高位(msb = d31)应为0;若为双字节地址,地址占用reg_addr的d15 - d0(最低位,lsb),而变量的最高位d31必须置为1。另外,对不需要寄存器的器件,可把reg_addr设置为0xffffffff,这时驱动程序将不再发送寄存器地址。上述代码中从rx-8025读出的数据均为bcd,通常需要转换成c语言的整型数据类型。
为了方便客户使用rx-8025,我们编写了通过em9160的i2c驱动程序操作rtc的范例程序,包括启动rtc,设置时间,读取时间等功能。感兴趣的客户可向英利公司技术支持索取范例源码。
接收设备都有哪些产品形式?车载系统主要由哪些设备组成?
变压器在电力系统中的主要应用是什么?
美用无毒纳米硅晶体制造“电子墨水”
9月新能源汽车销量增长迅猛,同比增长67.7%
智慧社区的功能介绍
英创信息技术嵌入式Linux工控板EM9160介绍
好用又不贵的7座SUV该怎么挑选?本文告诉你答案!
方锡智:沃尔沃将推新一代数字化营销服务平台
介绍泛广电领域的卫星传输和公网传输
单片机智能开发平台解决方案
NIDays成年礼:用平台化系统描绘物联时代
动力电池拆解需要什么设备
中国航天系列:东方红一号
UltraFast 设计方法--赛灵思推荐最佳实践总结
LLM时代NLP研究何去何从?
Python语言在数据分析、挖掘场景中常用特性
VR市场的前景走势将会如何
卢旺达正在采用区块链技术,跟踪采矿场的开采和供应
你了解半导体吗?知道半导体的发展史吗?
我国在西昌成功发射北斗导航卫星系统第32颗