您的位置 首页 国产IC

I2C总线协议学习笔记

1I2C协议2条双向串行线,一条数据线SDA,一条时钟线SCL。SDA传输数据是大端传输,每次传输8bit,即一字节。支持多主控(multimastering),

1.I2C协议
2条双向串行线,一条数据线SDA,一条时钟线SCL。
SDA传输数据是大端传输,每次传输8bit,即一字节。
支撑多主控(multimastering),任何时刻点只能有一个主控。
总线上每个设备都有自己的一个addr,共7个bit,播送地址全0.
体系中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet。

1.1 I2C位传输
数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;
若SDA产生跳变,则用来表明一个会话的开端或完毕(后边讲)
数据改动:SCL为低电平时,SDA线才干改动传输的bit

1.2 I2C开端和完毕信号
开端信号:SCL为高电平时,SDA由高电平向低电平跳变,开端传送数据。
完毕信号:SCL为高电平时,SDA由低电平向高电平跳变,完毕传送数据。

1.3 I2C应对信号

Master每发送完8bit数据后等候Slave的ACK。
即在第9个clock,若从%&&&&&%发ACK,SDA会被拉低。
若没有ACK,SDA会被置高,这会引起Master产生RESTART或STOP流程,如下所示:

1.4 I2C写流程
写寄存器的规范流程为:
1. Master建议START
2. Master发送I2C addr(7bit)和w操作0(1bit),等候ACK
3. Slave发送ACK
4. Master发送reg addr(8bit),等候ACK
5. Slave发送ACK
6. Master发送data(8bit),即要写入寄存器中的数据,等候ACK
7. Slave发送ACK
8. 第6步和第7步能够重复屡次,即次序写多个寄存器
9. Master建议STOP

写一个寄存器

写多个寄存器

1.5 I2C读流程

读寄存器的规范流程为:
1. Master发送I2C addr(7bit)和w操作1(1bit),等候ACK
2. Slave发送ACK
3. Master发送reg addr(8bit),等候ACK
4. Slave发送ACK
5. Master建议START
6. Master发送I2C addr(7bit)和r操作1(1bit),等候ACK
7. Slave发送ACK
8. Slave发送data(8bit),即寄存器里的值
9. Master发送ACK
10. 第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 mode
TXAK:Transfer acknowledge. 置1时,CPU在9th clock发送ACK拉低SDA
RSTA:Repeat START. 置1时,CPU发送REPEAT START
BCST:置1,CPU接纳播送信息(信息的slave addr为7个0)

2.4 I2CSR 状况寄存器

MCF:0 Byte transfer is in process
1 Byte transfer is completed

MAAS:当CPU作为Slave时,若I2CDR与会话中Slaveaddr匹配,此bit被置1

MBB:0 I2C bus idle
1 I2C bus busy

MAL:若置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 slave

MIF:Module interrupt. The MIF bit is set when an interrupt is pending, causing a processor interrupt request(provided I2CCR[MIEN] is set)

RXAK:若置1,表明收到了ACK

2.5 I2CDR 数据寄存器


这个寄存器贮存CPU即将传输的数据。

3. PPC-Linux中I2C的完成

内核代码中,经过I2C总线存取寄存器的函数都在文件drivers/i2c/busses/i2c-mpc.c中
最重要的函数是mpc_xfer.

  1. static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
  2. {
  3. struct i2c_msg *pmsg;
  4. int i;
  5. int ret = 0;
  6. unsigned long orig_jiffies = jiffies;
  7. struct mpc_i2c *i2c = i2c_get_adapdata(adap);
  8. mpc_i2c_start(i2c); // 设置I2CCR[MEN], 使能I2C module
  9. //一直读I2CSR[MBB],等候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. }
  16. if (time_after(jiffies, orig_jiffies + HZ)) {
  17. pr_debug(“I2C: timeoutn”);
  18. if (readb(i2c->base + MPC_I2C_SR) ==
  19. (CSR_MCF | CSR_MBB | CSR_RXAK))
  20. mpc_i2c_fixup(i2c);
  21. return -EIO;
  22. }
  23. schedule();
  24. }
  25. for (i = 0; ret >= 0 && i < num; i++) {
  26. pmsg = &msgs[i];
  27. pr_debug(“Doing %s %d bytes to 0xx – %d of %d messagesn”,
  28. pmsg->flags & I2C_M_RD ? “read” : “write”,
  29. pmsg->len, pmsg->addr, i + 1, num);
  30. //依据音讯里的flag进行读操作或写操作
  31. if (pmsg->flags & I2C_M_RD)
  32. ret = mpc_read(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
  33. else
  34. ret = mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i);
  35. }
  36. mpc_i2c_stop(i2c); //确保为I2CCSR[MSTA]为0,确保能触发STOP
  37. return (ret < 0) ? ret : num;
  38. }

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/ic/233791.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部