EEPROMI2C操作说明_第1页
EEPROMI2C操作说明_第2页
EEPROMI2C操作说明_第3页
EEPROMI2C操作说明_第4页
EEPROMI2C操作说明_第5页
免费预览已结束,剩余17页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、EEPROM I2C操作说明I2C协议2条双向串行线,一条数据线 SDA 一条时钟线SCL。SDA传输数据是大端传输,每次传输 8bit,即一字节。支持多主控(multimastering),任何时间点只能有一个主控。总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.系统中可能有多个同种芯片,为此 addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。1.1 I2C位传输数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数 据 bit ;若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲)数据改变:SCL为低电平时,SDA线才能改变传输

2、的bitset-/ i i 匚二IILf-I数有效!改娈數据II ' -'ll J1.2 I2C开始和结束信号开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。SCLrSCLS幷竝呈件In75结束寧件1.3 I2C应答信号Master每发送完8bit数据后等待Slave的ACK即在第9个clock,若从IC发ACK SDA会被拉低。若没有ACK SDA会被置高,这会引起 Master发生RESTAR或STOP流程,如下所示:卩lAAPAMMK八八Data byteCalling addre

3、ssSTARTRead/唸 Ack1.4 I2C写流程写寄存器的标准流程为:1.Master 发起 START2.Master 发送 I2C addr(7bit)和 w操作 0( 1bit ),等待 ACK3.Slave 发送 ACK4.Master 发送 reg addr (8bit ),等待 ACK5.Slave 发送 ACK6.Master发送data (8bit ),即要写入寄存器中的数据,等待 ACK7.Slave 发送 ACK8.第6步和第7步可以重复多次,即顺序写多个寄存器9.Master发起STOP写一个寄存器STARTSDA LINE写多个寄存器DEVICEADDRESSTE

4、 WORD ADDRESSnnnoiR7niDATAMSBR/TOLSBACKLSBFigure N Byte WriteSDA LINEsTAR DEVICE TT ADDRESS E WORD ADDRESS (n)mnoiiMSBLSB1.5 I2C读流程读寄存器的标准流程为:1.Master 发送 I2C addr2.Slave 发送 ACK3.Master 发送 reg addr4.Slave 发送 ACK5.Master 发起 START6.Master 发送 I2C addr7.Slave 发送 ACK8.Slave 发送 data( 8bit9.Master 发送 ACK10.

5、DATA (n)(7bit )和 w 操作 1 (1bit )(8bit ),等待 ACK(7bit )和 r 操作 1( 1bit)),即寄存器里的值Figure 3, P日ge WriteI,等待ACK,等待ACK第8步和第9步可以重复多次,即顺序读多个寄存器读一个寄存器SDA LINE读多个寄存器STARTMSBDEVICEADDRESSWORDADDRESS nIACKR/wLSBMSBDUMMY WRITEDEVICEADDRESSSDA LINEAckLSB/ 、八1.刖言STARTDEVICEADDRESSMSBFigure 5. Random ReadRE ADLSBACKAA

6、CCKK111 111ADATA nDATA n + 1DATA n *CKFigure 6. Sequential' ReadR /对于大多数工程师而言,I2C永远是一个头疼的问题。相比 UART和SPI而言,I2C的时序要复杂一些,I2C组合变化也丰富一些。在这里以 AT24C04为例说明I2C使用过程中的一些注意点。2.AT24C04操作示意图p. .1 Devke H 伽Address Wi?rd AddressDI甫SwpTJAA写多个存射节X 1Word Ac dressDINITJAAA1 DINhlStopA读单个料字节T X 1Woid/addressH s卜1ADO

7、UT1读多个存斛节耳启动DeviceAd dregs设紳址丿勺篩11弗志楼DWIXSlop停止Word Address存馳址!3无齢g读标志碰OOUTX图AT24C04操作示意图数顫入I2C舲从IMS备谏出吕T Xs I Word Address«| X hAitftN ASlopADOUTID0UT2IDOUriNI示意图说明:示意图分阐述了 4种不同的操作方式,例如写单个存储单元,写多个存储单元,读单个存储单元和写单个存储单元。对于单个操作而言,上部为MCU通过I2C输出的相关指令,下部为I2C设备的响应。例如写单个存储单元操作时,MCI发出I2C启动,设备地址,写标志位等,而I

8、2C设备输出多个ACK950DZva mTnDmMHJfaw3Gw3.若干说明3.1基本操作方式I2C设备的操作可分为写单个存储字节,写多个存储字节,读单个存储字节和读多个存储字节。相对于AT24C04而言,这些读写动作相对于内部的存储单元而言, 对于其他的具备I2C接口的AD或传感器而言,存储单元变成了寄存器单元。虽然存在概念上的差别,但是其操作原理确实一样的。poXCMbX caO3bmP 058AAQq3.2无应答在以上4种情况中,无应答为MCI发出,无应答意为MCI不需要从机输出数据,MCU各会停止本次I2C操作。需要说明的是,无应答并不是一种异常情况。2BEtpBRBom36fr。x

9、CRwErJ3.3 I2C设备并不只有一个设备地址这一点往往被忽略,一般情况下认为在I2C启动信号之后的字节为I2C从机地址(7位)。对于AT24C04而言,内部具有4Kb存储位,合计512字节。若需要访问512字节内容,总共需要9根地址线(8位宽度),那么上图中的存储地址(8位长度)显然还差了一位,那么就需要从设备地址中“借”1位,这就使得AT24C04具有两个 I2C 地址,例如 0x50 和 0x51。F3s7PIh °PW74XF。7kmHyaZ3.4存储地址相对于AT24C04W言,存储地址占1个字节。若换成其他I2C设备,例如ADXL345 存储地址被寄存器地址替代即可,

10、其他操作方式相似。但是像AT24C32或 AT24C64这样的大容量EEPROM®存储地址需要2字节描述,也就意味着需要连续发送 两个字节地址信息且高字节在前。其他像 BH1750这样的光照芯片,存储地址被具体的操作命令替代,使用I2C设备时需要因地制宜,切不可照搬教条。rpOwcMkrmZis9。gayIhGq。3.5连续读和连续写限制AT24C04中存在页的概念,一页的大小为 8字节,若果在单页的范围内,存储地址累加,若超过该页的最大地址,存储地址回到页开始处。所以对于连续读和连续写而言,最大的操作字节数为 &若需要操作的字节内容超过8字节,则需要进行翻页操作,即写入下一

11、页的起始存储地址。HJwC61。YwK01lbMVpXsRkt。4总结I2C设备有很多种,若掌握基本原理,便可见招拆招,那是 I2C总线就不那么难了。5.参考资料2. PowerPC 的 I2C 实现MpC8560的CCSR中控希9 I2C的寄存器共有6个。Ta bile 11-3. IC Memory MapAcJdliressI玄:RegisterAccessResets0?t)_3000I2CADRIC address registerRAY0x001OxO 3Dt)4I2CFDR七 frequency divider regi&terHW0x001OxOSOOftI2CCRco

12、ntrol registerRWQxOO1OxO_3)CCI2CSRIC status registerRAY0x8110x0_3010I2CDRIC data registerF6W0x0010x0_3014I2CDFSRRPc digital filter sampling rale registerHWxWT2.1 I2CADR地址寄存器CPU也可以是I2C的Slave, CPU勺I2C地址有I2CADR指定Figure 11-2. lC Address Register II2CADR)2.2 I2CFDR频率设置寄存器Figure 11-3- IC Frequency Divider

13、 Register I2CFDR)The serial bit clock freque ncy of SCL is equal to the CCB clock divided by the divider.用来设置I2C总线频率2.3 I2CCR控制寄存器a234567Figure 114 I叱 Control Register (I2CCR)MEN Module Enable.置 1 时,I2C 模块使能MIEN Module Interrupt Enable.置 1 时,I2C 中断使能。MSTA Master/slave mode. 1 Master mode ,0 Slave mo

14、de.当1->0时,CPL发起STOP言号当0->1时,CPL发起START言号MTX Tran smit/receive mode select.0 Receive mode , 1 Tran smit modeTXAK Tran sfer ack no wledge.置 1 时,CPL在 9th clock 发送 ACK拉低 SDARSTA Rep eat START.置 1 时,CPL发送 REPEAT STARTBcST置1, CPU接收广播信息(信息的slave addr为7个0)2.4 I2CSR 状态寄存器05&MCF 0 Byte tran sfer is

15、in p rocess1 Byte tran sfer is compi etedMAAS当CPU乍为Slave时,若I2CDR与会话中Slaveaddr匹配,此bit被置1MBB 0 I2C bus idle1 I2C bus busyMAL若置1,表示仲裁失败BCSTM若置1 ,表示接收到广播信息SRW When MAAS is set, SRW in dicates the value of the R/W comma nd bit of the calli ng address, which is sent from the master.0 Slave receive, master

16、 writi ng to slave,1 Slave tran smit, master readi ng from slaveMIF: Module in terr upt. The MIF bit is set whe n an in terru pt is pending, caus ing a p rocessor in terr upt request (pro vided I2CCRMIEN is set)RXAK若置1,表示收到了 ACK2.5 I2CDR数据寄存器07RDATAWReset0CM_0000Offsel0x0_3010Figure 11 -6* IC Dsta R

17、egister (I2CDR)这个寄存器储存CPU各要传输的数据。3. PP C-Li nux中I2C的实现内核代码(linux-2.6.24 )中,通过I2C总线存取寄存器的函数都在文件 drivers/i2c/busses/i2c- mpc.c 中最重要的函数是 mpc xfer.cMUuwam NIZIgtiuqTICVd。J5VL3MUeUbvZq7FPlH ORJ1.un)staticintmpc_xfer (structi2c_ada pter*ada p,structi2c_msg * msgs int n2.3.structi2c_msg*pmsg;4.ret0

18、;6.unsignedlongorigjiffiesjiffies7.structmp c_i2c*i2c8.mpc_i2c_start (i2c );i2c_get_ada pdata (ada p);/ 设置 I2CCRMEN,使能 I2C module NVN4hyy t7daK99。HNwfXew9.10.11./* Allow bus up to 1s to become not busy */ 一直读I2CSRMBB,等待I2C总线空闲下来while (readb (i2c -> base + MPC_I2C_SR & CSR_MB)3 12.13.pr_debug

19、("I2C: Interruptedn");if(signal_pending(current )14.writeccr (i2c ,0);15.return -EINTR16.17.if (time_after(jiffies , orig_jiffies+ HZ) 18.pr_debug ("I2C: timeout'n");19.if (readb(i2c -> base + MPC_I2C_SR =20.(CSR_MCF| CSR_MBB| CSR_RXAK21.mpc_i2c_fixup (i2c );22.return-EIO;

20、23.24.schedule ();25.26.for (i = 0; ret :>=0 && i < num i +)27.pmsg = &msgs i ;pr_debug ("Doing %s %d bytes to 0x%02x - %d of %d messages'"'28.,N2Utl29.30.31.Xu。FOHIXQe gJSHERnpmsflags& I2C_M_RD ? "read""write"pmsg">len , pmsg>ad

21、dr, i + 1,II根据消息里的flag进行读操作或写操作num);32.33.retmpc_read (i2c ,pms&> addr,pmsg"> buf,p msg"> len,i);IbmOYxL。qW8JfjS。fGximGd。34.else35.retmpc_write (i2c ,pmsg-> addr,pmsg-> buf,pmsg-> len,i);sbBLtJ5 odn7Gwl3。6aKpCO。36.37.mpc_i2c_stop (i2c );/保证为I2CCSRMSTA为0,保证能触发 STOfQZ36

22、37c38.39.1.RwLjYk3iARvkFCstaticreturn (ret < 0)retnumintmpc_write ( structmp c_i2c*i2c ,inttarget ,if ( pmsgflags& I2C_M_RD9SR6lMT SGGE6wx UwPz09x2.const u8 * data ,int length ,int restart)3.4.int i ;5.unsigned timeout =i2c -> adap. timeout6.u32 flags= restart? CCR_RSTA :0;7.I* Start with

23、MEN *III以防万一,保证I2C模块使能起来8.if (! restart )9.writeccr (i2c,CCR_ME)N10.I* Start as master *III 写了 I2CCRCCR_MSTA触发 CPU发起 START信号 U9MpJGROIFTDkK rBb38be o11.writeccr (i2c , CCR_MIEN | CCR_MEN |CCR_MSTA |CCR_MTX|flags ); oLsZfJko 4hjuxbq o M9Rt5Kj o12.I* Write target byte *I/CPU发送一个字节,slave I2C addr和0 (写操

24、作bit)QalLZGk jo8DFqn o 1HOJKry13.writeb (target<<1), i2c -> base +MP C_I2C_DR14.if(i2c_wait (i2c ,timeout ,1) <0)/ 等待 slave 发 ACK5eZ0AXYvT...5.26.27.T3FLq。uj5kpdS oreturn -1;for(i0; i< lengthi+)/*

25、Write data byte */writeb ( data i , i2c -> baseMPC_I2C_DR /CPU接着发数据,包括reg addr 和 data zyk8alXbf39ezU。mkhAvNWif (i2c_wait(i2c , timeout ,1) < 0)/等待slave发 ACKi4zBD7UMtwqfyGouURnghJreturn-1;staticCo8Q1V1 2xsMhLy。dA0H8l4bd8Ls9tlx o X0iV7UEbGQvz N8xYxWKreturnint0;i2c_wait (structmpc_i2c*i2c ,unsign

26、ed timeout , intwriting )9F7e2XVunsignedu32 x ;intifresult(i2c ->long orig_jiffiesjiffies0;irq0)/ 循环读 I2CSR,直至y I2CSRMIF置 1 while(!( readb (i2c -> base + MPC_I2C_SR& CSR_MIF)wk7Eorw。hschedule ();ifwritebelse (time_after (jiffies , orig_jiffiespr_debug ( "I2C: timeoutn"writeccr (i

27、2c ,0);result-EIO;break ;readb (i2c -> base + MPC_I2C_SR(0, i2c -> base + MPC_I2C_SR/* Interru pt mode */resultwait_event_interr up tible_timeout(i2c -> interrupt & CSR_MIF,if (unlikely (result <0)pr_debug ( "I2C: wait interruptedn"writeccr (i2c ,0); else if (unlikely (!( i

28、2c -> interruptpr_debug ( "I2C: wait timeoutn"+ timeout );(i2c -> queue, NlTzehM。qYjytimeoutHZ;);& CSR_MIF) f8Bvcmio om);28.29.writeccr (i2c ,0);result =- ETIMEDOUT30.32.i2c -> interrupt=0;33.34.if (result< 0)35.returnresult36.if (!( x & CSRMCF37.pr_debug ("I2C: un

29、finished'"');38.return- EIO;39.40.if (X & CSR_MA)L /仲裁失败41.pr_debug ("I2C: MAL'n");42.return- EIO;43.44.if (writing&& (x& CSRRXAK / 写后没收至y ACK45.pr_debug ("I2C: No RXAK'n");46./* generate stop */47.writeccr (i2c ,CCR_ME)N48.return- EIO;49.50.r

30、eturn0;51.1.staticintmp c_read (structmpc_i2c *i2c , int target ,3gHaAdo Sp8cL7W OiA6ndB。2.u8 *data , int length , int restart )3.4.unsigned timeout =i2c -> adap. timeout ;5.int i ;6.u32 flags= restart? CCR_RSTA :0;7./* Start with MEN */以防万一,保证I2C模块使能8.if (! restart )9.writeccr (i2c ,CCR_ME)N10./* Switch to read - restart */11./注意这里,再次把 CCR_MST置 1,再触发START12.writeccr (i2c , CCR_MIEN | CCR_MEN | CCR_MSTA | CCR_IL4KtOo Wd6u9Ap ziDsd

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论