0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术EM9170工控主板I2C总线介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-01-14 15:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

EM9170提供了一路硬件I2C总线,与GPIO6和GPIO7复用。系统启动后,引脚状态默认为GPIO输入状态。当打开I2C后,系统重新设置GPIO引脚为I2C总线模式。在使用时需要注意,I2C的两条信号线上均要加上拉电阻才能正常使用I2C功能。

在CE6.0操作系统中,I2C资源的使用,需要系统驱动程序作为支持。所以使用时,可以反复调用DeviceIoControl来实现。为了方便使用,英创公司基于驱动程序,封装了4个I2C的操作函数便于应用程序调用,在这4个函数内都是调用DeviceIoControl来实现,相关源码在例程文件夹的I2C.CPP文件中。由于I2C操作时,需要传输的参数量较多,所以在I2C的API函数中使用了一个统一的数据结构来作为参数传递载体,该数据结构的定义如下:
typedef struct
{
BYTE SlaveAddr; // 要操作的I2C器件的设备物理地址
WORD RegAddr; // 要操作的设备的存贮器起始地址
BYTE *pDataBuff; // 要写入/读出的数据BUFF
int iDLen; // 要写入/读出的数据的字节长度
} I2CParameter , *pI2CParameter;
在进行I2C操作之前,需要设置I2C设备的物理地址、要操作的存贮器起始地址,数据长度及数据。即定义一个I2CParameter类型的变量并设置相应参数,在调用I2CWrite和I2CRead时,将该变量传递给pI2CParameter类型的指针即可。如:

I2CParameter I2C1; // 定义一个I2CParameter结构类型的变量
I2C1.SlaveAddr=0xa0; // I2C设备物理地址设置为0xA0
I2C1.RegAddr=0; // 要操作的I2C设备的寄存器起始地址是0
I2C1.pDataBuff = InBuffer; // I2C操作所分配的BUFF
I2C1.iDLen=50; // 要操作的数据长度是50字节
EM9170的I2C驱动只支持主机工作模式、最高400KHz的工作时钟,可以多个I2C设备并联,由I2C设备的物理地址来进行区分。封装后的I2C操作函数说明如下:
//----------------------------------------------------------------------------
// I2COpen:该函数主要是打开I2C端口并设置好I2C的工作模式。
// 主要任务是:
// 打开I2C,复位I2C控制器,设置I2C工作在Master模式,设置I2C工作时钟为400KHz
//----------------------------------------------------------------------------
HANDLE I2COpen( );
//----------------------------------------------------------------------------
// I2CWrite:通过已打开的I2C设备进行数据写操作
// 输入参数:
// hDevice:已打开设备的HANDLE值
// pI2CPar:操作I2C设备时I2CParameter类型的指针
// 返回:
// 操作成功 TRUE
// 操作失败 FALSE
//----------------------------------------------------------------------------
bool I2CWrite(HANDLE hDevice , pI2CParameter pI2CPar);
/*----------------------------------------------------------------------------
// I2CRead:通过已打开的I2C设备进行数据读操作
// 输入参数:
// hDevice:已打开设备的HANDLE值
// pI2CPar:操作I2C设备时I2CParameter类型的指针
// 返回:
// 操作成功 TRUE
// 操作失败 FALSE
// ------------------------------------------------------------------------------*/
bool I2CRead(HANDLE hDevice , pI2CParameter pI2CPar);
// ------------------------------------------------------------------------------*/
// I2CClose:关闭I2C端口。
// 在不使用I2C时,需要关闭已打开的I2C端口以对话释放相关资源。
// 输入参数:
// 成功打开的I2C设备的HANDLE值
// 返回:
// 操作成功 TRUE
// 操作失败 FALSE
// ------------------------------------------------------------------------------*/
bool I2CClose( HANDLE hDevice );
下面是基于上述API函数,对FM24L256铁电存贮器进行测试的例程:

HANDLE hI2C;
I2CParameter I2C1;
BYTE InBuffer[50],OutBuffer[50];
int i1;
// 初始化I2C设备参数
I2C1.SlaveAddr=0xa0; // I2C设备物理地址设置,每种器件应有对应的物理地址
I2C1.RegAddr=0; // 要操作的I2C设备的寄存器地址
I2C1.iDLen=50; // 要操作读/写的数据长度
I2C1.pDataBuff = InBuffer; // 数据缓冲区,这里为写入缓冲区
for(i1=0;i1<50;i1++) // 产生测试用的随机数据
{
InBuffer[i1] = rand() & 0xff;
}
hI2C = I2COpen(); // 打开I2C端口
if( hI2C == NULL )
{
printf('I2C Open ERR!\r\n');
return 0;
}
if( I2CWrite( hI2C , &I2C1 ) ) // 向已打开的I2C设备进行写操作
{
printf('I2C Write Ok:len=%d\r\n',I2C1.iDLen);
I2C1.pDataBuff = OutBuffer; // 重新设定数据缓冲区,这里为读出缓冲区
if( I2CRead( hI2C , &I2C1 ) ) // 从已开打的I2C设备读取数据
{
printf('I2C Read Ok:len=%d\r\n',I2C1.iDLen);
for(i1=0;i1<50;i1++) // 写入数据和读出数据进行比较
{
if( InBuffer[i1] != OutBuffer[i1] )
{
break;
}
}
if(i1 == 50)
printf('All Test Data OK!\r\n');
else
printf('Test Data Error:%d\r\n',i1);
}
}
I2CClose( hI2C ); // 关闭已打开的I2C端口

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    37155
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    SGM4541 I2C总线过压保护器:设计与应用的详细解析

    SGM4541 I2C总线过压保护器:设计与应用的详细解析 在如今的电子设备设计中,保护电路免受过电压的损害是至关重要的。SG Micro Corp推出的SGM4541 I2C总线过压
    的头像 发表于 03-17 16:30 383次阅读

    SGM4541A:I2C总线过压保护的理想之选

    SGM4541A:I2C总线过压保护的理想之选 在电子设备的设计中,I2C总线的稳定运行至关重要。而SGM4541A作为一款低IQ I2C
    的头像 发表于 03-17 16:30 211次阅读

    I2C总线-通信线缆长度的影响及改进措施

    I2C总线确实不适合远距离通信,尤其是需要使用线缆与I2C接口器件进行通信,这里的“不适合”并不是说不可以,这也是本文的重点。一般使用I2C总线
    发表于 01-21 06:03

    探索PCF8584:I2C总线控制器的卓越之选

    探索PCF8584:I2C总线控制器的卓越之选 在电子工程师的日常工作中,选择合适的芯片来实现特定功能至关重要。今天,我们就来深入探讨一款功能强大的I2C总线控制器——PCF8584,
    的头像 发表于 12-28 15:40 752次阅读

    P82B715:I2C总线扩展的得力助手

    P82B715:I2C总线扩展的得力助手 在电子设计领域,I2C总线是一种常用的通信协议,但它的总线电容限制往往会影响实际通信距离和系统设计
    的头像 发表于 12-26 10:20 1517次阅读

    基于FPGA的I2C控制模块设计

    I2C_WRITE_WDATA.v模块实现I2C写时序,I2C_Controller (I2C控制器)例化了I2C_WRITE_WDATA.
    的头像 发表于 12-26 09:48 5931次阅读
    基于FPGA的<b class='flag-5'>I2C</b>控制模块设计

    TCA39306双向I2C总线和SMBus电压电平转换器技术解析

    TCA39306双向I2C总线和SMBus电压电平转换器技术解析 在电子设计领域,电压电平转换是一个常见且关键的问题,特别是在涉及不同电压标准的总线通信时。TCA39306作为一款双路
    的头像 发表于 12-17 10:00 534次阅读

    I2C的SDA仲裁介绍

    I2C 支持 SDA 冲突检测和仲裁,可以保证在多个主机企图控制 I2C 总线时,I2C 总线上的数据不被破坏。每个主机发送数据时,都会同时
    发表于 12-16 06:25

    I2C总线协议

    I2C 总线使用两根信号线(数据线 SDA 和时钟线 SCL)在设备间传输数据。SCL 为单向时钟线,固定由主机驱动。SDA 为双向数据线,在数据传输过程中由收发两端分时驱动。 I2C 总线
    发表于 12-15 08:07

    基于CW32 MCU的I2C接口优化稳定读写EEPROM关键技术

    CW32 MCU优化I2C接口,确保在与EEPROM芯片通信时的稳定性。内容涵盖以下几个关键技术点: I2C时序与频率调整:介绍如何根据EEPROM的特性,合理设置
    发表于 12-03 07:29

    I2C的优点介绍

    简单性和线路效率: I2C 仅使用两条线路(SDA(串行数据线)和 SCL(串行时钟线))提供简单而高效的通信解决方案,而与总线上的设备数量无关。这种简单性降低了电路设计的复杂性,最大限度地减少
    发表于 11-27 07:49

    I2C的缺点介绍

    距离限制: I2C 主要设计用于单个电路板内或位置较近的组件之间的短距离通信。总线的电容和上拉电阻的电阻限制了可实现的最大通信距离。随着 SDA 和 SCL 线长度的增加,总电容也会增加,从而导致
    发表于 11-27 06:10

    深入剖析I2C协议

    I2C是由Philips开发的简单的双向两线总线,在深入浅出理解SPI协议中,我们区分了单工,半双工,全双工协议数据流向的区别,根据特征,I2C协议属于半双工协议(即同一时刻,数据单向流动)。此外
    的头像 发表于 08-21 15:10 3877次阅读
    深入剖析<b class='flag-5'>I2C</b>协议

    I2C总线通信,为什么要进行电气隔离?

    I2C总线采用双向二线制,支持多主机多从机通信,具备高可靠性、抗干扰能力强,广泛应用于嵌入式系统中。
    的头像 发表于 08-11 11:04 2658次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>通信,为什么要进行电气隔离?

    第十六章 一文浅谈I2C

    本篇文章介绍了W55MH32的I2C总线,其由SDA和SCL构成,具设备寻址等特点,协议含起始 / 停止信号等。阐述主从模式,介绍了相关例程,用于验证
    的头像 发表于 05-28 16:07 1613次阅读
    第十六章 一文浅谈<b class='flag-5'>I2C</b>