I2C EEPROM接口测试
- 格式:doc
- 大小:29.00 KB
- 文档页数:1
实验三I2C总线串行E2PROM 24C02A实验一、实验目的与要求了解I2C总线读写方式;掌握I2C总线的读写操作和对24C02A进行数据读写二、实验设备STAR系列实验仪一套、PC机一台。
三、实验内容1、24C02A:(1) 24C02是I2C总线(二线串行接口)的串行EEPROM,容量4K Bit。
(2)分为字节写和页写(8字节)模式,可以单字节读取或连续读出数据。
2.实验过程(1)写满24C02A内部整个4K bit串行EEPROM,然后检验写入数据是否正确并显示结果,正确;点亮8个红色发光管(G6区),错误;熄灭8个红色发光管(2)起始写入地址为OOH,起始写入数据为OOH,之后地址与数据都以+l递增,直到写满整个EEPROM四、实验原理图五、实验步骤1、主机连线说明;;E4区;SDA —l A3区;P3.2(INTO)iE4区;SCL 一;A3区;P3.3(INTl)!G6区;JP65 一A3区;JP51 (Pl)2、运行程序;向24C02A写入数据,然后读出数据检验,检验正确,8个发光管(G6区)全亮;检验错误,8个发光管(G6医)全灭六、演示程序(完整程序见目录24C02A);l、24C02A子程序(24C02A. ASM)SDA BIT P3.2 ;数据传输口SCL BIT P3.3 ;时钟;24C02的片选地址;100HA24C02_WRITE EQU OA8H ;写指令A24C02_READ EQU OA9H ;读指令;初始化A24C02_INIT;SETB SCL ;将SCL,SDA置位,释放IIC总线SETB SDARET;写操作,分字节写和页写模式;字节写,一次写入一个字节数据,A-写入地址,B-数据Write_Byte;PUSH ACC ;A中地址压栈MOV A,#A24C02_WRITE ;写操作指令LCALL Start ;开始信号LCALL Write_8bits ;写入8位数据LCALL Acknowledge ;查询接收端应答信号POP ACC ;写入A中地址LCALL Write_8bitsLCALL AcknowledgeMOV A,B ;写入B中数据LCALL Write_8bitsLCALL AcknowledgeLCALL Stop ;结束信号LCALL AckPolling ;等待写操作完成RET;页写,一次写入8个字节数据,A中存放起始写入地址,RO中存放数据首地址Write_Page: PUSH 07HMOV R7, #8PUSH ACC ;A中地址压栈MOV A,#A24C02_WRITE ;写操作指令LCALL Start ;开始信号LCALL Write_8bits ;写入8位数据LCALL Acknowledge ;查询接收端应答倍号POP ACC ;写入A中地址LCALL Write_8bitsLCALL AcknowledgePUSH ACCWrite_Page_l: MOV A,@R0 ;缓存区数据逐一写入LCALL Write_8bitsLCALL AcknowledgeINC RODJNZ R7, Write_Page_l ;写8次LCALL Stop ;结束信号CLR ALCALL AckPolling ;等待写操作完成POP ACCPOP 07HRET;等待写操作完成AckPolling;MOV A,#A24C02_Write ;写操作指令LCALL Start ;开始信号LCALL Write_8bitsSETB SDA ;从机应答SETB SCL ;应答占用一个脉冲LCALL Delay_Time'JB SDA,AckPolling ;接收端应答标志;将SDA置低CLR SCLLCALL Stop ;停止信号RET;读操作,分为字节读和连续读取操作;字节读,一次读取一个字节,A一读取地址Read_Byte;PUSH ACC ;A中地址压栈LCALL Start ;开始信号MOV A,#A24C02_ Write ;写操作指令LCALL Write_8bitsLCALL AcknowledgePOP ACC 写入A中地址LCALL Write_8bitsLCALL Acknowledge;立即读,读取当前内部地址的数据,一个字节Read_Current;LCALL Start ;开始信号,下面读取数据MOV A,#A24C02_Read ;读操作指令LCALL Write_8bitsLCALL AcknowledgeLCALL Read_8bits 读取数据,放在A中LCALL Stop ;停止信号RET;连续读取n个教据,A-读取首地址,B一存放读取数据个数;RO-缓冲区Read_Sequence: , PUSH 07HPUSH ACCDEC BMOV R7,B ;B中存放读取数据个数LCALL Start ;开始信号MOV A,#A24C02_Write ;写操作指令LCALL Write_8bitsLCALL AcknowledgePOP ACCLCALL Write_8bitsLCALL AcknowledgeLCALL Start ;开始信号,下面读取数据MOV A,#A24C02_Read ;读操作指令LCALL Write_8bitsLCALL AcknowledgeRead_Sequence_l: LCALL Read_8bitsLCALL MasterACKMOV @R0,A ;将数据存到RO指向的RAM中INC RODJNZ R7, Read_Sequence_lLCALL Read_8bits ;最后一次读无应答MOV @R0, ALCALL Stop ;停止信号POP 07HRead_Sequence_2;RET;写入8位数据Write_8bits: PUSH 07HMOV R7, #8Write_8bits_l: RLC ACLR SCL;数据在SCL为低时SDA上的数据可以改变,此时送上欲写数据LCALL Delay_Time ;延时MOV SDA,CSETB SCLLCALL Delay_TimeDJNZ R7, Write_8bit s_lCLR SCLPOP 07HRET;读取8位数据Read_8bits: PUSH 07HMOV R7, #8Read_8bits_l: CLR SCLLCALL Delay_TimeSETB SCL ;高电平读出数据MOV C.SDARLC ADJNZ R7, Read_8bit s_lCLR SCLPOP 07HRET;开始信号Start: SETB SDA;I2C总线操作开始信号;SCL为高时,SDA由高一>低SETB SCLLCALL Delay_TimeCLR SDALCALL Delay_TimeRET;结束信号Stop:CLR SDA;I2C总线操作结束信号;SCL为高时,SDA由低一>高SETB SCLLCALL Delay_TimeSETB SDA 结束操作,将SCL、SDA置高,释放总线LCALL Delay_TimeRET;应答查询;从机应答Acknowledge:SETB SDA ;从机应答SETB SCL ;应答占用一个脉冲LCALL Delay_TimeJB SDA,$ ;接收端应答标志;将SDA置低CLR SCLRET;主机应答MasterACK: CLR SDA ;数据线SDA清O应答SETB SCL 产生一个脉冲令从机接收到应答LCALL Delay_TimeCLR SCLSETB SDA .必须置高数据RET;延时Delay_Time;RETEND;2、主程序(MAIN. ASM);写入数据,256字节串行EEPROM顺序写入OOH-OFFHA24C02_Write:MOV R7,#32 ;32次页写,每次页写写入8个字节,共256个字节MOV R3,#OOH 写入首地址MOV R2,#VERIFYDATA ;起始写入数据A24C02_Write_l:MOV RO,#buffer ;写入数据先放在buffer (30H开始的内部RAM)A24C02_Write_2: MOV @RO, 02HINC ROINC R2CJNE RO.#buffer+8,A24C02_Write_2;一页写入8个字节MOV RO,#bufferMOV A,R3LCALL Write_PageMOV A,R3ADD A,#8MOV R3,ADJNZ R7,A24C02_Write_lRET;检验数据,读出数据与写入数据一一对应相比较,检验写入是否正确MOV R7,#OFFH ;读取整个EEPROM内的数据,256个字节MOV Rl.#bufferMOV R2,#VERIFYDATA ;数据检验MOV B,#OOH ;检验EEPROM起始数据地址A24C02_Verify_l: MOV A,BLCALL Read_Byte 读取数据XCH A.RlCJNE A,#buffer+30H,$+3 ;写入片内RAM,超过30H个字节,停止写入XCH A,RlJNC A24C02_Verify_3MOV @Rl,A ;读出的数据顺序写入片内RAM,便于检查INC RlA24C02_Verify_3: CJNE A,02H, A24C02_V erify_2INC R2INC BDJNZ R7, A24C02_Verify_lCLR FO .FO为数据检验结果标志,0-正确RETA24C02_Verify_2;SETB FO 卜检验错误RET七,实验扩展及思考题实验内容;学会使用24C02A的其余指令,如字节写入、连续读取等,进一步熟悉I2C 总线操作。
I2C 总线EEPROM 测试
1 I2C 总线的工作原理及其特点
I2C 总线是一种用于IC 器件之间连接的二线制总线,最早由Philips 公
司推出。
它通过SDA(串行数据线)及SCL(串行时钟线)两根线在连到总线上
的器件之间传送信息,并根据地址识别每个器件,不管是单片机、存储器、LCD 驱动器还是键盘接口。
串行扩展总线有突出的优点,电路结构简单,程序编写方便,易于实现用户系统软硬件的模块化、标准化等。
采用I2C 总线标准的单片机或IC 器件,其内部不仅有I2C 接口电路,
而且将内部各单元电路按功能划分为若干相对独立的模块,通过软件寻址实现片选,减少了器件片选线的连接。
I2C 总线接口电路结构如图1 所示。
当某个器件向总线上发送信息时,它就是发送器(也叫主器件),而当其从总线上接收信息时,又成为接收器(也叫从器件)。
主器件用于启动总线上传送数据并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为。
i2c信号测试标准
I2C信号测试标准主要包括信号完整性和信号时序两个方面。
信号完整性测试包括SCL和SDA两个信号的测试。
在信号时序方面,需要测量的参数有tHD;STA、tSU;STO、tSU;DAT、tHD;DAT和tBUF。
在进行I2C信号测试时,需要注意以下几点:
确认测试人员静电环接触良好,避免静电对测试结果产生影响。
在测量时应检查示波器是否运行正常,确保测试设备的准确性。
检查信号连接是否正确,接地是否合理,避免因连接问题导致的测试误差。
确定待测系统SUT是否工作在预定的模式,以便根据相应的测试指标进行判断。
为保证量测的准确性,测量中请用探头直接连接测量点。
如确有必要连接探头和测量的传输线及信号接地线,其长度不能超过0.5英寸。
遵循以上标准和注意事项,可以确保I2C信号测试的准确性和可靠性。
I2C存储器实验实验目的1、了解I2C总线的工作原理2、掌握I2C总线驱动程序的设计和调试方法3、掌握I2C总线存储器的读写方法实验仪器单片机开发板、稳压电源、计算机实验原理1、 I2C总线常识I2C总线采用一个双线式漏极开路接口,可在一根总线上支持多个器件和主控器。
所连接的器件只会把总线拉至低电平,而决不会将其驱动至高电平。
总线在外部通过一个电流源或上拉电阻器连接至一个正电源电压。
当总线空闲时,两条线路均为高电平。
在标准模式中,I2C 总线上的数据传输速率高达100kbit/s,而在快速模式中则高达400kbit/s。
I2C总线上的每个器件均由一个存储于该器件中的唯一地址来识别,并可被用作一个发送器或接收器(视其功能而定)。
除了发送器和接收器之外,在执行数据传输时,还可把器件视作主控器或受控器。
主控器是负责启动总线上的数据传输并生成时钟信号以允许执行该传输的器件。
同时,任何被寻址的器件均被视作受控器。
CAT24WC01/02/04/08/16是一个1K/2K/4K/8K/16K位串行CMOS EEPROM,内部含有128/256/512/1024/2048个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗,CAT24WC01有一个8字节页写缓冲器,CAT24WC02/04/08/16有一个16字节页写缓冲器,该器件通过I2C总线接口进行操作,有一个专门的写保护功能,并且器件能与400KHzI2C 总线兼容。
引脚名称和功能如图1所示。
图1 24系例I2C存储器引脚说明通过器件地址输入端A0、A1和A2可以实现将最多8个24WC01和24WC02器件4个24WC04器件,2个24WC08器件和1个24WC16器件连接到总线上。
2、I2C总线协议(1)只有在总线空闲时才允许启动数据传送。
(2)在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变。
时钟线为高电平时,数据线的任何电平变化将被看作总线的起始或停止信号。
I2C读写EEPROM问题总结2017 年6 月3 0 日星期五目的:利用TMS320F2801芯片上外设I2C (2线串口)读写EEPROM数据(24LC128)关键点1 : 24LC时钟频率400KHZ,寄存器设置如下://Prescaler- need7-12Mhzo nm oduleclk=10; 〃NOTE:mustbe non zero=5; 〃NOTE:mustbe non zero时钟频率也可设为200KHz,三个参数分别为9、20、20(CPU时钟频率为100MHz)(未测试)关键点2 :波形分析问题:I2C模块是不是只有I2CCNT减到0才会发出停止信号I2C模块是硬件的,当检测到发送完了就会发结束自动发信号,不需要人为干预问题1:字节写操作正常,但是字节读函数出错原因:写EEPROM是在七位器件地址后添加写标志,而读EEPROM需要在七位器件地址后添加写标志。
关键点:读EEPROM数据需要发送两次命令。
第一次为写地址(此地址会被赋值给EEPROM 内的地址指针),因此需要添加写标志;第二次为读数据,将写标志改为读标志。
问题2:主机接收时,SDA数据线上有数据传输,且I2CDRR接收数据寄存器有数据更新,但寄存器显示不可读,即CPU认为一直没接收到数据,一直停在下面语句while!=1);关键点:初始化设置时采用的是FIF O接收方式,因此无效,应查询FIF O接收中断位while!=1);//FIFORX 方式查询位。
此位只有在非FIFO中断接收方式时才有效。
问题3:断续单字节读写正常,但是采用连续的单字节读写出错。
原因:EEPRO M写过程的结束并不是I2C总线写结束就结束,实际上I2C总线的写入数据先被保存到了EEPRO M内部的缓冲区,当遇到I2C结束条件后,EEPROM才启动内部写过程,这个过程才是保存数据的过程。
非常悲哀的是这个过程比较长,官方文档标注为5ms。
如果在这5ms以内对EEPROM芯片访问将被忽略。
EEPROMI2C操作说明EEPROM (Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,可以通过电子方式擦除和编程,同时可以通过I2C总线进行操作。
本文将详细介绍EEPROM的I2C操作说明。
I2C(Inter-Integrated Circuit)是一种串行通信接口协议,可以在多个设备之间进行通信。
在EEPROM的I2C操作中,需要了解以下几个重要的概念和步骤。
1.设备地址:每个通过I2C连接的设备都有一个唯一的设备地址。
在EEPROM的I2C操作中,需要使用设备地址来与EEPROM进行通信。
2.起始条件和停止条件:I2C通信中,起始条件表示通信的开始,停止条件表示通信的结束。
起始条件由一个高电平到低电平的SCL上升沿和一个低电平的SDA下降沿组成,停止条件由一个低电平到高电平的SCL上升沿和一个高电平的SDA上升沿组成。
3. 数据传输:I2C通信中,数据可以以字节的形式进行传输。
每个字节由8个bit组成,包括7个数据位和1个校验位。
在进行EEPROM的I2C操作时,通常需要经过以下几个步骤:1.发送起始条件:将SCL和SDA引脚拉高,然后将SDA引脚拉低,形成起始条件。
2.发送设备地址和写命令:根据EEPROM的设备地址,将设备地址和写命令(0)发送到SDA引脚。
3.发送要写入的地址:将要写入数据的地址发送到SDA引脚。
4.发送数据:将要写入的数据发送到SDA引脚。
5.发送停止条件:将SCL引脚拉高,然后将SDA引脚拉高,形成停止条件。
实际的EEPROM的I2C操作可能还包括以下一些操作:1.读操作:通过发送读命令(1)和读取数据的地址,可以从EEPROM 中读取数据。
读操作与写操作类似,只是需要在发送设备地址时,将写命令(0)改为读命令(1)。
2.擦除操作:EEPROM的主要特点之一是可以擦除数据。
通过发送擦除命令和要擦除的数据的地址,可以将指定数据段擦除为初始值。
i2c测试用例
i2c测试用例是指在测试I2C接口时所采用的一系列测试步骤和条件,以确保I2C设备正常工作并符合预期。
这些测试用例通常包括以下几个方面的测试:1.基础通信测试:测试I2C设备是否能够正常地进行通信,包括主设备和从
设备的识别、读写操作等。
2.参数测试:测试I2C设备的参数是否符合规格要求,如通信速率、数据位
长度、奇偶校验等。
3.错误处理测试:测试I2C设备在出现错误时的表现和处理方式,如地址冲
突、数据传输错误等。
4.电源管理测试:测试I2C设备的电源管理功能是否正常,如低功耗模式、
唤醒功能等。
5.兼容性测试:测试I2C设备与其他设备的兼容性,以确保能够正常地与其
他设备进行通信。
在进行I2C测试时,需要根据具体的设备和应用需求来选择和设计相应的测试用例。
总结来说,i2c测试用例指的是用于测试I2C接口的一系列步骤和条件,以确保设备的正常工作和性能。
I2C的验证方法主要包括以下步骤:
1.验证I2C接口的功能:确保I2C接口能够正常工作,能够进行数据传输。
2.验证I2C接口的通信速率:确保I2C接口的通信速率符合要求,能够满足系统的性能要求。
3.验证I2C接口的数据传输稳定性:确保I2C接口在长时间运行过程中,数据传输的稳定性能够得到保证。
4.验证I2C接口的兼容性:确保I2C接口能够与不同的设备进行通信,具有良好的兼容性。
5.验证I2C接口的安全性:确保I2C接口的数据传输安全性得到保证,防止数据被窃取或篡改。
在验证过程中,可以采用一些测试工具和方法,例如使用示波器观察I2C接口的信号波形,使用逻辑分析仪捕获I2C接口的数据传输过程,以及编写测试程序对I2C接口进行自动化测试等。
一、测试命令1、读取I2C-1-20的值i2cget -f -y 1 0x20 0x00 w注:i2cget :读取i2c设备的命令-f :是强制读取(force)忽略设备的状态(busy)-y :同意执行(yes)1 :i2c接口总线号(i2c0)0x20 :i2c gpio设备pcf8575的i2c地址0x00 :pcf8575内部寄存器存储P0-P7 P10-P17接口的数据w :一次读取16bit数据可换成b 读取8bit数据(P0-P7)2、设置I2C-1-20的值i2cset -f –y 1 0x20 0xef 0x00i2cset :设置i2c设备的命令-f :是强制读取(force)忽略设备的状态(busy)-y :同意执行(yes)1 :i2c接口总线号(i2c0)0x20 :i2c gpio设备pcf8575的i2c地址0xef :P0口的值高四位为输出控制led灯第四位为输入读取按键值(0xXf形式)0x00 :P1口的值2、其他I2C命令1》i2cdump -f -y 1 0x20 读取所有设备寄存器的值2》i2cdetect -y -l 查询i2c总线信息3》i2cdetect -y -a -r 1 查看所有总线设备二、I2C GPIO LED测试步骤i2cset -f -y 1 0x20 0xef 0x00 DS2-LED灯亮i2cset -f -y 1 0x20 0xdf 0x00 DS3-LED灯亮i2cset -f -y 1 0x20 0xbf 0x00 DS4-LED灯亮i2cset -f -y 1 0x20 0x7f 0x00 DS5-LED灯亮i2cset -f -y 1 0x20 0x0f 0x00 全亮i2cset -f -y 1 0x20 0xff 0x00 全灭三.I2C GPIO KEY 测试步骤使用i2cget -f -y 1 0x20 0x00 b 命令读取键值后四位有效SW2-1闭合时键值为0xfeSW2-2闭合时键值为0xfdSW2-3闭合时键值为0xfebSW2-4闭合时键值为0xf7全部打开时键值为0xff全部闭合时键值为0xf0四、测试原理1、使用工具有i2c-tools-3.0.3编译生成2、也可通过/sys/bus/i2c接口控制五、应用程序开发1、参考i2c-tools-3.0.3源代码2、参考linux内核Documentation/i2c目录下的文档六、vs子板I2C0 GPIO测试1、只需将设备地址修改为0x21七、vs子板I2C1 GPIO测试1、只需将设备号由1 改为2。
串行EEPROM接口方法讲解串行EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种非易失性存储器,它可以通过串行接口与微控制器或其他设备进行通信。
串行EEPROM常用于存储配置信息、校准数据和日志记录等功能。
本文将对串行EEPROM的接口方法进行讲解。
串行EEPROM主要有两种接口方式:I2C和SPI。
I2C(Inter-Integrated Circuit)是一种串行通信协议,可以通过两根线进行通信;SPI(Serial Peripheral Interface)是一种串行通信协议,通信需要使用4根线。
下面将依次介绍两种接口的方法。
一、I2C接口方法I2C接口是一种简单、快速和可靠的通信协议,由两根线组成:SCL (串行时钟线)和SDA(串行数据线)。
I2C通信需要一个主设备(如微控制器)和一个或多个从设备(如串行EEPROM)。
1.初始化:首先,需要将SCL和SDA引脚配置为I2C模式,并设置串行EEPROM 的设备地址。
通常,每个串行EEPROM都有一个唯一的7位设备地址。
通过设置地址位上的电平(0或1),可以配置不同的从设备。
2.启动通信:为了开始I2C通信,主设备需要发出一个起始信号。
起始信号是由将SDA从高电平转换为低电平,然后将SCL从高电平转换为低电平形成的。
3.发送设备地址:主设备在发送起始信号之后,将需要访问的设备地址与通信位(读或写)发送到SDA线上。
这个8位的地址包括7位的设备地址和1位的读/写位。
4.等待应答:接下来,主设备需要等待来自串行EEPROM的应答信号。
在等待期间,主设备需要释放SDA线,并将SCL线保持在低电平。
5.发送数据:如果收到了来自串行EEPROM的应答信号,主设备可以继续通过I2C通信发送数据。
可以发送一个或多个字节的数据到串行EEPROM。
6.停止通信:当所有数据都发送完毕后,主设备发出停止信号,即将SDA线从低电平转换为高电平,然后将SCL线从低电平转换为高电平。
STM32的I2C-EEPROM已调试成功万利的I2C-EEPROM例程有些问题,经本人两个昼夜的反复试验,已修改完善。
修改了两个地方,在void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)写操作函数和void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)读操作函数体内的开头先要执行一句I2C_EE_WaitEepromStandbyState();这样在以后调用写操作函数和读操作函数时就不用执行I2C_EE_WaitEepromStandbyState()了。
但上电复位后先要执行一次读操作,以后就可以无限制的随便调用这两个函数了。
详细如下。
/* Includes ------------------------------------------------------------------*/#include "stm32f10x_lib.h"#include "i2c_ee.h"#include"delay.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*/#define I2C_Speed 10000#define I2C1_SLAVE_ADDRESS7 0xA0#define I2C_PageSize 4/* Private macro -------------------------------------------------------------*//* Private variables ---------------------------------------------------------*/u16 EEPROM_ADDRESS;/* Private function prototypes -----------------------------------------------*/void I2C_Configuration(void);/************************************************************** ****************** Function Name : I2C_Configuration* Description : I2C Configuration* Input : None* Output : None* Return : None*************************************************************** ****************/void I2C_Configuration(void){GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;/* Configure I2C1 pins: SCL and SDA */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//开漏输出GPIO_Init(GPIOB, &GPIO_InitStructure);/* I2C configuration */I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//设置 I2C为 I2C 模式I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//I2C快速模式 Tlow / Thigh = 2I2C_InitStructure.I2C_OwnAddress1 = I2C1_SLAVE_ADDRESS7;//设置第一个设备地址I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//使能应答I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//应答 7位地址I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;//设置时钟频率/* I2C Peripheral Enable */I2C_Cmd(I2C1, ENABLE);//使能I2C外设/* Apply I2C configuration after enabling it */I2C_Init(I2C1, &I2C_InitStructure);}/************************************************************** ****************** Function Name : I2C_EE_Init* Description : Initializes peripherals used by the I2C EEPROM driver.* Input : None* Output : None* Return : None*************************************************************** ****************/void I2C_EE_Init(){/* I2C configuration */I2C_Configuration();/* depending on the EEPROM Address selected in thei2c_ee.h file */#ifdef EEPROM_Block0_ADDRESS/* Select the EEPROM Block0 to write on */EEPROM_ADDRESS = EEPROM_Block0_ADDRESS;#endif#ifdef EEPROM_Block1_ADDRESS/* Select the EEPROM Block1 to write on */EEPROM_ADDRESS = EEPROM_Block1_ADDRESS;#endif#ifdef EEPROM_Block2_ADDRESS/* Select the EEPROM Block2 to write on */EEPROM_ADDRESS = EEPROM_Block2_ADDRESS;#endif#ifdef EEPROM_Block3_ADDRESS/* Select the EEPROM Block3 to write on */EEPROM_ADDRESS = EEPROM_Block3_ADDRESS;#endif}/************************************************************** ****************** Function Name : I2C_EE_BufferWrite* Description : Writes buffer of data to the I2C EEPROM.* Input : - pBuffer : pointer to the buffer containing the data to be* written to the EEPROM.* - WriteAddr : EEPROM's internal address to write to.* - NumByteToWrite : number of bytes to write to the EEPROM.* Output : None* Return : NonepBuffer:指向要写入数据数组的指针WriteAddr:24c02中要写入数据的首地址NumByteToWrite:写入的字节数*************************************************************** ****************/void I2C_EE_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite)//将缓冲器的数据写入EEPROM{u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0;Addr = WriteAddr % I2C_PageSize;//写入地址是每页的第几位count = I2C_PageSize - Addr;//在开始的一页要写入的个数NumOfPage = NumByteT oWrite / I2C_PageSize;//要写入的页数NumOfSingle = NumByteToWrite % I2C_PageSize;//不足一页的个数I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态/* If WriteAddr is I2C_PageSize aligned */if(Addr == 0) //写入地址是页的开始{/* If NumByteToWrite < I2C_PageSize */if(NumOfPage == 0) //数据小于一页{I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//写少于一页的数据I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态}/* If NumByteToWrite > I2C_PageSize */else //数据大于等于一页{while(NumOfPage--)//要写入的页数{I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize); //写一页的数据I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态WriteAddr += I2C_PageSize;pBuffer += I2C_PageSize;}if(NumOfSingle!=0)//剩余数据小于一页{I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//写少于一页的数据I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态}}}/* If WriteAddr is not I2C_PageSize aligned */else //写入地址不是页的开始{/* If NumByteToWrite < I2C_PageSize */if(NumOfPage== 0) //数据小于一页{I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle);//写少于一页的数据I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态}/* If NumByteToWrite > I2C_PageSize */else//数据大于等于一页{NumByteToWrite -= count;NumOfPage = NumByteT oWrite / I2C_PageSize; //重新计算要写入的页数NumOfSingle = NumByteToWrite % I2C_PageSize;//重新计算不足一页的个数if(count != 0)//在此处count一定不为0,此判断条件好象有点多余{I2C_EE_PageWrite(pBuffer, WriteAddr, count);//将开始的空间写满一页I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态WriteAddr += count;pBuffer += count;}while(NumOfPage--)//要写入的页数{I2C_EE_PageWrite(pBuffer, WriteAddr, I2C_PageSize);//写一页的数据I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态WriteAddr += I2C_PageSize;pBuffer += I2C_PageSize;}if(NumOfSingle != 0)//剩余数据小于一页{I2C_EE_PageWrite(pBuffer, WriteAddr, NumOfSingle); //写少于一页的数据I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态}}}}/************************************************************** ****************** Function Name : I2C_EE_ByteWrite* Description : Writes one byte to the I2C EEPROM.* Input : - pBuffer : pointer to the buffer containing the data to be* written to the EEPROM.* - WriteAddr : EEPROM's internal address to write to.* Output : None* Return : NonepBuffer:指向要写入数据数组的指针WriteAddr:24c02中要写入数据的首地址*************************************************************** ****************/void I2C_EE_ByteWrite(u8* pBuffer, u8 WriteAddr)//写一个字节到EEPROM{/* Send STRAT condition */I2C_GenerateSTART(I2C1, ENABLE);//产生 I2Cx传输 START条件/* Test on EV5 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //检查最近一次I2C事件是否是输入的事件/* Send EEPROM address for write */I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//向指定的从 I2C设备传送地址字,选择发送方向/* Test on EV6 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//检查最近一次 I2C事件是否是输入的事件/* Send the EEPROM's internal address to write to */I2C_SendData(I2C1, WriteAddr);//通过外设 I2Cx发送地址/* Test on EV8 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检查最近一次 I2C事件是否是输入的事件/* Send the byte to be written */I2C_SendData(I2C1, *pBuffer); //通过外设 I2Cx发送数据/* Test on EV8 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检查最近一次 I2C事件是否是输入的事件/* Send STOP condition */I2C_GenerateSTOP(I2C1, ENABLE);//产生 I2Cx传输 STOP条件}/************************************************************** ****************** Function Name : I2C_EE_PageWrite* Description : Writes more than one byte to the EEPROM with a single WRITE* cycle. The number of byte can't exceed the EEPROM page size.* Input : - pBuffer : pointer to the buffer containing the data to be* written to the EEPROM.* - WriteAddr : EEPROM's internal address to write to.* - NumByteToWrite : number of bytes to write to the EEPROM.* Output : None* Return : NonepBuffer:指向要写入数据数组的指针WriteAddr:24c02中要写入数据的首地址NumByteToWrite:写入的字节数*************************************************************** ****************/void I2C_EE_PageWrite(u8* pBuffer, u8 WriteAddr, u8 NumByteToWrite)//写少于一页的数据{/* Send START condition */I2C_GenerateSTART(I2C1, ENABLE);//产生 I2Cx传输 START条件/* Test on EV5 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //检查最近一次I2C事件是否是输入的事件/* Send EEPROM address for write */I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//向指定的从 I2C设备传送地址字,选择发送方向/* Test on EV6 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //检查最近一次 I2C事件是否是输入的事件/* Send the EEPROM's internal address to write to */I2C_SendData(I2C1, WriteAddr); //通过外设 I2Cx发送地址/* Test on EV8 and clear it */while(! I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //检查最近一次I2C 事件是否是输入的事件/* While there is data to be written */while(NumByteT oWrite--){/* Send the current byte */I2C_SendData(I2C1, *pBuffer); //通过外设 I2Cx发送数据/* Point to the next byte to be written */pBuffer++;/* Test on EV8 and clear it */while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检查最近一次 I2C事件是否是输入的事件}/* Send STOP condition */I2C_GenerateSTOP(I2C1, ENABLE);//产生 I2Cx传输 STOP条件}/************************************************************** ****************** Function Name : I2C_EE_BufferRead* Description : Reads a block of data from the EEPROM.* Input : - pBuffer : pointer to the buffer that receives the data read* from the EEPROM.* - ReadAddr : EEPROM's internal address to read from.* - NumByteT oRead : number of bytes to read from the EEPROM.* Output : None* Return : NonepBuffer:指向要保存读出数据的数组的指针ReadAddr:24c02中要读出数据的首地址NumByteToRead:读出的字节数*************************************************************** ****************/void I2C_EE_BufferRead(u8* pBuffer, u8 ReadAddr, u16 NumByteToRead)//将EEPROM的数据读入缓冲器{I2C_EE_WaitEepromStandbyState();//EEPROM设为待命状态/* Send START condition */I2C_GenerateSTART(I2C1, ENABLE);//产生 I2Cx传输 START条件/* Test on EV5 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//检查最近一次 I2C事件是否是输入的事件/* In the case of a single data transfer disable ACK before reading the data */if(NumByteToRead==1){I2C_AcknowledgeConfig(I2C1, DISABLE);//使能或者失能指定I2C的应答功能}/* Send EEPROM address for write */I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//向指定的从 I2C设备传送地址字,选择发送方向/* Test on EV6 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//检查最近一次 I2C事件是否是输入的事件/* Clear EV6 by setting again the PE bit */I2C_Cmd(I2C1, ENABLE);//使能或者失能 I2C外设/* Send the EEPROM's internal address to write to */I2C_SendData(I2C1, ReadAddr); //通过外设 I2Cx发送地址/* Test on EV8 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//检查最近一次 I2C事件是否是输入的事件/* Send STRAT condition a second time */I2C_GenerateSTART(I2C1, ENABLE);//产生 I2Cx传输 START条件/* Test on EV5 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//检查最近一次 I2C事件是否是输入的事件/* Send EEPROM address for read */I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Receiver);//向指定的从I2C设备传送地址字,选择接收方向/* Test on EV6 and clear it */while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//检查最近一次 I2C事件是否是输入的事件/* While there is data to be read */while(NumByteT oRead){/* Test on EV7 and clear it */if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)) //检查最近一次I2C事件是否是输入的事件{if(NumByteToRead == 2){/* Disable Acknowledgement */I2C_AcknowledgeConfig(I2C1, DISABLE);//使能或者失能指定I2C的应答功能}if(NumByteToRead == 1){/* Send STOP Condition */I2C_GenerateSTOP(I2C1, ENABLE);//产生 I2Cx传输 STOP条件}/* Read a byte from the EEPROM */*pBuffer = I2C_ReceiveData(I2C1);//返回通过 I2Cx最近接收的数据/* Point to the next location where the byte read will be saved */pBuffer++;/* Decrement the read bytes counter */NumByteToRead--;}}/* Enable Acknowledgement to be ready for another reception */I2C_AcknowledgeConfig(I2C1, ENABLE);//使能或者失能指定I2C的应答功能}/************************************************************** ****************** Function Name : I2C_EE_WaitEepromStandbyState* Description : Wait for EEPROM Standby state* Input : None* Output : None* Return : None*************************************************************** ****************/void I2C_EE_WaitEepromStandbyState(void) //EEPROM设为待命状态{vu16 SR1_Tmp = 0;do{/* Send START condition */I2C_GenerateSTART(I2C1, ENABLE);//产生 I2Cx传输 START条件/* Read I2C1 SR1 register */SR1_Tmp = I2C_ReadRegister(I2C1, I2C_Register_SR1);//读取指定的 I2C寄存器 I2C_SR1 并返回其值/* Send EEPROM address for write */I2C_Send7bitAddress(I2C1, EEPROM_ADDRESS, I2C_Direction_Transmitter);//向指定的从I2C设备传送地址字,选择发送方向}while(!(I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0x0002));//地址发送结束/* Clear AF flag */I2C_ClearFlag(I2C1, I2C_FLAG_AF);//清除 I2Cx的应答错误标志位}。
i2c测试方法
嘿,朋友们!咱今天就来聊聊超有意思的 i2c 测试方法哟!比如说,你知道怎么像探险家一样去探寻 i2c 总线的秘密吗?
想象一下,i2c 总线就像一个神秘的信息高速公路,数据在上面欢快地
奔跑着。
那我们要怎么去测试它呢?哇塞,这可太关键啦!
首先呢,咱得准备好工具,就像战士要拿好自己的武器一样。
然后呢,小心翼翼地连接好线路,这可不能马虎,不然就像在高速公路上出车祸一样糟糕!接着,开始发送测试信号,看它能不能顺利通过这条“高速公路”。
比如说,你发送个信号,就像给远方的朋友寄一封信,看能不能准确到达呢!
在测试的过程中,要是遇到问题,可别慌张,得像个冷静的侦探一样去寻找线索,找到问题出在哪儿。
有时候啊,可能只是一个小小的疏忽,就像鞋子里的一粒小石子,虽小却让人不舒服。
反正,测试 i2c 一定要细心、耐心、有决心!只有这样,才能让我们更好地掌握这个神秘的“信息高速公路”呀!
我的观点结论就是:掌握好 i2c 测试方法,能让我们在电子世界里如鱼得水!。
EEPROM读写测试实验z意义与作用EEPROM是一种电可擦可编程只读存储器,掉电后数据不丢失。
是单片机应用系统中经常会用到的存储器。
EEPROM掉电后数据不会丢失,而且可以用电信号直接清除存储数据和再编程,正是由于它的这一特性,EEPROM在嵌入式设备中应用广泛,用于产品出厂数据的保存,产品运行过程中一些数据量不大的重要数据保存等。
在本章节,我们以最常见的I2C接口的24CXX芯片为例进行学习研究。
它采用PHILIPS 公司开发的两线式串行总线(I2C总线),读写访问简单。
通过本章节实验,我们将对I2C总线有一个深入的了解,进而掌握如何读写访问24CXX这一系列的I2C接口EEPROM。
z实验原理24CXX系列EEPROM采用的访问接口是I2C接口。
I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。
它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进行双向传送,高速I2C总线一般可达400kbps以上。
I2C总线在传送数据过程中共有三种类型信号,它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
I2C总线时序图如下:神舟IV号开发板板载的EEPROM芯片型号为24C02,该芯片的总容量是256个字节。
本节实验的基本原理:神舟IV号通过STM32F107VCT6处理器本身自带的硬件I2C接口与24C02相连,我们首先往EEPROM中写入一连串的有规律的数据,然后顺序读出,通过串口打印读出的数据,判断读出的数据是否正确,从而得知EERPOM是否可以正常访问。
I^2C总线应用下的EEPROM测试
盛帅能
【期刊名称】《半导体技术》
【年(卷),期】2004(29)4
【摘要】I2C总线是最早由PHILIPS公司推出的新一代串行扩展总线,广泛应用于IC器件之间的连接。
本文在分析了I2C总线的工作原理及其特点后,通过对台湾CERAMATE公司生产的2Kbits的串行EEPROM芯片24LC02的测试实例分析,提出了I2C总线应用下的EEPROM的一般测试方法。
【总页数】4页(P31-34)
【关键词】I^2C总线;EEPROM;24LC02;测试
【作者】盛帅能
【作者单位】华越微电子有限公司
【正文语种】中文
【中图分类】TN407
【相关文献】
1.基于I^2C总线的EEPROM在数字气压计中的应用 [J], 王正华;郝丽丽;徐群
2.I^2C总线在智能化振动测试仪中的应用研究 [J], 吴强;黄石红
3.CAT1025在I^2C总线控制下的应用 [J], 单承刚
4.一种I^2C总线接口设计在EEPROM的应用 [J], 庞媛媛;崔建明
5.I^2C总线在智能化振动测试仪中的应用 [J], 吴强;黄石红
因版权原因,仅展示原文概要,查看原文内容请购买。
【原创】基于STM32F103的I2C总线EEPROM的读写(带超时检测)本人最近参考了st 公司关于STM32的I2C的例程,觉得不是很适合我的应用,于是自己写了一个基于STM32F103的I2C总线EEPROM(24C256)的读写程序,总线的最高速度可达400K,现在将源代码原原本本的公布如下,希望得到高手的指点,也希望能够给和我有同样想法的同仁们一些参考价值。
注意:最好将固件库升级一下,st网站上面有V2.03库的补丁。
u32 ulTimeOut_Time;/*************************************************************** ******************************************** I2C_EE_WriteStr()** Description : 将一个数据块写入EEPROM 的指定的地址** Argument(s) : xChip - 从器件地址* xAddr - EEPROM存储空间地址* xpBuf - 数据缓冲区指针* xLen - 数据长度** Return(s) : none.** Caller(s) : Application.** Note(s) : (1)*-------------------------------------------------------------------------------------------------------* Modified by :* Modified date :* Description :*-------------------------------------------------------------------------------------------------------************************************************************** ********************************************/void I2C_EE_WriteStr(u8 xChip, u16 xAddr, u8 *xpBuf, u16 xLen){u8 *pbuf;u8 err;u8 retry;u16 addr;u16 len;//pbuf = xpBuf;addr = xAddr;len = xLen;I2C_EE_Drv_BusEn(); // 允许总线,写允许retry = 5; // 重试5次while(len){err = I2C_EE_Drv_WriteByte(xChip, addr, *pbuf);if(err){if(--retry == 0 ) // 已经试了5次,写下一个数据{retry = 5;pbuf++;addr++;len--;}}else // 顺利,写下一个数据{pbuf++;addr++;len--;}}I2C_EE_Drv_BusDis(); // 失能总线,写保护}/*************************************************************** ******************************************** I2C_EE_ReadStr()** Description : 从EEPROM 的指定的地址读出一个数据块** Argument(s) : xChip - 从器件地址* xAddr - EEPROM存储空间地址* xpBuf - 数据缓冲区指针* xLen - 数据长度** Return(s) : none.** Caller(s) : Application.** Note(s) : (1)*-------------------------------------------------------------------------------------------------------* Modified by :* Modified date :* Description :*-------------------------------------------------------------------------------------------------------************************************************************** ********************************************/void I2C_EE_ReadStr(u8 xChip, u16 xAddr, u8 *xpBuf, u16 xLen){u8 *pbuf;u8 err;u8 retry;u16 addr;u16 len;//pbuf = xpBuf;addr = xAddr;len = xLen;I2C_EE_Drv_BusEn(); // 允许总线,写允许retry = 5; // 重试5次while(len){*pbuf = I2C_EE_Drv_ReadByte(xChip, addr, &err);if(err){if(--retry == 0) // 已经试了5次,读下一个数据{retry = 5;pbuf++;addr++;len--;}}else // 顺利,读下一个数据{pbuf++;addr++;len--;}}I2C_EE_Drv_BusDis(); // 失能总线,写保护}/*************************************************************** ******************************************** I2C_EE_Drv_Init()** Description : I2C1初始化,默认情况下,I2C接口工作在从模式下。