EEPROM I2C操作说明.doc

上传人:豆**** 文档编号:33457985 上传时间:2022-08-11 格式:DOC 页数:14 大小:346.50KB
返回 下载 相关 举报
EEPROM I2C操作说明.doc_第1页
第1页 / 共14页
EEPROM I2C操作说明.doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述

《EEPROM I2C操作说明.doc》由会员分享,可在线阅读,更多相关《EEPROM I2C操作说明.doc(14页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、如有侵权,请联系网站删除,仅供学习与交流EEPROM I2C操作说明【精品文档】第 14 页I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话的开

2、始或结束(后面讲) 数据改变:SCL为低电平时,SDA线才能改变传输的bit1.2 I2C开始和结束信号 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。1.3 I2C应答信号 Master每发送完8bit数据后等待Slave的ACK。 即在第9个clock,若从IC发ACK,SDA会被拉低。 若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示:1.4 I2C写流程写寄存器的标准流程为:1. Master发起START2. Master发送I2C addr(7

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

4、ACK5. Master发起START6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK7. Slave发送ACK8. Slave发送data(8bit),即寄存器里的值9. Master发送ACK10. 第8步和第9步可以重复多次,即顺序读多个寄存器读一个寄存器读多个寄存器1.前言 对于大多数工程师而言,I2C永远是一个头疼的问题。相比UART和SPI而言,I2C的时序要复杂一些,I2C组合变化也丰富一些。在这里以AT24C04为例说明I2C使用过程中的一些注意点。2.AT24C04操作示意图图 AT24C04操作示意图示意图说明:示意图分阐述了4种不同的操

5、作方式,例如写单个存储单元,写多个存储单元,读单个存储单元和写单个存储单元。对于单个操作而言,上部为MCU通过I2C输出的相关指令,下部为I2C设备的响应。例如写单个存储单元操作时,MCU发出I2C启动,设备地址,写标志位等,而I2C设备输出多个ACK。3.若干说明3.1 基本操作方式I2C设备的操作可分为写单个存储字节,写多个存储字节,读单个存储字节和读多个存储字节。相对于AT24C04而言,这些读写动作相对于内部的存储单元而言,对于其他的具备I2C接口的AD或传感器而言,存储单元变成了寄存器单元。虽然存在概念上的差别,但是其操作原理确实一样的。3.2 无应答在以上4种情况中,无应答为MCU

6、发出,无应答意为MCU不需要从机输出数据,MCU将会停止本次I2C操作。需要说明的是,无应答并不是一种异常情况。3.3 I2C设备并不只有一个设备地址这一点往往被忽略,一般情况下认为在I2C启动信号之后的字节为I2C从机地址(7位)。对于AT24C04而言,内部具有4Kb存储位,合计512字节。若需要访问512字节内容,总共需要9根地址线(8位宽度),那么上图中的存储地址(8位长度)显然还差了一位,那么就需要从设备地址中“借”1位,这就使得AT24C04具有两个I2C地址,例如0x50和0x51。3.4 存储地址相对于AT24C04而言,存储地址占1个字节。若换成其他I2C设备,例如ADXL3

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

8、2C设备有很多种,若掌握基本原理,便可见招拆招,那是I2C总线就不那么难了。5.参考资料2. PowerPC的I2C实现Mpc8560的CCSR中控制I2C的寄存器共有6个。2.1 I2CADR 地址寄存器CPU也可以是I2C的Slave,CPU的I2C地址有 I2CADR指定2.2 I2CFDR 频率设置寄存器The serial bit clock frequency of SCL is equal to the CCB clock divided by the divider.用来设置I2C总线频率2.3 I2CCR 控制寄存器MEN: Module Enable. 置1时,I2C模块使

9、能MIEN:Module Interrupt Enable. 置1时,I2C中断使能。MSTA:Master/slave mode. 1 Master mode,0 Slave mode. 当1-0时,CPU发起STOP信号 当0-1时,CPU发起START信号MTX:Transmit/receive mode select.0 Receive mode,1 Transmit modeTXAK:Transfer acknowledge. 置1时,CPU在9th clock发送ACK拉低SDARSTA:Repeat START. 置1时,CPU发送REPEAT STARTBCST:置1,CPU接

10、收广播信息(信息的slave addr为7个0)2.4 I2CSR 状态寄存器MCF:0 Byte transfer is in process 1 Byte transfer is completedMAAS:当CPU作为Slave时,若I2CDR与会话中Slaveaddr匹配,此bit被置1MBB:0 I2C bus idle 1 I2C bus busyMAL:若置1,表示仲裁失败BCSTM:若置1,表示接收到广播信息SRW:When MAAS is set, SRW indicates the value of the R/W command bit of the calling ad

11、dress, which is sent from the master. 0 Slave receive, master writing to slave 1 Slave transmit, master reading from slaveMIF:Module interrupt. The MIF bit is set when an interrupt is pending, causing a processor interrupt request(provided I2CCRMIEN is set)RXAK:若置1,表示收到了ACK2.5 I2CDR 数据寄存器这个寄存器储存CPU将

12、要传输的数据。3. PPC-Linux中I2C的实现 内核代码(linux-2.6.24)中,通过I2C总线存取寄存器的函数都在文件drivers/i2c/busses/i2c-mpc.c中 最重要的函数是mpc_xfer.1. staticintmpc_xfer(structi2c_adapter*adap,structi2c_msg*msgs,intnum)2. structi2c_msg*pmsg;3. inti;4. intret=0;5. unsignedlongorig_jiffies=jiffies;6. structmpc_i2c*i2c=i2c_get_adapdata(ad

13、ap);7. mpc_i2c_start(i2c);/ 设置I2CCRMEN, 使能I2C module8. /* Allow bus up to 1s to become not busy */9. /一直读I2CSRMBB,等待I2C总线空闲下来10. while(readb(i2c-base+MPC_I2C_SR)&CSR_MBB)11. if(signal_pending(current)12. pr_debug(I2C: Interruptedn);13. writeccr(i2c,0);14. return-EINTR;15. if(time_after(jiffies,orig_

14、jiffies+HZ)16. pr_debug(I2C: timeoutn);17. if(readb(i2c-base+MPC_I2C_SR)=18. (CSR_MCF|CSR_MBB|CSR_RXAK)19. mpc_i2c_fixup(i2c);20. return-EIO;21. schedule();22. for(i=0;ret=0&iflags&I2C_M_RD?read:write,26. pmsg-len,pmsg-addr,i+1,num);27. /根据消息里的flag进行读操作或写操作28. if(pmsg-flags&I2C_M_RD)29. ret=mpc_read

15、(i2c,pmsg-addr,pmsg-buf,pmsg-len,i);30. else31. ret=mpc_write(i2c,pmsg-addr,pmsg-buf,pmsg-len,i);32. mpc_i2c_stop(i2c);/保证为I2CCSRMSTA为0,保证能触发STOP33. return(retadap.timeout;5. u32 flags=restart?CCR_RSTA:0;6. /* Start with MEN */以防万一,保证I2C模块使能起来7. if(!restart)8. writeccr(i2c,CCR_MEN);9. /* Start as ma

16、ster */写了I2CCRCCR_MSTA,触发CPU发起START信号10. writeccr(i2c,CCR_MIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags);11. /* Write target byte */CPU发送一个字节,slave I2C addr和0 (写操作bit)12. writeb(targetbase+MPC_I2C_DR);13. if(i2c_wait(i2c,timeout,1)0)/等待slave 发ACK14. return-1;15. for(i=0;ibase+MPC_I2C_DR);/CPU接着发数据,包括reg addr和

17、data18. if(i2c_wait(i2c,timeout,1)irq=0)6. /循环读I2CSR,直到I2CSRMIF置17. while(!(readb(i2c-base+MPC_I2C_SR)&CSR_MIF)8. schedule();9. if(time_after(jiffies,orig_jiffies+timeout)10. pr_debug(I2C: timeoutn);11. writeccr(i2c,0);12. result=-EIO;13. break;14. x=readb(i2c-base+MPC_I2C_SR);15. writeb(0,i2c-base+

18、MPC_I2C_SR);16. else17. /* Interrupt mode */18. result=wait_event_interruptible_timeout(i2c-queue,19. (i2c-interrupt&CSR_MIF),timeout*HZ);20. if(unlikely(resultinterrupt&CSR_MIF)24. pr_debug(I2C: wait timeoutn);25. writeccr(i2c,0);26. result=-ETIMEDOUT;27. x=i2c-interrupt;28. i2c-interrupt=0;29. if(

19、resultadap.timeout;4. inti;5. u32 flags=restart?CCR_RSTA:0;6. /* Start with MEN */以防万一,保证I2C模块使能7. if(!restart)8. writeccr(i2c,CCR_MEN);9. /* Switch to read - restart */10. /注意这里,再次把CCR_MSTA置1,再触发 START11. writeccr(i2c,CCR_MIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags);12. /* Write target address byte - this

20、time with the read flag set */13. /CPU发送slave I2C addr和读操作114. writeb(targetbase+MPC_I2C_DR); /等待Slave发ACK1. if(i2c_wait(i2c,timeout,1)base+MPC_I2C_DR);10. for(i=0;ilength;i+)11. if(i2c_wait(i2c,timeout,0)0 CPU会触发STOP19. if(i=length-1)20. writeccr(i2c,CCR_MIEN|CCR_MEN|CCR_TXAK);21. datai=readb(i2c-base+MPC_I2C_DR);22. returnlength;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com