您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > C2000的I2C模块使用
C2000的I2C模块使用Email:fannian@whu.edu.cnQQ:3457561982012-5-5I2C模块作为TI公司在C2000系列中新加入的外设控制模块,在实际控制使用中得到了广泛的运用。特别是作为EEPROM的读写操作时,有占用系统资源少,使用方便等各种优点,但是国内相关资料甚少,甚至连实际使用的参考例程也难以找到,给学习和使用带来了极大地困惑,特结合自身学习和实际工程应用为大家分析I2C模块的使用方式,在实际使用中已利用I2C模块最为广泛的EEPROM为例编写相关程序。以前大家在没有I2C模块的处理其中使用I2C通讯协议多使用GPIO口模拟协议时序,这种方式也是使用较多的一种方式,虽然I2C协议内容简单,但模拟协议总归没有实际的硬件模块做的精准,尤其在频率控制上。为将C2000的I2C模块在EEPROM上的应用进行编程进行说明,特从EEPROM操作说起,再结合C2000的I2C模块的相关配置进行分析。因为C2000的I2C模块采用硬件实现I2C协议,因此对于I2C协议的“开始、应答、结束”以及读写相关时序不做说明,若想了解具体的I2C协议实现过程参阅相关文档。24C01/02/04/08/16/32/64/128/256的使用器件地址:在对EEPROM进行操作之前必须识别该器件的地址,在I2C协议中,器件地址首先发送,器件地址由8位组成,地址信息为:1010(A2)(A1)(A0)(R/W)。其中高四位1010为24x系列固定地址,A[2:0]为同一I2C总线上的EEPROM芯片片选信号,该三位由硬件电路决定(器件的1、2、3管脚电路连接决定),R(1)/W(0)位控制对芯片进行读写的选择内存地址:要读写的地址由主机发送,紧跟器件地址。在对内存地址进行分析时先解释EEPROM型号问题。以24C01为例,该芯片存储空间为1Kbit(不是1KByte)。其分布为128*8bit0KByte0bit7bit6bit5bit4bit3bit2bit1bit0Byte1bit7bit6bit5bit4bit3bit2bit1bit0Byte2bit7bit6bit5bit4bit3bit2bit1bit01KbitByte127(27)bit7bit6bit5bit4bit3bit2bit1bit02KbitByte255(28)bit7bit6bit5bit4bit3bit2bit1bit04KbitByte511(29)bit7bit6bit5bit4bit3bit2bit1bit08KbitByte1023(210)bit7bit6bit5bit4bit3bit2bit1bit016KbitByte2047bit7bit6bit5bit4bit3bit2bit1bit032KbitByte4095bit7bit6bit5bit4bit3bit2bit1bit064KbitByte8191bit7bit6bit5bit4bit3bit2bit1bit0128KbitByte16384bit7bit6bit5bit4bit3bit2bit1bit0256KbitByte32768bit7bit6bit5bit4bit3bit2bit1bit0我利用下表对内存地址进行表示,先说明16K以内的。16K以上需要两字节表示内存地址信息。1K的EEPROM需要8位内存地址的低7位寻址全部的127字节,2K需要8位内存地址的全部8位寻址全部的256字节,4K-16K需要依次使用期间地址的1、2、3位表示页地址,即4K的EEPROM内存空间分为2页、8K的EEPROM内存空间分为4页,16K的EEPROM内存空间分为8页,每一页使用内存地址的全部8位寻址该页的256字节。32K及以上EEPROM稍后奉上。型号开始器件地址响应内存地址(for1-256K)响应内存地址(onlyfor32-256K)数据(for1-16K)响应MSBLSBMSBLSBMSBLSB1KS1010A2A1A0R/WAxA[6:0]AA2KS1010A2A1A0R/WAA[7:0]AA4KS1010A2A1P0R/WAA[7:0]AA8KS1010A2P[1:0]R/WAA[7:0]AA16KS1010P[2:0]R/WAA[7:0]AA32KS1010R/WAAA64KS1010R/WAAA128KS1010R/WAAA256KS1010R/WAAA写字节操作不用麻烦的文字描述了,使用下图的操作流程图单字节写多字节写1.主机发送开始信号2.器件地址(写命令R/W=0)3.接受从机(EEPROM)响应4.内存地址5.接受从机(EEPROM)响应6.待写数据,可以连续写至多16个字节7.主机发送停止命令读字节操作当前地址读操作EEPROM内部有一个内存地址指针,在对EEPROM进行任何读写操作后该地址信息就会保存,进行写操作时若不指定内存地址信息则默认对该地址空间操作。操作顺序为:1.主机发开始命令2.器件地址(读命令R/W=1)、3.从机(EEPROM)响应4.从机范围当前地址包含的数据(高位在前)5.主机不响应6.主机发停止命令随机读操作随机读即指定要读的地址空间,在随机的地址进行读。与当前地址读唯一的区别就是需要指定地址,而能改变EEPROM内存地址的是写操作,为此虚拟一个写操作对内存指针指向的地址进行定位。操作顺序为:1.主机发送开始命令2.器件地址(写命令R/W=0)3.从机响应4.待写内存地址5.从机响应6.主机再次发送开始命令7.器件地址(读命令R/W=1)8.从机响应9.从机返回指定内存地址空间数据10.主机响应代表从机需要继续返回数据,不响应代表停止返回11.连续返回至多16个字节直到主机直到主机不响应12.主机发送停止命令连续读操作连续读和前面的当前地址读操作是一样的,仅仅是返回的的数据多些而已。熟悉上面的EEPROM操作流程后对C2000的I2C模块按照上述流程进行配置即可完成相应的读写操作。根据EEPROM常见的操作过程,选取多字节写(当仅写一个字节时可变为单字节写)和随机读操(仅读一个字节时为单字节读)作进行编程。上述两种方式有很强的通用性。C2000模块的相关配置根据上述的操作过程,我们可以总结出C2000的I2C模块在配置时应该实现的功能有:1.配置I2C模块为主机模式以控制通信总线2.发送开始信号,启动I2C数据总线;3.发送从机地址对从机进行配对,并告诉从机应该读还是写;4.进行写操作时,发送数据地址信息5.主机能检测从机是否发送应答信号6.确定读写数据的个数7.在读操作时,当C2000的I2C模块接收到数据后返回应答信号告诉EERPOM已经正确接收数据。若接收数据已经完成则在最后一个数据接收完成后不发送应答信号8.读、写操作操作结束后发送停止命令使总线空闲9.配置I2C运行时钟完成上述配置后I2C模块即可按照响应的命令进行数据的发送接接收I2C模式寄存器(I2CModeRegisterI2CMDR)NACKMOD:仅仅在I2C模块作为接收机时才使用,发送机时状态忽略(我们这里忽略C2000作为从机的情况)0:I2C模块在主机-接收器模式下I2C模块在每个响应时钟周期发送响应信号,直到内部数据计数器递减到0。当内部数据计数器值减到0时不发送应答信息。1:在应答时钟周期不发送应答信号,当不应答信号发送后,该位自动清零。注:如果要发送不应答信号,必须在发送最后一个数据信息的上升沿之前对该位置1。FREE:仿真器模式配置STT:开始位(仅在主机模式下有效)0:在主机模式下,该位在发送完开始信号后自动清零1:在主机模式下,将该位置1就可以在数据总线上产生一个开始信号。开始信号产生过后即清零该位。STP:停止位(仅在主机模式下有效)0:主机模式下,该位在停止信号产生后自动清零1:主机模式下,当数据计数器减到0时,I2C模块自动产生停止信号。MST:主机模式位,决定C2000的I2C模块是工作在主机还是从机状态0:从机模式1:主机模式TRX:发送/接收模式选择0:接收模式,I2C模块作为接收机,接收数据总线上的数据1:发送模式,I2C模块作为发送机,向数据总线发送数据XA:扩展地址使能位0:7-bit从机地址1:10-bit从机地址RM:重复模式(仅在主机模式下有效)0:不重复1:重复DLB:自发自收模式0:取消自发自收模式1:自发自收模式,数据从发送移位寄存器按照I2C协议直接发送到接收移位寄存器IRS:I2C模块复位位0:I2C模块复位(不工作),当复位时,I2CSTR寄存器的所有位恢复到初始状态1:I2C模块使能STB:起始位模式0:I2C模块不在起始位模式1:I2C模块在起始位模式,在起始位置模式下时,I2C模块除了产生起始信号,还会产生其它信号(1)起始信号(2)起始字节00000001b(3)dummyacknowledgeclockpulse(4)重复起始信号注:在起始信号之后I2C模块发送I2CSAR中的从机地址信息,这个信号时自动发送的,不需要写入发送寄存器。FDF:自由数据格式模式,这个模式我们现在暂不考虑。BC:发送/接收数据位数定义0008bit0011bit0102bit0113bit1004bit1015bit1106bit1117bitI2C模块时钟I2C模块的时钟框图时钟是每个模块工作的必要前提,图中SYSCLCOUT为系统时钟,有系统相关寄存器配置。该时钟送入I2C模块进过IPSC分频为I2C模块提供时钟Moduleclockfrequency=SYSCLCOUT/(IPSC+1)为了适应I2C协议的时序要求,I2C模块的时钟应该配置在7-12MHz之间,一边我选择10MHz。并且在对时钟进行操作前必须在复位状态下(IRS=0inI2CMDR),在IRS=1时进行的修改被忽略。同时在通信线上的时钟频率也是可编程的,由ICCL和ICCH控制。ICCL控制总线时钟低电平的时间,ICCH控制总线时钟高电平的时间,其计算式如下:Thigh=Tmod*(ICCH+d)Tlow=Tmod*(ICCL+d)由此可以计算I2C总线时钟为:Tmst=Tmod*[(ICCL+d)+(ICCH+d)]Tmst=(IPSC+1)[(ICCL+d)+(ICCH+d)]/SYSCLCOUTTmod为I2C模块的工作时钟。ICCH和ICCL自己配置,而d的取值参见下表:其他模块至于其他模块因为其功能与C2000现有外设模块类似,我就不多说,具体编程使用的会简单提及,详细了解相关功能还需要自己多多研读手册。程序分析1:Uint16u24X_WriteByte(Uint16DestAddr,Uint16DataValue)2:{3://SlaveaddressinfogetspassedwithStartCondition4:if(I2caRegs.I2CMDR.bit.STP==1)5:{6:return(I2C_STP_NOT_READY_ERROR);7:}8:if(I2caRegs.I2CSTR.bit.BB==1)9:{10:return(I2C_BUS_BUSY_ERROR);11:}12:I2caRegs.I2CCNT=2;//2additionalbytesbeingtransferred13://28035has4-levelFIFO,sowecanprocessupto4dataonetime.14:I2caRegs.I2CDXR=DestAddr&0xff;//Addressshouldbe8bit15:I2caRegs.I2CDXR=DataValue&0xff;//8bitdatavalue16:17:I2caRegs.I2CMDR.all=0x6E20;//bit14FREE=118://bit13STT=1(Startcondition)19://bit11STP=1(Stopconditionaftertransferofbytes.)20://bit10MST=1Master2
本文标题:C2000的I2C模块使用
链接地址:https://www.777doc.com/doc-5824026 .html