DSP28335 I2C接口应用.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《DSP28335 I2C接口应用.pdf》由会员分享,可在线阅读,更多相关《DSP28335 I2C接口应用.pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、DSPI2C应用说明1.1.示例程序中几种状态示例程序中几种状态第一次看 i2c_eeprom 示例程序,对程序中的 MsgStatus 信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。先把程序中的头文件涉及的 7 种状态分析一下。/I2CMessage Commands for I2CMSG struct#define I2C_MSGSTAT_INACTIVE0 x0000/未激活状态:一般成功发送数据或者/接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。#define I2C_MSGSTAT_SEND_WITHS
2、TOP0 x0010/发送带停止位数据:这是为写数据而设/的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。#define I2C_MSGSTAT_WRITE_BUSY0 x0011/写数据忙状态:在将待写的数据放入/缓存后,就可以使能 IIC 传输数据了,然后把信息状态设为该状态,意在告诉用户:数据/已经在传送过程中。当然是否传送完毕,还需要通过查询SCD 位来判断。#define I2C_MSGSTAT_SEND_NOSTOP0 x0020/发送无停止位数据:这个状态是为了读/取数据而设的,有查阅过 AT24C1024EEPROM 存储器使用手册的读者知道,在读数据之前/要发送数
3、据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。设为这个状/态意在告诉读者,可以发送要读取的数据的地址了。#define I2C_MSGSTAT_SEND_NOSTOP_BUSY 0 x0021/发送无停止位数据忙状态:这个状态是/为了读取数据而设的,似于 I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。/传送是否成功,还要看ARDY 的状态。#define I2C_MSGSTAT_RESTART0 x0022/重发开始位状态:这个状态也是为读取/数据而设。我们知道,读取存储器数据主要分两个步骤:第一,发送 START位+设备地址/+数据地址+无停止位。
4、第二,再发START位+设备地址,紧接着存储器发送数据到IIC 接收/缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT 值)时输出停止位 STOP./值得注意的是:理论上写完数据就能马上读取 数据,但事实上 EEPROM 存储器仍需要一/定延时来存储数据,约有2ms 左右。通过示波器可以观察到,写完数据后,并不能马上/成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K 时,大约要重复/8 次)才能成功。#define I2C_MSGSTAT_READ_BUSY0 x0023/读取数据忙状态:这个状态是为读取数/据而设。在读数据的第二步骤中,发完 START 位+设备地
5、址后,就设为这一状态。意在说/明 IIC 开始等待接收固定数量(I2CCNT 值)的数据。可以通过查询ARDY 位判断。/头文件中的其他定义应该没什么大问题了!2.AT24C1024 EEPROM2.AT24C1024 EEPROM读写数据格式读写数据格式(1)AT24C1024 设备地址:10100A1P0R/W(2)单字节写入:START-发送从设备地址(写控制码 R/W=0)-处理 Ack-发送字节地址-处理 Ack-发送 1 字节数据-处理 Ack-STOP。如下图:(3)按页写入:START-发送从设备地址(写控制码 R/W=0)-处理 Ack-发送字节地址-处理 Ack-发送 1
6、字节数据-处理 Ack-发送第 2 字节数据-处理Ack-发送第3字节数据-处理Ack直到发完X字节-STOP。如下图。注意,连续写入的数据字节数不能超过每页所能容下的总量。如果写入的数据超过一页的长度,将发生回卷,即从 EEPROM 的 0 地址处进行数据覆盖。比如,AT24C1024 有 512 页,每页最大容纳 256 字节。超过这个长度,地址指针将从每页首地址重新开始。(4)随机单字节读取:第一步:发START-发送从设备地址(写控制码 R/W=0)-处理 Ack-发送字节地址高位-处理 Ack-发送字节地址低位-处理Ack-第二步:发 START-发送器件地址(读控制码 R/W=1)
7、-处理 Ack-接收 1 字节数据-STOP。(5)随机连续读取:在随机单字节读取操作的 STOP 信号发送之前,加入若干个-发送 Ack-接收 1 字节数据 即可实现。(6)当前位置单字节读取:START-发送从设备地址(读控制码)-处理 Ack-发送字节地址-处理 Ack-接收 1 字节数据-STOP。当前指的是之前进行过读取操作但是没有发送 STOP 信号,EEPROM 芯片内部指针所在的位置即为当前位置。(7)当前位置连续读取:在当前位置单节读取操作的 STOP 信号发送之前,加入若干个-发送 Ack-接收 1 字节数据 即可实现。备注:部分内容引用百度文库中的I2C 读写流程文档3.
8、3.主程序说明及流程图主程序说明及流程图详细的注释可以参见程序附录,这里主要解释一下设备地址取0 x50的缘由。从AT24C1024的数据手册可知,设备地址为。而在程序中设置的地址是0 x50,即0B0101 0000。看似不妥,其实,这个例子中设备地址采用 7位地址模式,这样只取0 x50的低7位作为设备地址的高七位,设备地址的最低位R/W则由寄存器I2CMDR中的TRX位决定。这样读数据时设备地址为0B1010 0001,写数据时设备地址改为0B1010 0000。通过示波器可以验证这些数据。问题1:每次检测到SCD中断时,也就是顺利发完指定数量的数据或者接收指定数量的数据了,理论上I2c
9、aRegs.I2CCNT=0,但是本人设了几个中断点去观察该寄存器的值,发现总是不为零。通过观察I2caRegs.I2CFFTX.bit.TXFFST和I2caRegs.I2CFFRX.bit.RXFFST,可以发现这两个寄存器为零时,I2caRegs.I2CCNT也不为零。由此可知,I2CCNT不能实时反映发送/接收存储器中数据的数量,不过可以用TXFFST/RXFFST来代替。图 1 主程序流程图,图 2 为写数据程序流程图,图3 为读数据程序流程图,图4 为中断函数流程图。图 1 主程序流程图图 2 写数据程序流程图图 3 读数据程序流程图图 4 中断函数流程图4.程序附录/可以用以下代
10、码替换示例程序Example_280 xI2c_eeprom.c中的代码,再进行调试。/该程序跟原始程序没多大区别,主要改变为:引入几个统计变量,改变发送数据长度为 2 字节/TI File$Revision:/main/5$/Checkin$Date:April 4,200717:18:36$/#/FILE:Example_280 xI2c_eeprom.c/TITLE:DSP280 x I2C EEPROM Example/ASSUMPTIONS:/This program requires the DSP280 x header files./This program requires
11、an external I2C EEPROM connected to/the I2C bus at address 0 x50./As supplied,this project is configured for boot to SARAM/operation.The 280 x Boot Mode table is shown below./For information on configuring the boot mode of an eZdsp,/please refer to the documentation included with the eZdsp,/BootGPIO
12、18GPIO29GPIO34/ModeSPICLKASCITXDA/SCITXB/-/Flash111/SCI-A110/SPI-A101/I2C-A100/ECAN-A011/SARAM010-boot to SARAM/OTP001/I/0000/DESCRIPTION:/This program will write 1-14 words to EEPROM and read them back./The data written and the EEPROM address written to are contained/in the message structure,I2cMsg
13、Out1.The data read back will be/contained in the message structure I2cMsgIn1./-/CODE MODIFICATIONS ARE REQUIRED FOR 60 MHZ DEVICES(In/DSP280 x_Examples.h in the common/include/directory,set/#define CPU_FRQ_60MHZ to 1,and#define CPU_FRQ_100MHZ to 0)./-/This program will work with the on-board I2C EEP
14、ROM supplied on/the F280 x eZdsp./#/Original Author:D.F./$TI Release:DSP280 x Header Files V1.60$/$Release Date:December 3,2007$/#include DSP280 x_Device.h/DSP280 x Headerfile Include File#include DSP280 x_Examples.h/DSP280 x Examples Include File/Note:I2C Macros used in this example can be found in
15、 the/DSP280 x_I2C_defines.h file/Prototype statements for functions found within this file.voidI2CA_Init(void);Uint16 I2CA_WriteData(struct I2CMSG*msg);Uint16 I2CA_ReadData(struct I2CMSG*msg);interrupt void i2c_int1a_isr(void);void pass(void);void fail(void);#define I2C_SLAVE_ADDR0 x50/EEPROM 地址#def
16、ine I2C_NUMBYTES2/为方便示波器观察,设置发送 2 字节的数据#define I2C_EEPROM_HIGH_ADDR0 x11/数据的写入地址高位#define I2C_EEPROM_LOW_ADDR0 x0F/数据的写入地址低位/Global variables/全局变量/Two bytes will be used for the outgoing address,/有 2 个字节是地址/thus only setup 14 bytes maximum/最多只能设置 14 字节数据struct I2CMSG I2cMsgOut1=I2C_MSGSTAT_SEND_WITH
17、STOP,/初始状态为:发送带停止位数据I2C_SLAVE_ADDR,I2C_NUMBYTES,I2C_EEPROM_HIGH_ADDR,I2C_EEPROM_LOW_ADDR,0 xff,/Msg Byte 010 x3F,/Msg Byte 020 x56,/Msg Byte 030 x78,/Msg Byte 040 x9A,/Msg Byte 050 xBC,/Msg Byte 060 xDE,/Msg Byte 070 xF0,/Msg Byte 080 x11,/Msg Byte 090 x10,/Msg Byte 100 x11,/Msg Byte 110 x12,/Msg By
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DSP28335 I2C接口应用 I2C 接口 应用
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内