注意:本例分析基?/p>
DSP2808
中的
i2c_eeprom
示例程序
?/p>
AT24C1024
EEPROM
存储器?/p>
当然,在?/p>
IIC
之前要了解一?/p>
IIC
工作流程,知?/p>
AT24C1024
存储芯片的使用方法?/p>
现在按以?/p>
4
部分来介绍这个示例?/p>
1.
示例程序中几种状态说?/p>
第一次看
i2c_eeprom
示例程序,对程序中的
MsgStatus
信息状态切换非常懵懂,为什
么要有这几个状态?状态切换顺序如何安排?一大堆的状态,
让人有些摸不着头脑?/p>
先把?/p>
序中的头文件
涉及?/p>
7
种状态分析一下?/p>
// I2C
Message Commands for I2CMSG struct
#define I2C_MSGSTAT_INACTIVE
0x0000
//
未激活状态:
一般成功发送数据或?/p>
//
接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据?/p>
#define I2C_MSGSTAT_SEND_WITHSTOP
0x0010
//
发送带停止位数据:
这是为写数据而设
///
的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕?/p>
#define
I2C_MSGSTAT_WRITE_BUSY
0x0011
//
写数据忙状态:在将待写的数据放?/p>
//
缓存后,就可以使?/p>
IIC
传输数据了,然后把信息状态设为该状态,意在告诉用户:数?/p>
//
已经在传送过程中。当然是否传送完毕,还需要通过查询
SCD
位来判断?/p>
#define I2C_MSGSTAT_SEND_NOSTOP
0x0020
//
发送无停止位数据:
这个状态是为了?/p>
//
取数据而设的,有查阅过
AT24C1024EEPROM
存储器使用手册的读者知道,在读数据之前
//
要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。设为这个状
//
态意在告诉读者,可以发送要读取的数据的地址了?/p>
#define I2C_MSGSTAT_SEND_NOSTOP_BUSY
0x0021
//
发送无停止位数据忙状态:
这个状态是
//
为了读取数据而设?/p>
,
似于
I2C_MSGSTAT_WRITE_BUSY
,说明地址数据已经在传送过程中?/p>
//
传送是否成功,还要?/p>
ARDY
的状态?/p>
#define I2C_MSGSTAT_RESTART
0x0022
//
重发开始位状态:这个状态也是为读取
////
数据而设?/p>
我们知道?/p>
读取存储器数据主要分两个步骤:第一?/p>
发?/p>
START
?/p>
+
设备地址
//+
数据地址
+
无停止位。第二,再发
START
?/p>
+
设备地址,紧接着存储器发送数据到
IIC
接收
//
缓存?/p>
(I2CDRR)
,接收到设定好的数据数量?/p>
I2CCNT
值)时输出停止位
STOP
.
//
值得注意的是?/p>
理论上写完数据就能马上读?/p>
数据
?/p>
但事实上
EEPROM
存储器仍需要一
////
定延时来存储数据,约?/p>
2ms
左右?/p>
通过示波器可以观察到,写完数据后,并不能马上
//
成功读取数据,也就是说读数据的第一步骤要重复好几次(总线?/p>
50K
时,大约要重?/p>
//8
次)才能成功?/p>
#define I2C_MSGSTAT_READ_BUSY
0x0023//
读取数据忙状态:
这个状态是为读取数
//
据而设。在读数据的第二步骤中,发完
START
?/p>
+
设备地址后,就设为这一状态。意在说
//
?/p>
IIC
开始等待接收固定数量(
I2CCNT
值)的数据。可以通过查询
ARDY
位判断?/p>
//
头文件中的其他定义应该没什么大问题了!
2.
AT24C1024 EEPROM
读写数据格式
?/p>
1

?/p>
AT24C1024
设备地址?/p>
1
0
1
0
0
A1
P0
R/W