Board logo

标题: 英创工业主板EM9160的GPIO应用于I2C通讯 [打印本页]

作者: emtronix20105    时间: 2010-9-30 16:26     标题: 英创工业主板EM9160的GPIO应用于I2C通讯

本帖最后由 yumuzi 于 2010-9-30 16:31 编辑

英创EM9160 ARM9工业主板具有丰富的GPIO资源,通过GPIO来实现SPI,I2C的数据传输,具有使用非常灵活的优点,同时最高波特率还可达到1Mbps以上。I2C在智能终端中的应用非常普遍,如I2C总线时钟芯片,I2C总线存贮器等。之前已对I2C总线操作铁电存贮器有过说明,相关文章请参考嵌入式技术天地工控主板支持铁电存储器的简易方案”(http://www.emtronix.com/article/article2009328.html )。英创公司的EM9160工业主板的高性价比与高可靠性,使其在智能终端中的应用中越来越具优势。为了更进一步说明EM9160工业主板使用GPIO来摸拟I2C总线的应用,本文对具有自动温度补偿的实时钟RX8025的操作为例来说明。对于I2C总来来说,最重要的是同步时钟与数据之间的时间关系,为了便于用户直接使用,英创公司将GPIO摸拟I2C的操作过程进行了封装,提供最简洁的函数作为接口,被定义在I2C的头文件GPIO_I2C.h中,如下所示:        // 初始化I2C总线,主要是设置所使用的GPIO的输出状态
       int I2C_Init ( );                                       

       //通过I2C写数据
//输入参数
// uDevAddr  I2C器件的物理地址
// uRegIdx    要操作的I2C器件内部的寄存器地址
// abyte      要写入到I2C的数据
//返回值:>=0 操作成功
//            =-1 操作失败
       int I2C_ByteWrite(UCHAR uDevAddr, UCHAR uRegIdx, UCHAR abyte);

       //通过I2C读取数据
//输入参数
// uDevAddr  I2C器件的物理地址
// uRegIdx    要操作的I2C器件内部的寄存器地址
// pBuf       所读取的数据的输出BUFF
// DataLen    要读数据的个数
//返回值:>=0 操作成功 即读取出来的有效数据
//            =-1 操作失败
       int I2C_ByteRead(UCHAR uDevAddr, UCHAR uRegIdx, UCHAR* pBuf, int DataLen);

实现I2C通讯过程控制的源代码在GPIO_I2C.cpp中,同时在该文件中定义了I2C总线能够使用的引脚资源及I2C总线SCL、SDA所使用的信号定义:
#define     GPIO0   0x01
#define     GPIO1   0x02
#define     GPIO2   0x04
#define     GPIO3   0x08
#define     GPIO4   0x10
#define     GPIO5   0x20
#define     GPIO6   0x40
#define     GPIO7   0x80
#define     GPIO8   0x100
#define     GPIO9   0x200
#define     GPIO10  0x400
#define     GPIO11  0x800
#define     GPIO12  0x1000
#define     GPIO13  0x2000
#define     GPIO14  0x4000
#define     GPIO15  0x8000

#define     SCL  GPIO6   // GPIO6 被定义为I2C时钟信号线
#define     SDA  GPIO7   // GPIO7 被定义为I2C数据线

       在使用EM9160工业主板的GPIO来实现I2C总线通讯时,同步时钟能稳定地工作在250KHz。要注意I2C的两个信号线,分别为同步时钟信号线SCL与双向通讯数据线SDA,这两条信号线所使用的GPIO被定义在GPIO_I2C.CPP文件中,如上面所示。在使用时根据实际情况,只需重新定义SCL和SDA信号所使用的GPIO即可。下面是调用GPIO_I2C中的操作函数实现时实钟RX8025操作的调用方法:
        //时钟寄存器数据读取
int  RTC_ByteRead( unsigned char REG_Addr , unsigned char *pBuf , int iLen)
{
     UCHAR cRByte;
     int   i1 ;

     cRByte = REG_Addr<<4; //根据RX8025的要求,寄存器地址放在高4位
     i1 = I2C_ByteRead( RX8025_ADDR , cRByte , pBuf , iLen );
     return i1;
}
        //时钟寄存器数据设置
int  RTC_ByteWrite( unsigned char REG_Addr, unsigned char Value )
{
     UCHAR cRByte;
     int i1;

     cRByte = REG_Addr<<4;
     i1 = I2C_ByteWrite( RX8025_ADDR , cRByte ,  Value );
     if( i1 == -1 )
            return -1;
     return 1;
}
       再次调用以上两个实时钟读写操作函数则可轻实现现对RX8025的操作,如下:
       //只读取控制寄存器2
       i1 = RTC_ByteRead ( Reg_Contor2 , &cTmp , 1 );
       //从秒地址开始将年、月、日、时、分、秒、星期的数据一次性读出
       i1 = RTC_ByteRead( Reg_Second , cTmp , 7 );
       //设置时间寄存器“年”为10年
       i1 = RTC_ByteWrite( Reg_Year , 0x10 );

       对于I2C总线协议,请参考相关的参考资料。提供的GPIO摸拟I2C总线的程序适用于英创公司所有的嵌入式主板,感兴趣的客户可向英创索要相关源代码。

[查看全文]
[更多文章]

本文PDF格式下载




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0