您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > DSP28335-I2C接口应用
DSPI2C应用说明1.示例程序中几种状态第一次看i2c_eeprom示例程序,对程序中的MsgStatus信息状态切换非常懵懂,为什么要有这几个状态?状态切换顺序如何安排?一大堆的状态,让人有些摸不着头脑。先把程序中的头文件涉及的7种状态分析一下。//I2CMessageCommandsforI2CMSGstruct#defineI2C_MSGSTAT_INACTIVE0x0000//未激活状态:一般成功发送数据或者//接受数据后可以设置信息状态为此状态,告诉用户可进行下一次的写数据或读数据。#defineI2C_MSGSTAT_SEND_WITHSTOP0x0010//发送带停止位数据:这是为写数据而设///的状态,写入地址和数据之后发个停止位告诉存储器数据写入完毕。#defineI2C_MSGSTAT_WRITE_BUSY0x0011//写数据忙状态:在将待写的数据放入//缓存后,就可以使能IIC传输数据了,然后把信息状态设为该状态,意在告诉用户:数据//已经在传送过程中。当然是否传送完毕,还需要通过查询SCD位来判断。#defineI2C_MSGSTAT_SEND_NOSTOP0x0020//发送无停止位数据:这个状态是为了读//取数据而设的,有查阅过AT24C1024EEPROM存储器使用手册的读者知道,在读数据之前//要发送数据的地址,发完地址不能产生停止位,这是存储器硬件设计决定的。设为这个状//态意在告诉读者,可以发送要读取的数据的地址了。#defineI2C_MSGSTAT_SEND_NOSTOP_BUSY0x0021//发送无停止位数据忙状态:这个状态是//为了读取数据而设的,似于I2C_MSGSTAT_WRITE_BUSY,说明地址数据已经在传送过程中。//传送是否成功,还要看ARDY的状态。#defineI2C_MSGSTAT_RESTART0x0022//重发开始位状态:这个状态也是为读取////数据而设。我们知道,读取存储器数据主要分两个步骤:第一,发送START位+设备地址//+数据地址+无停止位。第二,再发START位+设备地址,紧接着存储器发送数据到IIC接收//缓存器(I2CDRR),接收到设定好的数据数量(I2CCNT值)时输出停止位STOP.//值得注意的是:理论上写完数据就能马上读取数据,但事实上EEPROM存储器仍需要一////定延时来存储数据,约有2ms左右。通过示波器可以观察到,写完数据后,并不能马上//成功读取数据,也就是说读数据的第一步骤要重复好几次(总线为50K时,大约要重复//8次)才能成功。#defineI2C_MSGSTAT_READ_BUSY0x0023//读取数据忙状态:这个状态是为读取数//据而设。在读数据的第二步骤中,发完START位+设备地址后,就设为这一状态。意在说//明IIC开始等待接收固定数量(I2CCNT值)的数据。可以通过查询ARDY位判断。//头文件中的其他定义应该没什么大问题了!2.AT24C1024EEPROM读写数据格式(1)AT24C1024设备地址:10100A1P0R/W(2)单字节写入:START-发送从设备地址(写控制码R/W=0)-处理Ack-发送字节地址-处理Ack[-发送1字节数据-处理Ack]-STOP。如下图:(3)按页写入:START-发送从设备地址(写控制码R/W=0)-处理Ack-发送字节地址-处理Ack[-发送1字节数据-处理Ack-发送第2字节数据-处理Ack-发送第3字节数据-处理Ack……直到发完X字节]-STOP。如下图。注意,连续写入的数据字节数不能超过每页所能容下的总量。如果写入的数据超过一页的长度,将发生回卷,即从EEPROM的0地址处进行数据覆盖。比如,AT24C1024有512页,每页最大容纳256字节。超过这个长度,地址指针将从每页首地址重新开始。(4)随机单字节读取:第一步:发START-发送从设备地址(写控制码R/W=0)-处理Ack-发送字节地址高位-处理Ack-发送字节地址低位-处理Ack-第二步:发START-发送器件地址(读控制码R/W=1)-处理Ack-接收1字节数据-STOP。(5)随机连续读取:在随机单字节读取操作的STOP信号发送之前,加入若干个[-发送Ack-接收1字节数据]即可实现。(6)当前位置单字节读取:START-发送从设备地址(读控制码)-处理Ack-发送字节地址-处理Ack-接收1字节数据-STOP。当前指的是之前进行过读取操作但是没有发送STOP信号,EEPROM芯片内部指针所在的位置即为当前位置。(7)当前位置连续读取:在当前位置单节读取操作的STOP信号发送之前,加入若干个[-发送Ack-接收1字节数据]即可实现。备注:部分内容引用百度文库中的《I2C读写流程》文档3.主程序说明及流程图详细的注释可以参见程序附录,,这里主要解释一下设备地址取0x50的缘由。从AT24C1024的数据手册可知,设备地址为。而在程序中设置的地址是0x50,即0B01010000。看似不妥,其实,这个例子中设备地址采用7位地址模式,这样只取0x50的低7位作为设备地址的高七位,设备地址的最低位R/W则由寄存器I2CMDR中的TRX位决定。这样读数据时设备地址为0B10100001,写数据时设备地址改为0B10100000。通过示波器可以验证这些数据。问题1:每次检测到SCD中断时,也就是顺利发完指定数量的数据或者接收指定数量的数据了,理论上I2caRegs.I2CCNT==0,但是本人设了几个中断点去观察该寄存器的值,发现总是不为零。通过观察I2caRegs.I2CFFTX.bit.TXFFST和I2caRegs.I2CFFRX.bit.RXFFST,可以发现这两个寄存器为零时,I2caRegs.I2CCNT也不为零。由此可知,I2CCNT不能实时反映发送/接收存储器中数据的数量,不过可以用TXFFST/RXFFST来代替。图1主程序流程图,图2为写数据程序流程图,图3为读数据程序流程图,图4为中断函数流程图。FOR循环I2cMsgOut1状态==I2C_MSGSTAT_SEND_WITHSTOP?调用I2CA_ReadData函数;a.更改当前指针为:I2cMsgOut1b.令I2cMsgOut1状态=I2C_MSGSTAT_WRITE_BUSY调用I2CA_WriteData函数;令ERR=该函数返回值I2cMsgOut1状态==I2C_MSGSTAT_INACTIVE?Y返回值==I2C_SUCCESS?ERR==I2C_SUCCESS?I2cMsgIn1状态==I2C_MSGSTAT_SEND_NOSTOP?I2cMsgIn1状态==I2C_MSGSTAT_RESTART?调用I2CA_ReadData函数;ERR==I2C_SUCCESS?Ya.更改当前指针为:I2cMsgIn1b.令I2cMsgOut1状态=I2C_MSGSTAT_SEND_NOSTOP_BUSYa.更改当前指针为:I2cMsgIn1b.令I2cMsgIn1状态=I2C_MSGSTAT_READ_BUSYYNYYYNNNNYNN各模块初始化main主程序图1主程序流程图STP==1?配置I2CCNT;地址数据放入缓存;信息数据放入缓存;配置I2CMDR返回I2C_BUS_BUSY_ERROR返回I2C_SUCCESS返回:I2C_STP_NOT_READY_ERROR配置从设备地址I2CA_WriteData函数总线忙否?(BB==1?)NYNYI2cMsgIn1状态==I2C_MSGSTAT_RESTART?配置I2CCNTSTP==1?配置I2CCNT;地址数据放入缓存;配置I2CMDR返回I2C_BUS_BUSY_ERROR返回:I2C_STP_NOT_READY_ERROR配置从设备地址I2CA_ReadData函数总线忙否?(BB==1?)NYNYI2cMsgIn1状态==I2C_MSGSTAT_SEND_NOSTOP?YN配置I2CMDR返回I2C_SUCCESSYN图2写数据程序流程图图3读数据程序流程图当前状态==I2C_MSGSTAT_WRITE_BUSY?数据处理:统计正确次数和错误次数停止仿真从接收缓存器I2CDRR读取数据中断源==I2C_ARDY_ISR?NACK==1?中断源==I2C_SCD_ISRC?令I2cMsgIn1当前状态=I2C_MSGSTAT_INACTIVEPassCount==I2C_NUMBYTES?I2cMsgIn1当前状态==I2C_MSGSTAT_SEND_NOSTOP_BUSY?获取中断源:IntSource令I2cMsgOut1当前状态=I2C_MSGSTAT_INACTIVE中断i2c_int1a_isrNNNYY进入fail死循环进入Pass死循环中断返回当前状态==I2C_MSGSTAT_SEND_NOSTOP_BUSY?令当前状态=I2C_MSGSTAT_RESTART设置IIC产生STOP位;清除NACK;NNYY令I2cMsgIn1当前状态=I2C_MSGSTAT_SEND_NOSTOPNYYYNI2cMsgIn1当前状态==I2C_MSGSTAT_READ_BUSY?YN图4中断函数流程图4.程序附录//可以用以下代码替换示例程序Example_280xI2c_eeprom.c中的代码,再进行调试。////该程序跟原始程序没多大区别,主要改变为:引入几个统计变量,改变发送数据长度为2字节////TIFile$Revision:/main/5$//Checkin$Date:April4,200717:18:36$//###########################################################################////FILE:Example_280xI2c_eeprom.c////TITLE:DSP280xI2CEEPROMExample////ASSUMPTIONS:////ThisprogramrequirestheDSP280xheaderfiles.////ThisprogramrequiresanexternalI2CEEPROMconnectedto//theI2Cbusataddress0x50.////Assupplied,thisprojectisconfiguredforboottoSARAM//operation.The280xBootModetableisshownbelow.//ForinformationonconfiguringthebootmodeofaneZdsp,//pleaserefertothedocumentationincludedwiththeeZdsp,////BootGPIO18GPIO29GPIO34//ModeSPICLKASCITXDA//SCITXB//-------------------------------------//Flash111//SCI-A110//SPI-A101//I2C-A100//ECAN-A011//SARAM010-boottoSARAM//OTP001//I/0000////DESCRIPTION:////Thisprogramwillwrite1-14wordstoEEPROMandreadthemback.//ThedatawrittenandtheEEPROMaddresswrittentoarecontained//inthemessagestructure,I2cMsgOut1.Thedatareadbackwillbe//containedinthemessagestructureI2cMsgIn1.//------------------------------------
本文标题:DSP28335-I2C接口应用
链接地址:https://www.777doc.com/doc-7186331 .html