已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.I2C协议2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。 支持多主控(multimastering),任何时间点只能有一个主控。 总线上每个设备都有自己的一个addr,共7个bit,广播地址全0. 系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。1.1 I2C位传输 数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit; 若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲) 数据改变: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(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写一个寄存器写多个寄存器1.5 I2C读流程读寄存器的标准流程为:1. Master发送I2C addr(7bit)和w操作1(1bit),等待ACK2. Slave发送ACK3. Master发送reg addr(8bit),等待ACK4. Slave发送ACK5. Master发起START6. Master发送I2C addr(7bit)和r操作1(1bit),等待ACK7. Slave发送ACK8. Slave发送data(8bit),即寄存器里的值9. Master发送ACK10. 第8步和第9步可以重复多次,即顺序读多个寄存器读一个寄存器读多个寄存器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模块使能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接收广播信息(信息的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 address, 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将要传输的数据。3. PPC-Linux中I2C的实现 内核代码中,通过I2C总线存取寄存器的函数都在文件drivers/i2c/busses/i2c-mpc.c中 最重要的函数是mpc_xfer.1. staticintmpc_xfer(structi2c_adapter*adap,structi2c_msg*msgs,intnum)2. 3. structi2c_msg*pmsg;4. inti;5. intret=0;6. unsignedlongorig_jiffies=jiffies;7. structmpc_i2c*i2c=i2c_get_adapdata(adap);8.9. mpc_i2c_start(i2c);/ 设置I2CCRMEN, 使能I2C module10.11. /* Allow bus up to 1s to become not busy */12. /一直读I2CSRMBB,等待I2C总线空闲下来13. while(readb(i2c-base+MPC_I2C_SR)&CSR_MBB)14. if(signal_pending(current)15. pr_debug(I2C: Interruptedn);16. writeccr(i2c,0);17. return-EINTR;18. 19. if(time_after(jiffies,orig_jiffies+HZ)20. pr_debug(I2C: timeoutn);21. if(readb(i2c-base+MPC_I2C_SR)=22. (CSR_MCF|CSR_MBB|CSR_RXAK)23. mpc_i2c_fixup(i2c);24. return-EIO;25. 26. schedule();27. 28.29. for(i=0;ret=0&iflags&I2C_M_RD?read:write,33. pmsg-len,pmsg-addr,i+1,num);34. /根据消息里的flag进行读操作或写操作35. if(pmsg-flags&I2C_M_RD)36. ret=mpc_read(i2c,pmsg-addr,pmsg-buf,pmsg-len,i);37. else38. ret=mpc_write(i2c,pmsg-addr,pmsg-buf,pmsg-len,i);39. 40. mpc_i2c_stop(i2c);/保证为I2CCSRMSTA为0,保证能触发STOP41. return(retadap.timeout;6. u32 flags=restart?CCR_RSTA:0;7.8. /* Start with MEN */以防万一,保证I2C模块使能起来9. if(!restart)10. writeccr(i2c,CCR_MEN);11. /* Start as master */写了I2CCRCCR_MSTA,触发CPU发起START信号12. writeccr(i2c,CCR_MIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags);13. /* Write target byte */CPU发送一个字节,slave I2C addr和0 (写操作bit)14. writeb(targetbase+MPC_I2C_DR);15.16. if(i2c_wait(i2c,timeout,1)0)/等待slave 发ACK17. return-1;18.19. for(i=0;ibase+MPC_I2C_DR);/CPU接着发数据,包括reg addr和data22.23. if(i2c_wait(i2c,timeout,1)irq=0)8. /循环读I2CSR,直到I2CSRMIF置19. while(!(readb(i2c-base+MPC_I2C_SR)&CSR_MIF)10. schedule();11. if(time_after(jiffies,orig_jiffies+timeout)12. pr_debug(I2C: timeoutn);13. writeccr(i2c,0);14. result=-EIO;15. break;16. 17. 18. x=readb(i2c-base+MPC_I2C_SR);19. writeb(0,i2c-base+MPC_I2C_SR);20. else21. /* Interrupt mode */22. result=wait_event_interruptible_timeout(i2c-queue,23. (i2c-interrupt&CSR_MIF),timeout*HZ);24.25. if(unlikely(resultinterrupt&CSR_MIF)29. pr_debug(I2C: wait timeoutn);30. writeccr(i2c,0);31. result=-ETIMEDOUT;32. 33.34. x=i2c-interrupt;35. i2c-interrupt=0;36. 37.38. if(resultadap.timeout;5. inti;6. u32 flags=restart?CCR_RSTA:0;7.8. /* Start with MEN */以防万一,保证I2C模块使能9. if(!restart)10. writeccr(i2c,CCR_MEN);11. /* Switch to read - restart */12. /注意这里,再次把CCR_MSTA置1,再触发 START13. writeccr(i2c,CCR_MIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags);14.15.16. /* Write target address byte - this time with the read flag set */17. /CPU发送slave I2C addr和读操作118. writeb(targetbase+MPC_I2C_DR); /等待Slave发AC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江宁波市璟诚企业运营管理有限公司劳务派遣招聘1人备考题库有完整答案详解
- 2026台州临海市市属国有企业招聘工作人员49人备考题库含答案详解(培优a卷)
- 2026黄河科技学院附属医院招聘18人备考题库(含答案详解)
- 2026四川经准特种设备检验有限公司第一次招聘急需紧缺专业技术人员33人备考题库含答案详解(研优卷)
- 2026贵州省外经贸集团本部党委综合部多岗招聘4人备考题库附答案详解(黄金题型)
- 2026上海华东师范大学河口海岸全国重点实验室系统生态学课题组招聘备考题库含答案详解(培优a卷)
- 2026广东佛山市高明国盈市政工程建设有限公司第一期招聘3人备考题库附答案详解(轻巧夺冠)
- 2026福建福州市鼓楼区城市管理综合执法大队安泰中队招聘2人备考题库附答案详解(精练)
- 2026北京大学人事部招聘1名劳动合同制人员备考题库附答案详解(精练)
- 2026辽宁铁岭市卫生健康委员会校园招聘56人备考题库附答案详解(模拟题)
- 国家义务教育质量监测八年级劳动素养综合测试题
- 2024年贵州高速公路集团有限公司招聘笔试真题及答案详解(名师系列)
- 重庆一中高2026届高三3月(末)月考(全科)政治+答案
- 2025-2026学年山东省德州市宁津县育新中学(小学部)等校青岛版五年级下学期期中测试数学试题(含答案)
- AI在植物培育中的应用:技术赋能与未来展望
- 2026年济南历下区九年级中考数学一模考试试题(含答案)
- 2026新质生产力人才发展报告-
- 2026中国学生出国留学发展报告-
- 大学生国家安全教育第2章 政治安全
- 2025年贵州高考政治试卷试题真题及答案详解(精校打印)
- 地铁工程扬尘防治专项施工方案
评论
0/150
提交评论