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

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

3天内不再提示

如何通过I2C总线I/O口实现系统的多个功能?

电子设计 作者:电子设计 2018-08-30 10:05 次阅读

1 引言

随着单片机控制系统的不断扩大以及控制功能不断增多,有限的单个单片机通用I/O口已不能满足同一系统中控制多个受控对象需要,随着FC总线研究的深入,用I2C总线扩展单片机I/O口的方法在全自动、半自动仪器的开发领域得到了广泛应用,本文介绍了一个测试系统通过FC总线扩展I/O口实现了系统的多个功能。给出了系统的硬件连接以及Atmega128与三个Atmega168之间的软件通信流程图。

2 系统的硬件结构

图1是作者所研究的测试系统的整体框图,本系统中主要芯片PHILIPS公司LPC2292,在此系统中键盘上其中三个按钮分别控制三个电机,系统的主要功能是LPC2292将扫描到的键盘信息发给Atmega128单片机,Atmega128单片机通过I2C总线寻址Atmega168,并向被寻址的Atmega168发送电机控制命令,最后,电机根据Atmega168控制策略正常运行。电机启动同时,数据采集模块也开始正常运行,数据采集模块把采到数据送到LPC2292的A/D转换接口,然后将ADC输出的数据发送到LCD。系统中的拨码开关用于设置相应的Atmega168单片机的地址,当单片机Atmega128接收到LPC2292发来的控制命令时,通过I2C总线寻址Atmega168,当某个Atmega168的地址与Atmega128广播地址相同时,它就开始根据Atmega128发送的命令控制电机开始工作。

如何通过I2C总线I/O口实现系统的多个功能?

图1基于I2C总线的I/O扩展框图

3 I2C总线

I2C总线是PHILIPS公司推出的芯片间串行数据传输总线,软、硬件协议十分巧妙,2根线(SDA,SCL)HP可实现完善的全双工同步数据传送,能够十分方便地构成单主系统或多主系统和外同器件扩展系统。不过,多主系统(即系统中有多个I2C总线接口的单片机)会出现多主竞争的复杂状态。I2C器件是把I2C的协议植入器件的I/O接口,使用时器件直接挂到I2C总线上,这一特点给用户在设计应用系统时带来了极大的方便。I2C器件无须片选信号,是否选中是由主器件发出的I2C从地址决定的。

所有挂到I2C总线的外围器件,各自都有一个唯一确定的地址。任何时刻总线上只有一个主控器件对总线实行控制权,分时实现点对点的数据传送。I2C总线上所有外闱器件都有规范的器件地址,器件地址由7位组成,它和1位方向位(R/W)构成了I2C总线器件的寻址字节SLA,格式如下:

如何通过I2C总线I/O口实现系统的多个功能?

器件地址(A6,A5,A4,A3)是I2C总线外围接口器件同有的地址编码(4位或5位),器件出厂时已固化好。引脚地址(A2,A1,A0)和器件在电路中的实际接法有关(地址线、电源或地),形成地址数据。数据方向位(R/W)规定了总线上的主节点对从节点的数据传送方向,当(R/W)位置1时接收,当(R/W)为0时发送。图1中的拨码开关设置了从单片机Atmega168的地址,也就是从机地址的低三位(A2,AI,A0),当某个拨码开关的某个开关闭合时,相应的地址位为零,否则相应位为1,因此可以通过拨码开关上开关的状态来设定从单片机Atmega168的地址,比如某个拨码开关与A0、A2位对应的开关闭合,与Al对应的开关断开,那么这个单片机地址的低三位为010。

4 I2C通信的流程图

根据I2C总线的传输协议规范和硬件连接,作者给出了如图2和图3基本程序流程图和部分程序。开发语言为c语言,与汇编语言相比,可以提高软件的执行速度。

4.1 主机发送/从机接收I2C子程序流程图

图2和图3给出了主机发送,从机接收I2C子程序流程图,通过I2C总线发送/接收数据时,I2C总线的控制寄存器的中断位必须先置位,为了避免因为某种原因不能使控制寄存器的中断位置位而导致程序进入死循环,作者在I2C总线通信程序发送/接收数据前编写了中断循环等待和错误处理程序,大大提高了程序的可靠性,具体程序如下:

while(!(TWCR & (1<

if(j>10000) return O:

应用I2C总线发送数据时,作者采用了状态位查询方法,并且给出了错误标志置位、错误跳出程序,下面的程序是发送从机地址的部分程序:

switch(TWSR & 0XF8)

{

case Oxl8: flag=0; break;

case 0x20:flag=1; break;

case 0x38:flag=l; break;

default:return 0:

}

if(flag) continue;

如何通过I2C总线I/O口实现系统的多个功能?

图2 I2C主机发送程序框图

程序中的flag=0表示从机地址发送成功,flag=1表示从机地址发送失败,当TWSR寄存器中的状态码为0x18时,表明从机地址已发送,并且接收到ACK,同时错误标志“flag”置0,下一步通过心发送数据,当TWSR寄存器中的状态码为0x20时,表明从机地址已发送,但是接收到NO ACK,同时错误标志”flag”置1,下一步执行“if(flag)continue;”语句,结束本次循环,当TWSR寄存器中的状态码为0x38时,表明从机地址仲裁失败,同时错误标志“flag”置1,下一步执行“if(flag)continue;"语句,结束本次循环。总线将释放,并进入未寻址从机模式,总线空闲后将发送“start”。程序中“if(flag)continue;”语句使得当数据发送失败时,结束本次循环,返回到开始等待发送命令,这样避免了由于偶尔数据发送失败造成整个程序无法运行,甚至整个设备无法运行,因而,用“if(flag)continue;”语句结束错误传输。可提高I2C通信的质量,同时也提高了使用I2C总线通信的设备的效率。

如何通过I2C总线I/O口实现系统的多个功能?

图3 从机接收流程图

4.2 编程中的注意事项

a)在主机或从机初始化时,一定要设定数据传输方向;

b)由于每次发送/接收数据时TWCR寄存器的中断标志位必须置位,因此程序中要有等待TWCR寄存器中断位置位程序,同时,为了避免由于某种原因导致中断位不能置位造成等待程序进入死循环,在等待中断位置位程序中要有等待超时返回程序。

c)I2C总线的使用,除了基本的启动、结束、应答、非应答子程序外,还应有应答位检查、发送和接收单字节、发送和接收多字节等子程序。

5 结论

作者在程序流程的每个关键部分都设置了错误查询和错误处理,使得I2C程序能够从错误中自动恢复,避免了由于I2C通信导致的错误而使得系统无法正常工作,文中还给出了部分发送子程序和编程注意事项。对于图2和图3的I2C通信流程,作者已在多个科研项目中进行了编程使用。实践证明,按上述流程编写I2C通信程序,主从单片机之间的通信非常可靠。

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

    关注

    453

    文章

    50387

    浏览量

    421782
  • 寄存器
    +关注

    关注

    31

    文章

    5317

    浏览量

    120001
  • I2C总线
    +关注

    关注

    8

    文章

    388

    浏览量

    60826
收藏 人收藏

    评论

    相关推荐

    GPIO模拟I2C总线的驱动设计与实现

    I2C总线简单方便,是我们经常使用的一种总线。但有时候我们的MCU没有足够多的I2C控制器来实现我们的应用,所幸我可以使用普通的GPIO引脚
    发表于 12-14 14:19 5332次阅读
    GPIO模拟<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>的驱动设计与<b class='flag-5'>实现</b>

    i2c总线ppt(I2C总线器件应用)

    I2C总线器件应用第一节 I2C总线器件应用概述I2C总线工作原理
    发表于 08-13 17:34 0次下载

    用嵌入式系统的SPI模块实现I2C总线通信

    I2C一般用于单主机系统中。在单主机系统中,通信系统的主机可能没有I2C接口模块, 而直接使用主机的I
    发表于 04-15 11:47 38次下载

    i2c总线的特点

    i2c总线的特点:2 I2C 总线使设计人员和厂商都得益.. 3 2.1 设计人员的得益.. 4 2.2 厂商的得益. 5
    发表于 08-05 09:05 26次下载

    用Verilog HDL实现I2C总线功能

    简述了I2C总线的特点;介绍了开发FPGA时I2C总线模块的设计思想;给出并解释了用Verilog HDL实现部分
    发表于 10-19 10:49 104次下载

    I2C总线

    I2C BUS(Inter IC BUS)是NXP 推出的芯片间串行传输总线,它以2 根连线实现了完善的双向同步数据传送,可以极方便地构成多机系统
    发表于 11-03 11:26 49次下载

    I2C总线在Linux系统中的驱动设计

    介绍I2C总线的基本概念和工作原理,叙述I2C总线扩展器件ZLG7290的功能特点。在以S3C2
    发表于 12-29 16:52 40次下载

    什么是i2c总线

    什么是i2c总线  下载请点击: i2c总线协议中文版 
    发表于 11-05 09:26 2906次阅读

    用Verilog HDL实现I2C总线功能

    摘要: 简述了I2C总线的特点;介绍了开发FPGA时I2C总线模块的设计思想;给出并解释了用Verilog HDL实现部分
    发表于 06-20 13:17 6874次阅读
    用Verilog HDL<b class='flag-5'>实现</b><b class='flag-5'>I2C</b><b class='flag-5'>总线</b><b class='flag-5'>功能</b>

    I2C I/O扩展芯片特性分析

    简介   I/O口扩展芯片可用于MCU/DSP通用I/O口的扩展,通过I2C
    发表于 07-20 09:54 1.3w次阅读

    基于CPLD的I2C总线接口设计

    在电路设计中,I2C总线是比较常用的两线式串行通信方式,大多数的CPU都擅长于并口操作,不具备直接操作I2C总线接口的能力。为了使不具备I2C
    发表于 02-12 16:11 95次下载
    基于CPLD的<b class='flag-5'>I2C</b><b class='flag-5'>总线</b>接口设计

    NIOS实现I2C总线

    I2C 总线实现关键是SDA,他是双向线,如果对与一个芯片只写而不读,I2C 实现起来很容易.使用NIOS
    发表于 11-01 14:28 37次下载

    I2C总线应用系统设计运用

    I2C总线应用系统设计运用
    发表于 09-22 11:44 10次下载
    <b class='flag-5'>I2C</b><b class='flag-5'>总线</b>应用<b class='flag-5'>系统</b>设计运用

    上电和复位 16 位 PCA I2C 总线 I/O 扩展器

    上电和复位 16 位 PCA I2C 总线 I/O 扩展器
    发表于 11-15 20:32 1次下载
    上电和复位 16 位 PCA <b class='flag-5'>I2C</b> <b class='flag-5'>总线</b> <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 扩展器

    I2C串行总线协议是什么?I2C总线有哪些优点?

    1982年发明并推广,用于连接智能传感器和存储器器件,以及控制和监控外设。该协议是一种主从式通信协议,允许多个从设备连接到同一总线上,并在总线上进行数据交换。I2C
    的头像 发表于 09-12 11:18 1559次阅读