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

2009-8-13 19:12 2054 6 6 分类: MCU/ 嵌入式

关键词: 单片机   I2C   串行通信

3g(f^+`&K}}44606 电子园51单片机学习网I#@S0a#o#T8ZY"@gQ

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

u@O&d/@mZ6M44606 电子园51单片机学习网#X7{Q-RC4sy7Y

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

b#RqY0P` s4c44606 电子园51单片机学习网3|1XvD7{X/TD

3  I2C总线时序模拟电子园51单片机学习网 {;M*uQ rJ
     本设计使用的EEPROM为AT24C04,它可用20060706092129272.jpg串行总线。由于89S52不直接支持20060706092130802.jpg总线,因此只能使用IO口来模拟20060706092130139.jpg的总线时序。89S52可以进行位寻址,这给时序模拟带来了方便。
A#Lzmr5}2O zM44606(1) 通信开始信号
_h~.h G44606    根据20060706092130232.jpg的规程,通信开始信号是当SCL(串行时钟信号)处于高电平时在SDA(串行数据信号)上给出一个下跳沿,且下跳沿后,SCL还要维持高电平4μs。此过程可用如下代码模拟:
.S{HB&M4460620060706092131566.jpg_SDA=1;电子园51单片机学习网,kK#r }EV)@S4CK
20060706092131601.jpg_SCL=1;电子园51单片机学习网!V0cMT'cs}8kj6pW
 _nop_();
b3WI)t Ar44606 _nop_();
5b[ J n{(r RW44606 _nop_();电子园51单片机学习网/B"V0A+@t6G1Kh4F
 _nop_();电子园51单片机学习网4i/FEiX6@h
20060706092131593.jpg_SDA=0;  // 下跳沿
"uEg[ D B44606 _nop_();
o t0n:iw:n)i"Bk)m(W44606 _nop_();电子园51单片机学习网3sw2U@(?v,@JVS
 _nop_();
S;DTpq*^^2LF44606 _nop_();  // 维持SCL为高电平4us电子园51单片机学习网(X2U$B&F1Pqcb9}&b9MH
20060706092131721.jpg_SCL=0;
XA!@ yKiw44606(2) 通信停止信号
drofL B/Z+Y*?44606通信停止信号是当SCL为高电平时在SDA上出现一个上跳沿,且SDA上跳前的低电平应维持4us以上。此过程模拟代码和开始信号类似,在此省略。
V oA FB$D2p\2LI44606(3) 字节传送完毕确认信号
W Zd9h/N#V44606该信号是在SDA为低电平时SCL上出现一个正脉冲,此过程可用如下代码模拟:电子园51单片机学习网Y@ y6~6?%\
20060706092132702.jpg_SDA=0;
[+C2D8R.{*e4Dc44606 20060706092132624.jpg_SCL=1;
^:I7]a F0K[b&A44606 _nop_();电子园51单片机学习网V'ag*Rbi
 _nop_();
#Ml9t s&dR1l44606 _nop_();电子园51单片机学习网:GOj9l%\R7}
 _nop_();
Nj!tx9fSi'U4460620060706092132817.jpg_SCL=0;
y!a}CGMa9Wir446062006070609213310.jpg_SDA=1;
2oeB;L?%tMpZ44606(4) 非确认信号
aZUSf B(y*g*_4E$d44606该信号便于控方传送停止信号,在SDA为高电平时,SCL上出现一个正脉冲,除此,模拟代码和字节传送完毕确认信号类似,不再赘述。
w6XAF0S _6B44606利用上述基本操作,并根据AT24C04的时序关系,可以写出对AT24C04进行读写的程序。由于AT24C04中的缓存是16字节,因此在读写时,均是以16字节为单位的。AT24C04总大小为512字节,其中又分了两页,在操作时还应同时指定要操作的页。电子园51单片机学习网3d/N#K/t0z WyU


b N.Y/k{ u446064  MCU方的通信
^B&u!szu8],S^44606
    进入读、写函数后,MCU都要回应PC方发来的命令,以确认准备就绪,所以在读写程序中,并不立即对EEPROM操作。数据写读的流程图如图1和图2所示。其中RSP_WRITEREADY为对写入准备好的回应,RSP_READREADY为对读出准备好的回应,RSP_READ为成功读出一段数据的回应,RSP_FIN为操作完成的回应。电子园51单片机学习网"x&f&Q"B"c?F2y*ox


20060706092133285.gif电子园51单片机学习网&? b4|&Y \p:?#\1d'm TF


图1    写入EEPROM

@/cPRQ Itj O44606

20060706092134890.gif

:D*^g"g`\H4q44606

图2    读入EPPROM电子园51单片机学习网rmk8a\D7h


K2z ~9@.b0at44606 

3zNh8Ge44606

u.| z6qI Z^446065  PC方的串行通信电子园51单片机学习网r~Q? D$F:i,d E
    PC方的串行通信使用类CSerialComm来完成。在PC上完成串行通信可用微软的MSComm通信控件,但这样就需要带上封装这个控件的库文件,否则程序不能独立运行。因此本设计采用以Win32 API写成的CSerialComm类来完成。
t[R7|xG"q;iv?44606CSerialComm类继承自CIoController,封装了和串行通信相关的功能。主要成员函数功能如下:电子园51单片机学习网6s},G Z3W?3z3z
    Open:打开指定的端口。参数指定了所要打开的端口名称,为一个字符串。这个函数打开的串口是同步的。
;o'i9G.rM"m_44606    SetState:设置串口的状态。参数是一个CSerialState类的指针。电子园51单片机学习网R8nCkGE#z
    SetTimeout:设置操作的超时时间,超过了这个时间,读写操作将返回。
#gg hW;fI~e44606    CSerialComm类只提供基本的串口操作,而且不能发送窗口消息,不便于编写Windows的基于消息的程序,因此,从CSerialComm继承一个类CI2CWriter进一步封装对串口的操作,主要成员函数功能如下:
2k+j2e#I eY/d44606InitPort:调用了CSerialComm的Open函数来打开一个串口,并保留拥有这类对象的窗口指针,以便发送消息。电子园51单片机学习网g4p#|h2},H$S
    Notify:向窗口消息,以通知当前的读写状态。
vm1TsO:f3aW44606    BeginWrite,BeginRead,BeginVerify,BeginCheckMCU:分别为开始写、读、校验和检测MCU的状态。它们将产生相应的工作线程。
|h.z$O+ub M)e-l44606OpenFile:这个函数用于打开要写入到EEPROM中的文件。参数是所要写入的文件的路径名。由于AT24C04的容量是512字节,故该函数对文件的长度作了限制。
D-y3[Z,V} |44606(1) PC方的写入线程
"e*Q S(F0R8]44606    流程见图3。在写入线程被创建后,它将向MCU发送写命令CMD_WRITE,然后等待MCU的回应RSP_WRITEREADY。成功收到该回应后,写线程将以CMD_WRITE为命令向MCU发送数据,每发送一组,写线程都会等待MCU回应RSP_WRITTEN,成功收到这个回应后,写线程继续发送后面的数据。写入完成时,写线程发送写入结束命令CMD_OVER,并等待MCU回应RSP_FIN以确认完成了写操作。成功收到此回应后,将弹出提示。

KF2t'u6_1[?T l44606

20060706092135975.gif电子园51单片机学习网u DI,cF)t X


图3    写入线程的流程图

Dv2KRB _g44606

yIA:M4^r8ns44606电子园51单片机学习网7OP"bx$}8S9{ D
    写入线程与界面线程的通信通过向界面线程发消息来实现。写入线程可发如下的消息:WM_ 20060706092135513.jpg_WRITEOVER,WM_ 20060706092135831.jpg_BLOCKFINISH,WM_ 20060706092136544.jpg_COMMFAILED。
2{&UpBe@9x+Y7f44606    WM_ 20060706092136856.jpg_WRITEOVER消息提示界面线程写入已经结束。这时界面线程启用校验和读出按钮,禁用写入按钮,向消息框里加入一条写入完成的消息。电子园51单片机学习网e&x%^A%QF(r3it
WM_ 20060706092136422.jpg_BLOCKFINISH提示界面线程一个数据块 操作已经完成,界面线程在接收到这条消息后设置进度条,以显示当前的进度。
xtU@5[+B44606WM_ 20060706092137975.jpg_COMMFAILED提示界面线程通信失败,读出按钮可用,写入不可用。电子园51单片机学习网5M,\|#^]
(2) PC方的读出线程电子园51单片机学习网.FQC,K `-WV b(bh
    流程见图4。在读出线程被创建后,它将向MCU发送写命令CMD_READ,然后等待MCU的回应RSP_READREADY。成功收到回应后,读线程将发送CMD_READ命令到MCU,并接收MCU返回的数据。成功收到数据后,读线程检查第一个字节是否为RSP_READ。若是,则保存收到数据,然后再次发出CMD_READ命令。如此反复,直到512字节(32个块)全部完成。电子园51单片机学习网eV7H"f4E S[


20060706092137612.gif

K)QxrhS8Mu G44606

图4    PC方的读出流程图电子园51单片机学习网Z R ]{9^VR)Qp(ea


F~ry Kq-c4w44606
e WWk)]44606    读出线程与界面线程的通信也是通过向界面线程发消息来实现的。读出线程可发如下的消息:WM_20060706092138386.jpg_REA DOVER,WM_I2C_BLOCKFINISH,WM_ 20060706092138606.jpg_COMMFAILED。其中后两个消息的意义和写线程所发的消息意义一样,所做的工作也是一样的。WM_ 20060706092138368.jpg_READOVER提示界面线程读出已经完成,界面线程收到这条消息后,将在读出开始时被禁用的读出按钮设为可用,清除进度条并在消息框里加入一条读出完成的消息。
8J*ZOO)}r1M44606 
&t(f,e:d)l{0D*d446066  结束语电子园51单片机学习网!Ke4A^z$ZC5|?O
    以上介绍了从PC向20060706092139719.jpg总线的EEPROM写入数据的基本方法,它既可以经扩充后自成一个系统,比如文本阅读器,也可以作为模块用在其他系统中。对于20060706092142816.jpg总线时序的模拟代码则可以当成通用程序使用。

,Y9T4ej d x\J}44606 电子园51单片机学习网N8CtKS v N

参考文献
{&E)JBQ2k'T44606[1] 李群芳. 单片微型计算机与接口技术(第2版). 北京:电子工业出版社,2005电子园51单片机学习网-l J}0^ N,S`5a+O_P
[2] Jim Beveridge. Multithreading Applications  in  Win32 Pearson Education电子园51单片机学习网 c7U KX`P6h

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条