基于I2C总线数据写入器的设计

发布者:lxy64420245最新更新时间:2012-02-01 来源: 无忧电子开发网 关键字:I2C总线  数据写入器 手机看文章 扫描二维码
随时随地手机看文章

1  引言
    (Inter-Integrated Circuit)总线是一种用于连接微控制器及其外围设备的总线。总线最主要的优点是其简单和有效。由于接口直接在组件上,故其占用空间小,减少了电路板的空间和芯片引脚的数量,广泛用于智能化仪表。现在有的MCU已提供接口,但对于没有直接支持总线的MCU则需要用软件进行模拟。本文以AT89S52单片机为核心,与PC进行通信,实现具有总线的EEPROM AT24C04读写功能,构成一种数据写入器,用于仪器仪表等设备中表格、曲线和参数等的读写。所有程序用C语言完成。

2  单片机和PC两方的通信格式
    本设计中的数据通信格式如下:第一字节为发给MCU的命令,第二字节保留。后16字节是所要写入的数据。但在开始操作时最先发送的仅为前2字节。命令有如下几种:写命令(CMD_WRITE)、读命令(CMD_READ)、操作结束命令(CMD_OVER)、状态检查命令(CMD_CHECKOK)。
    两方的通信过程大致如下:PC发出前缀为CMD的命令,然后监听串口等待MCU返回的前缀为RSP的准备就绪的回应(写入时为 RSP_WRITEREADY;读出时为RSP_READREADY),若超时则给出错误提示;收到该回应后进行读写操作;结束时PC发出结束命令并等待 MCU的结束回应;若正确收到该回应则提示成功,否则提示操作完成但未收到回应。在写操作中,每发送18字节进行一次确认。另外,由于读芯片中是读出的所有内容,故此时PC不发结束命令而只等待结束回应。
    在执行写操作时,PC都以CMD_WRITE为命令发送18字节的数据并等待MCU的RSP_WRITTEN。在执行读操作时,PC先接受MCU发来的以     RSP_READ为回应的18字节数据,然后再发送1个字节的命令CMD_READ。

3  I2C总线时序模拟
     本设计使用的EEPROM为AT24C04,它可用串行总线。由于89S52不直接支持总线,因此只能使用IO口来模拟的总线时序。89S52可以进行位寻址,这给时序模拟带来了方便。
(1) 通信开始信号
    根据的规程,通信开始信号是当SCL(串行时钟信号)处于高电平时在SDA(串行数据信号)上给出一个下跳沿,且下跳沿后,SCL还要维持高电平4μs。此过程可用如下代码模拟:
_SDA=1;
_SCL=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
_SDA=0;  // 下跳沿
 _nop_();
 _nop_();
 _nop_();
 _nop_();  // 维持SCL为高电平4us
_SCL=0;
(2) 通信停止信号
通信停止信号是当SCL为高电平时在SDA上出现一个上跳沿,且SDA上跳前的低电平应维持4us以上。此过程模拟代码和开始信号类似,在此省略。
(3) 字节传送完毕确认信号
该信号是在SDA为低电平时SCL上出现一个正脉冲,此过程可用如下代码模拟:
_SDA=0;
 _SCL=1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
_SCL=0;
_SDA=1;
(4) 非确认信号
该信号便于控方传送停止信号,在SDA为高电平时,SCL上出现一个正脉冲,除此,模拟代码和字节传送完毕确认信号类似,不再赘述。
利用上述基本操作,并根据AT24C04的时序关系,可以写出对AT24C04进行读写的程序。由于AT24C04中的缓存是16字节,因此在读写时,均是以16字节为单位的。AT24C04总大小为512字节,其中又分了两页,在操作时还应同时指定要操作的页。

4  MCU方的通信
    进入读、写函数后,MCU都要回应PC方发来的命令,以确认准备就绪,所以在读写程序中,并不立即对EEPROM操作。数据写读的流程图如图1和图2所示。其中RSP_WRITEREADY为对写入准备好的回应,RSP_READREADY为对读出准备好的回应,RSP_READ为成功读出一段数据的回应,RSP_FIN为操作完成的回应。

图1    写入EEPROM

图2    读入EPPROM

 

5  PC方的串行通信
    PC方的串行通信使用类CSerialComm来完成。在PC上完成串行通信可用微软的MSComm通信控件,但这样就需要带上封装这个控件的库文件,否则程序不能独立运行。因此本设计采用以Win32 API写成的CSerialComm类来完成。
CSerialComm类继承自CIoController,封装了和串行通信相关的功能。主要成员函数功能如下:
    Open:打开指定的端口。参数指定了所要打开的端口名称,为一个字符串。这个函数打开的串口是同步的。
    SetState:设置串口的状态。参数是一个CSerialState类的指针。
    SetTimeout:设置操作的超时时间,超过了这个时间,读写操作将返回。
    CSerialComm类只提供基本的串口操作,而且不能发送窗口消息,不便于编写Windows的基于消息的程序,因此,从CSerialComm继承一个类CI2CWriter进一步封装对串口的操作,主要成员函数功能如下:
InitPort:调用了CSerialComm的Open函数来打开一个串口,并保留拥有这类对象的窗口指针,以便发送消息。
    Notify:向窗口消息,以通知当前的读写状态。
    BeginWrite,BeginRead,BeginVerify,BeginCheckMCU:分别为开始写、读、校验和检测MCU的状态。它们将产生相应的工作线程。
OpenFile:这个函数用于打开要写入到EEPROM中的文件。参数是所要写入的文件的路径名。由于AT24C04的容量是512字节,故该函数对文件的长度作了限制。[page]
(1) PC方的写入线程
    流程见图3。在写入线程被创建后,它将向MCU发送写命令CMD_WRITE,然后等待MCU的回应RSP_WRITEREADY。成功收到该回应后,写线程将以CMD_WRITE为命令向MCU发送数据,每发送一组,写线程都会等待MCU回应RSP_WRITTEN,成功收到这个回应后,写线程继续发送后面的数据。写入完成时,写线程发送写入结束命令CMD_OVER,并等待MCU回应RSP_FIN以确认完成了写操作。成功收到此回应后,将弹出提示。

图3    写入线程的流程图


    写入线程与界面线程的通信通过向界面线程发消息来实现。写入线程可发如下的消息:WM_ _WRITEOVER,WM_ _BLOCKFINISH,WM_ _COMMFAILED。
    WM_ _WRITEOVER消息提示界面线程写入已经结束。这时界面线程启用校验和读出按钮,禁用写入按钮,向消息框里加入一条写入完成的消息。
WM_ _BLOCKFINISH提示界面线程一个数据块 操作已经完成,界面线程在接收到这条消息后设置进度条,以显示当前的进度。
WM_ _COMMFAILED提示界面线程通信失败,读出按钮可用,写入不可用。
(2) PC方的读出线程
    流程见图4。在读出线程被创建后,它将向MCU发送写命令CMD_READ,然后等待MCU的回应RSP_READREADY。成功收到回应后,读线程将发送CMD_READ命令到MCU,并接收MCU返回的数据。成功收到数据后,读线程检查第一个字节是否为RSP_READ。若是,则保存收到数据,然后再次发出CMD_READ命令。如此反复,直到512字节(32个块)全部完成。

图4    PC方的读出流程图


    读出线程与界面线程的通信也是通过向界面线程发消息来实现的。读出线程可发如下的消息:WM__REA DOVER,WM_I2C_BLOCKFINISH,WM_ _COMMFAILED。其中后两个消息的意义和写线程所发的消息意义一样,所做的工作也是一样的。WM_ _READOVER提示界面线程读出已经完成,界面线程收到这条消息后,将在读出开始时被禁用的读出按钮设为可用,清除进度条并在消息框里加入一条读出完成的消息。
 
6  结束语
    以上介绍了从PC向总线的EEPROM写入数据的基本方法,它既可以经扩充后自成一个系统,比如文本阅读器,也可以作为模块用在其他系统中。对于总线时序的模拟代码则可以当成通用程序使用。

参考文献
[1] 李群芳. 单片微型计算机与接口技术(第2版). 北京:电子工业出版社,2005
[2] Jim Beveridge. Multithreading Applications  in  Win32 Pearson Education

关键字:I2C总线  数据写入器 引用地址:基于I2C总线数据写入器的设计

上一篇:一种C51单片机并行口扩展设计及应用
下一篇:一种基于单片机控制的电梯语音报站器

推荐阅读最新更新时间:2024-03-16 12:52

I2C总线万能程序C语言
reg51.h #include intrins.h unsigned char SystemError; sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义 sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的?枰?炊ㄒ? #define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();} /*-------------------------------------------------------------------------------- 调用方式:void AD7416_I2CStart(void) 2003/05
[单片机]
基于单片机的AT2402的I2C总线读写驱动程序
//此部分为AT2402的驱动程序使用I2C总线连接 #include Function.h //AT2402的功能函数 // 向有子地址器件发送多字节数据函数 //函数原型: bit ISendStr(UCHAR sla,UCHAR suba,ucahr /s,UCHAR no); //功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 // 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 // 如果返回1表示操作成功,否则操作有误。 //注意: 使用前必须已结束总线。 bit ISendStr(unsigne
[单片机]
I2C总线上电压失常故障的分析与检修
    采用I2C总线控制技术的电视机,微处理器(CPU)仅通过数据线SDA和时钟线SOL两根传输线(以下将SDA、SOL简称总线)与所有的被控集成电路(IC)、存储器相连接。常见I2C总线控制电路如图1所示。CPU 的总线输出端通过上拉电阻RP接+5V电源,为CPU的I2C总线输出端口内电路供电。被控电路与总线之间接有隔离电阻R。为保证总线安全可靠的工作,总线上有的还接有防止高压损坏总线电路的 稳压保护二极管D,滤除干扰脉冲的高频电容C。一般常见彩电只有一对总线,根据机型和电路结构的不同,有的彩电采用两对或三对总线。每对总线根据需要,最少挂接一只被控IC,也可挂接多只被控 IC。 图1 常见I2C总线控制电路图   综观
[嵌入式]
I2C总线通信接口的CPLD实现
    摘要: 介绍采用ALTERA公司的可编程器件,实现I2C总线的通信接口的基本原理;给出部分VHDL语言描述。该通信接口号专用的接口芯片相比,具有使用灵活,系统配置方便的特点。     关键词: I2C总线 CPLD VHDL I2C总线是PHILIPS公司开发的一种简单、双向二线制同步串行总线。它只需要两根线(串行时钟线和串行数据线)即可在连接于总线上的器件之间传送信息。该总线是具备多主机系统所需要的包括裁决和高低速设备同步等功能的高性能串行总线,应用极为广泛。 目前,虽然市场上有专用I2C总线接口芯片,但是地址可选范围小,性能指标固定,功能单一,而且使用不方便。针对I2C总线的电气特性及其通信协
[半导体设计/制造]
模拟I2C总线多主通信研究与软件设计
摘要:介绍模拟I2C总线的多主节点通信原理,并提出一种新的实现方法。这种采用延时接收比较来实现仲裁的方法,可使不具有I2C接口的普通微控制器(MCU)能够实现模拟I2C总线的多主通信,同时对I2C总线的推广起到了积极作用。 关键词:模拟I2C总线 仲裁 多主通信   I2C总线(Inter IC BUS)是Philips公司推出的双向两线串行通信标准。由于它具有接口少、通信效率高等优点,现已得到广泛的应用\ 。它除了可以进行简单的单主节点通信外,还可以应用在多主节点的通信系统中。在多主节点通信系统中,如果两个或者更多的主节点同时启动数据传输,总线具有冲突检测和仲裁功能,保证通信正常进行并防止数据破坏。现在许多微控制器(MCU)都
[网络通信]
I2C总线在单片机上的实现
随着大规模集成电路技术的发展,把CPU和一个单独工作系统所必需的ROM、RAM、I/O端口、A/D、D/A等外围电路集成在一个单片内而制成的单片机或微控制器愈来愈方便。目前,世界上许多公司生产单片机,品种很多。其中包括各种字长的CPU,各种容量的ROM、RAM以及功能各异的I/O接口电路等等,但是,单片机的品种规格仍然有限,所以只能选用某种单片机来进行扩展。扩展的方法有两种:一种是并行总线,另一种是串行总线。由于串行总线的连线少,结构简单,往往不用专门的母板和插座而直接用导线连接各个设备。因此,采用串行线可大大简化系统的硬件设计。PHILIPS公司早在十几年前就推出了 I2C串行总线,利用该总线可实现多主机系统所需的裁决和高低速设
[单片机]
<font color='red'>I2C总线</font>在单片机上的实现
I2C总线相关常见问题,这些器件可以关注下
内部集成电路总线(I2C)是一种同步串行数据通信总线,是一种极为常见的协议,用于连接微控制器及其外围设备。这种在每一个工程师的设计中几乎都可能遇到的总线技术,却总是可能因为各种不经意的问题为大家的设计带来不大不小的挑战。比如,一般器件都提供开漏输出,表示它们只能稍微下拉,这在实现双向通信的同时也意味着需要上拉才能在总线上实现高电平状态。如何确定上拉的大小?这是设计人员常常会提出的一个问题。 在网上找到许多相关资料,但是最后发现,需要满足的所有电气规格都已在如下的表中列出。在确定应用计划的数据速率运行之后,查看规格表找到所需的上升时间即可。如果不知道总线的电容,可以估测一个值,例如每个器件30微微法拉,然后据此实施调节。但是上拉
[模拟电子]
<font color='red'>I2C总线</font>相关常见问题,这些器件可以关注下
MAX517与单片机的I2C总线数据通信
摘要:介绍了I2C总线的特点及数据通信的基本协议,并以AT89C51单片机与美国MAXIM公司的8位电压输出DAC数模转换器MAX517之间的通信为例,详细介绍了通过I2C总线进行数据通信的具体硬件电路连接和其通信子程序的编程方法。 关键词:I2C总线;AT89C51;MAX517;数据通信 1 I2C总线的特点及基本通信协议 I2C总线是Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线串行数据线和串行时钟线即可使连接于总线上的器件之间实现信息传送,同时可通过对器件进行软件寻址,而不是对硬件进行片选寻址的方式来节约通信线数目,从而减少了硬件所占空间。因为总线已集成在片内,所以大大缩短了设计时间,
[工业控制]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved