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;若从IC发ACK;SDA会被拉低..
暖气炉
若没有ACK;SDA会被置高;这会引起Master发生RESTART或STOP流程;如下所示:
1.4 I2C写流程
1. Master发起START
2. Master发送I2C addr7bit和w操作01bit;等待ACK
3. Slave发送ACK胶黏剂搅拌机
4. Master发送reg addr8bit;等待ACK
5. Slave发送ACK
6. Master发送data8bit;即要写入寄存器中的数据;等待ACK
7. Slave发送ACK
8. 第6步和第7步可以重复多次;即顺序写多个寄存器
9. Master发起STOP
写一个寄存器
写多个寄存器
1.5 I2C读流程
读寄存器的标准流程为:
1. Master发送I2C addr7bit和w操作11bit;等待ACK
2. Slave发送ACK
3. Master发送reg addr8bit;等待ACK
4. Slave发送ACK
5. Master发起START
6. Master发送I2C addr7bit和r操作11bit;等待ACK
7. Slave发送ACK军用单杠
8. Slave发送data8bit;即寄存器里的值
9. Master发送ACK
10. 第8步和第9步可以重复多次;即顺序读多个寄存器
读一个寄存器
多元合金读多个寄存器
2. PowerPC的I2C实现
Mpc8560的CCSR中控制I2C的寄存器共有6个..
psas2.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 requestprovided I2CCRMIEN 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_xferstruct i2c_adapter *adap; struct i2c_msg *msgs; int num