DSP中i2c存储eeprom实例分析

上传人:公**** 文档编号:504864408 上传时间:2023-05-12 格式:DOCX 页数:17 大小:224.87KB
返回 下载 相关 举报
DSP中i2c存储eeprom实例分析_第1页
第1页 / 共17页
DSP中i2c存储eeprom实例分析_第2页
第2页 / 共17页
DSP中i2c存储eeprom实例分析_第3页
第3页 / 共17页
DSP中i2c存储eeprom实例分析_第4页
第4页 / 共17页
DSP中i2c存储eeprom实例分析_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《DSP中i2c存储eeprom实例分析》由会员分享,可在线阅读,更多相关《DSP中i2c存储eeprom实例分析(17页珍藏版)》请在金锄头文库上搜索。

1、1示例程序中几种状态说明第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什 么要有这几个状态?状态切换顺序如何安排? 一大堆的状态,让人有些摸不着头脑。先把程 序中的头文件-涉及的7种状态分析一下。/ I2C Message Commands for I2CMSG struct#define I2C_MSGSTAT_INACTIVE0x0000未激活状态:一般成功发送数据或者/接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。#define I2C_MSGSTAT_SEND_WITHSTOP0x0010 /发送带停止位数据:这是

2、为写数据而设/的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。#define I2C_MSGSTAT_WRITE_BUSY0x0011 写数据忙状态:在将待写的数据放入/缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据 /已经在传送过程中。当然是否传送完毕,还需要通过查询SCD位来判断。#define I2C_MSGSTAT_SEND_NOSTOP0x0020/发送无停止位数据:这个状态是为了读/取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前 /要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决

3、定的。设为这个状 /态意在告诉读者,可以发送要读取的数据的地址了。#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0x0021/发送无停止位数据忙状态:这个状态是 /为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。 传送是否成功,还要看ARDY的状态。#define I2C_MSGSTAT_RESTART0x0022/重发开始位状态:这个状态也是为读取/数据而设。我们知道,读取存储器数据主要分两个步骤:第一,发送START位+设备地址 /+数据地址+无停止位。第二,再发START位+设备地址,紧接着存储器发送数据到I

4、IC接收 缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT值)时输出停止位STOP./值得注意的是:理论上写完数据就能马上读取数据,但事实上EEPROM存储器仍需要一 /定延时来存储数据,约有2ms左右。通过示波器可以观察到,写完数据后,并不能马上 /成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K时,大约要重复 /8次)才能成功。#define I2C_MSGSTAT_READ_BUSY0x00237读取数据忙状态:这个状态是为读取数据而设。在读数据的第二步骤中,发完START位+设备地址后,就设为这一状态。意在说 /明IIC开始等待接收固定数量(I2CCNT值)

5、的数据。可以通过查询ARDY位判断。/头文件中的其他定义应该没什么大问题了!2. AT24C1024 EEPROM读写数据格式(1)AT24C1024 设备地址:10100A1P0R/W(2)单字节写入:START -发送从设备地址(写控制码R/W=0)-处理Ack - 发送字节地址- 处理Ack -发送1字节数据- 处理Ack - STOP。如下 图:_ _STOPSDA LINEVJHIDEVICE TADDRESS FMOST SIGNIFICANT WORD ADDRESSLEASTSIGNIFICANT WORD ADDRESSMSBACKR/_wRoACKLSBACKLBACK(3

6、)按页写入:START-发送从设备地址(写控制码R/W=0)-处理Ack -发 送字节地址- 处理Ack -发送1字节数据- 处理Ack-发送第2字节数 据- 处理Ack-发送第3字节数据- 处理Ack直到发完X字节- STOPo 如下图。注意,连续写入的数据字节数不能超过每页所能容下的总量。如果写入 的数据超过一页的长度,将发生回卷,即从EEPR0M的0地址处进行数据覆盖。 比如,AT24C1024有512页,每页最大容纳256字节。超过这个长度,地址指针 将从每页首地址重新开始。STARTDEVICEADDRESSTEWORD ADDRESS.WOHO ADDRESS (n)1 1 1 1

7、 1 1 1 1 1 1 1 1111 IlliMOSTLEAST罰 GN IFICANTSliMPCANTDATA (n)STOP -MSBACKR/_w cPACKLSBACKL s BACKACK(4)随机单字节读取:第一步:发START -发送从设备地址(写控制码R/W=0) -处理Ack -发送字节地址高位- 处理Ack -发送字节地址低位- 处理 Ack-第二步:发START -发送器件地址(读控制码R/W=1)-处理Ack -接 收1字节数据- STOP。SDA L NEA MSBDEVICEADOAESSwriteHtgh ByteL咖ADDRESSAQDFtESSfl,STA

8、RTEVIGEADDHESSREADSTOPACKR/w- QPAck.LSBDATA n N口WHITE(5)随机连续读取:在随机单字节读取操作的STOP信号发送之前,加入若干个 -发送Ack -接收1字节数据即可实现。$0* LlKtRQEUICETT ADDFB9ELow 日ADDRESS:DEVICE R ADDRESShead)1PJWY WRITEackACKN-c ACK(6)当前位置单字节读取:START -发送从设备地址(读控制码)- 处理Ack -发送字节地址- 处理Ack -接收1字节数据- STOP。当前指的是之前 进行过读取操作但是没有发送STOP信号,EEPROM芯

9、片内部指针所在的位置即为 当前位置。READ3口LINEDATA(7)当前位置连续读取:在当前位置单节读取操作的STOP信号发送之前,加入 若干个- 发送Ack -接收1字节数据即可实现。STARTREAD|q11 V r J 厂 1111|1IJJ|jdJ11li11111J1) J|I1JLl11cDATA nAC备注:部分内容引用百度文库中的I2C读写流程文档3.主程序说明及流程图详细的注释可以参见程序附录,这里主要解释一下设备地址取0x50的缘由。从AT24C1024的数据手册可知,设备地址为10100州Pa。而在程序中设置的地址是0x50,即0B0101 0000。看似不妥,其实,这

10、个例子中设备地址采用7位地址 模式,这样只取0x5 0的低7位作为设备地址的高七位,设备地址的最低位R/W则由寄存器 I2CMDR中的TRX位决定。这样读数据时设备地址为0B1010 0001,写数据时设备地址改为 0B1010 0000。通过示波器可以验证这些数据。问题1:每次检测到SCD中断时,也就是顺利发完指定数量的数据或者接收指定数量的数据了, 理论上l2caRegs.l2CCNT=0,但是本人设了几个中断点去观察该寄存器的值,发现总是不为 零。通过观察 l2caRegs . I2CFFTX .bit. TXFFST 和 l2caRegs . l2CFFRX.bit .RXFFST,

11、可 以发现这两个寄存器为零时,l2caRegs . I2CCNT也不为零。由此可知,I2CCNT不能实时反映 发送/接收存储器中数据的数量,不过可以用TXFFST/RXFFST来代替。图1主程序流程图,图2为写数据程序流程图,图3为读数据程序流程图,图4为中断 函数流程图。a.更改当前指针为:I2cMsgInlb.令I2cMsgInl 状态=I2C MSGSTAT READ BUSYI2CA WriteData 函数返回:I2C STP NOT READY ERROR配置从设备地址返回 I2C BUS BUSY ERROR配置 I2CCNT;地址数据放入缓存;信息数据放入缓存:配置I2CMDR

12、返回I2CSUCCESS图 1 主程序流程图图 2 写数据程序流程图图3 读数据程序流程图中断i2c_in/1a_isr获取中断源:IntS-Y令I2cMsgOu tl当前状态 =I2C MSGSTAT INACTIVE当前状态MSGSTAT WRITE中断源C SCDI2cMsgIn1当前状态MSGSTAT SEND NOSTOPNY令I2cMsgIn 1当前状态 =I2C MSGSTAT SEND NOSTOPI2cMsgIn1当前状态=I2C MSGSTAT READ BU令I2cMsgIn 1当前状态=i2c msgStat inactive从接收缓存器I2CDRR读取数据N -r彳进

13、入fail死循环彳进入 Pass 死循环数据处理:计正确次数和错误次数中断返冋中断源停止仿真CK=1?设置IIC产生STOP位;清除NACK;N当前状态MSGSTAT SEND NOSTOP令当前状态-I2C MISGSTAT RE START图 4 中断函数流程图4.程序附录可以用以下代码替换示例程序Example_280xl2c_eeprom.c中的代码,再进行调试。/该程序跟原始程序没多大区别,主要改变为:引入几个统计变量,改变发送数据长度为2字节/ TI File $Revision: /main/5 $/ Checkin $Date: April 4, 2007 17:18:36 $/#/ FILE: Example_280xI2c_eeprom.c/ TITLE: DSP280x I2C EEPROM Example/ ASSUMPTIONS:/ This program requires the DSP280x header files./ This program requires an external I2C EEPROM connected to/ the I2C bus at address 0x50.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号