技术天地

嵌入式Linux工控板EM9160的I2C功能及其应用    发布时间:2010-6-13    被阅览数:

        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上拉是必须的。

 

嵌入式Linux工控板EM9160的I2C功能电路原理图

 

        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,设置时间,读取时间等功能。感兴趣的客户可向英利公司技术支持索取范例源码。

 

        附件下载:
        1、RX-8025 I2C总线接口实时时钟(RTC)芯片数据手册
        2、EM9160操作RX-8025电路原理图

Go Top