I2C总线协议讲述.docx
- 文档编号:29659027
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:26
- 大小:230.38KB
I2C总线协议讲述.docx
《I2C总线协议讲述.docx》由会员分享,可在线阅读,更多相关《I2C总线协议讲述.docx(26页珍藏版)》请在冰豆网上搜索。
I2C总线协议讲述
I2C总线详细介绍
FC是一种串行•总线的外设接口•它采用同步方式串行接收或发送信息,两个设备任同一个时钟卜•工作。
PC总线只用两根线:
串行数拯SDA(SerialData).串行时钟SCL(SerialClock)。
由于Fc只有-•根数据线.因此其发送信息和接收信息不能同时进行。
信息的发送和接收只能分时进行。
I2C串行总线工作时传输速率址高町达400Kbit/so
卩C总线上的所有器件的SDA线并接在一起.所有器件的SCL线并接在一起.且SDA线和SCL线必须通过上拉电阻连接到正电源。
Fc总线的数拯传输协议要比spi总线复杂一些,因为Fc总线器件没有片选控制线.所以卩c总线数抑:
传输的开始必须由主器件产生通信的开始条件(SCL高电平时.SDA产生负跳变):
通信结束时,由主器件产生通信的结束条件(SCL高电平时.SDA产生正跳变》。
SDA线上的数拥任SCL高电平期间必须保持稳定,否则会被误认为开始条件或结束*件,只有在SCL低电平期间才能改变SDA线上的数抑;。
FC总线的数据传输波形图如卜图所示。
空園怜动1set狀态信号
|第一字预跚F
1第止字节数躺00
信号状态
11、
1/7
1/7
11
11
SD.A
11
11
11
~NJ—
/11
11\
znr
象止SDA改允许数麼散据舷带改变|
I2C应用实例
AT24C系列为美IBATMEL公司推出的帘行COMS型E2PROM.具有功耗小.宽电压范国等优点。
卜图为AT24C系列E2PROM的引脚图。
图中AO、AKA2为器件地址引脚,Vss为地,Vcc为正电源.WP为写保护.SCL为串行时钟线.SDA为串行数据线。
AT24C系列E2PROM采用FC总线•FC总线上可挂接多个接口器件•在PC总线上的每个器件应有唯一的器件地址.按I,C总线规则,器件地址为7位二进制数•它与一位数据方向位构成一个器件寻址字节。
器件寻址字节的最低位(D0)为方向位(i卖/写),最高4位(D7、D4)为器件型号地址(不同的FC总线接口器件的型号地址由厂家给定■AT24C系列E2PROM的型号地址都为1010):
其余3位(D3~D1)与器件引脚地址A2A1A0相对应。
器件地址格式:
1010A2AlA0o
对于E2PROM的片内地址.AT24C01和AT24C02由于芯片容量町用一个字节表示,故读写某个单元前•先向E-PROM写入一个字节的器件地址.再写入一个字节的片内地址。
而AT24C04、AT24C08.AT24C16分别需要9位.10位和11位片内地址.所以AT24C04把器件地址中的A0作为片内地址的丧高位.AT24C08把器件地址中的A1A0作为片内地址的城高两位.AT24C16把器件地址中的A2A1A0作为片内地址的最高三位。
凡在系统中把器件的引脚地址用作片内地址后,该引脚在电路中不得使用.做悬空处理cAT24C32.AT24C64.AT24C128.AT24C256和AT24C512的片内地址采用两个字节。
AT24C系列E2PROM的读写操作原理
卜•列读写操作中SDA线上数拯传送状态标记注释如门
Start为启动信号(SCL为高电平.SDA产生负跳变).由主机发送。
Slop为结束信号(SCL为高电平,SDA产生正跳变八由主机发送。
AddressByte^AddreeeByteHxAddreeeByteL为地址字节.折定片内某单元地址.由主机发送。
data为数据字节.由数据发送方发送。
0为肯定应答信号.由数据接收方发送。
1为否定应答信号.由数据接收方发送。
主机控制数抑:
线SDA时.在SCL高电平期间必须保持SDA线上的数抑;稳宦.否则会被误认为对从机的起始条件或结束条件。
主机只能在SCL低电平期间改变SDA线上的数据。
主机写操作期间,用SCL的上升沿写入数搦:
主机读操作期间.用SCL的卜降沿读出数抑;。
从AT24C系列AT24C01-AT24C16中读n个字节的数据格式:
朋AJA00bIhMie"册&Io|弘小|u»10.2八1XO丨[ob“册bI|丨爪心,[
从AT24C系列AT24C32-AT24C512中读n个字节的数抑:
格式:
阳1AiA】AQo]oIvdAwB、”刖M[vacftib1山怖|(F[如“[0j・|4心I】強I
向AT24C系列AT24C01-AT24C16中写n个字节的数据格式(n<=页匕且n个字节不能跨页):
|(加|o
IsiaithaiOA?
AlAO0|o|AddressBytT|o|山怕fo|(1狛孔|o|
向AT24C系列AT24C32-AT24C512中写n个字节的数据格式(nv=页长,且n个字节不能跨页?
:
|sfan|1010A2A1J00|°卜血以辟Hbh山ho貯ByteL|o|血忱池[曲5I匸加出b]
应答信号
FC总线数据传送时,毎成功地传送一个字节数搦后.接收器都必须产生一个应答信号。
应答的器件在第9个时钟周期时将SDA线拉低.表示其已经收到一个8位数抓。
I2C器件在接收到起始信号和从器件地址之后响应一个应答信号.如果器件已选择了写操作.则在每接收一个8位字节之后响应一个应答信号。
FC器件工作在读模式时•在发送一个8位数据后释放SDA线(SDAS为高电平)并监视一个应答信号.一口接收到主器件的应答信号•FC器件则继续发送数抑;.如果主器件没有发送应答信号(发送非应答信号.即SDA为髙电平).器件停止传送数据且等待一个停止信号。
M2C协议
2条双向串行线,一条数据线SDA,—条时钟线SCL。
SDA传输数据是大端传输,每次传输8bit,即一字节。
支持多主控(multimastering),任何时间点只能有一个主控。
总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.
系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯
片而定,看datasheeto
1.112C位传输
数据传输:
SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据
bit:
若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲)
数据改变:
SCL为低电平时,SDA线才能改变传输的b计
-/丨\
II
1.2I2C开始和结束信号
开始信号:
SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。
结束信号:
SCL为高电平时,SDA山低电平向高电平跳变,结束传送数据。
SDA
SCL
开贻条件
11
I
1
1
1/1
1
11
11
11
1p!
SCA
SCL
1.3I2C应答信号
Master每发送完8b计数据后等待Slave的ACK。
即在第9个clock,若从IC发ACK,SDA会被拉低。
若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,
如下所示:
SCL~|R凤做F\風何用何何川冏凤付何冏用冏斤
SDa]冋A[jA2[A3仄打石隔丽两陋而而冋何丽何両何
1.4I2C写流程
写寄存器的标准流程为:
1.Master发起START
2.faster发送I2Caddr(7bit)和w操作0(lbit),等待ACK
3.Slave发送ACK
4.Master发送regaddr(8bit),等待ACK
5.Slave发送ACK
6.Master发送data(8b计),即要写入寄存器中的数据,等待ACK
7.Slave发送ACK
8.第6步和第7步可以重复多次,即顺序写多个寄存器
9.faster发起STOP
写一个寄存器
SDALINE
START
DEVICE
ADDRESS
w
R
I
T
E
WORDADDRESS
DATA
ULILL
Ib:
:
:
:
:
:
:
11
MSB
ACK
R/V7
LSB
ACK
LSB
STOP一一
一ACK
Figure2.ByteWrite
写多个寄存器
Figure3.PageWrite
1.512C读流程
读寄存器的标准流程为:
1.Master发送I2Caddr(7bi+)和w操作1(Ibit),等待ACK
2.Slave发送ACK
3.Master发送regaddr(8bit),等待ACK
4.Slave发送ACK
5.faster发起START
6.Master发送I2Caddr(7bit)和r操作1(lbit),等待ACK
7.Slave发送ACK
8.Slave发送data(8bit),即寄存器里的值
9.
Master发送ACK
SDALINE
DUMMYWRITE
Figure5.RandomRead
读多个寄存器
R
DEVICEAADDRESSD
ACK
ACK
ACK
SDALINE
厂L|
--.LUL
RAcWK
DATAn
DATAn+1
DATAn+2
Figure6.SequentialRead
2.PowerPC的I2C实现
Mpc8560的CCSR中控制I2C的寄存器共有6个。
Table11-3.12CMemoryMap
Address
l2CRegister
Access
Reset
Sec
0x0_3000
I2CADR—l2Caddressregister
R/W
0x00
11:
0x0_3004
I2CFDR—l2Cfrequencydividerregister
R/W
0x00
11.:
0x0_3008
I2CCR—l2Ccontrolregister
RyW
0x00
11.:
0x0_300C
I2CSR—l2Cstatusregister
R/W
0x81
11.:
0x0^3010
I2CDR—l2Cdataregister
RW
0x00
11.:
0x0^3014
I2CDFSRR—l2Cdigitalfiltersamplingrateregister
R/W
0x10
11.3
2.1I2CADR地址寄存器
CPU也可以是I2C的Slave,CPU的I2C地址有I2CADR指定
067
R
w
ADDR
Reset
0000.0000
Offset
0x0_3000
Figure11-2.12CAddressRegister(I2CADR)
2.2I2CFDR频率设置寄存器
Figure11-3.12CFrequencyDividerRegister(I2CFDR)
TheserialbitclockfrequencyofSCLisequaltotheCCBclockdividedbythedivider・
用来设置I2C总线频率
2.3I2CCR控制寄存器
MEN
MIEN
MSTA
MTX
TXAK
RSTA
BCST
oooo_oooo
0x0_3008
R
W
Reset
Offset
Figure11-4.12CControlRegister(I2CCR)
MEN:
ModuleEnable.置1时,I2C模块使能
MIEN:
ModuleInterruptEnable.置1时,I2C中断使能。
MSTA:
Master/slavemode・1fastermode,0Slavemode・
当l»0时,CPU发起STOP信号
当0亠时,CPU发起START信号
MTX:
Transmit/receivemodeselect.OReceivemode,1Transmitmode
TXAK:
Transferacknowledge.置1时,CPU在9thclock发送ACK拉低SM
RSTA:
RepeatSTART.置1时,CPU发送REPEATSTART
BCST:
SI,CPU接收广播信息(信息的slaveaddr为7个0)
2.4I2CSR状态寄存器
MCF:
0Bytetransferisinprocess
1Bytetransferiscompleted
MAAS:
当CPU作为Slave时,若I2CDR与会话中Slaveaddr匹配,此bit
被置1
MBB:
0I2Cbusidle
1I2Cbusbusy
MAL:
若置1,表示仲裁失败
BCSTM:
若置1,表示接收到广播信息
SRW:
WhenMAASisset,SRWindicatesthevalueoftheR/Wcommandbi十ofthecallingaddress,whichissentfromthemaster.
0Slavereceive,masterwritingtoslave
1Slavetransmi十,masterreadingfromslave
MIF:
Moduleinterrupt.TheMIFbitissetwhenaninterruptispending,causingaprocessorinterruptreques十(providedI2CCR[MIEN]isset)
RXAK:
若置1,表示收到了ACK
2.5I2CDR数据寄存器
Figure11-6.12CDataRegister(I2CDR)
这个寄存器储存CPU将要传输的数据。
3.PPC-Linux中I2C的实现
内核代码中,通过I2C总线存取寄存器的函数都在文件
drivers/i2c/busses/i2c・mpc.c中
最重要的函数是mpc_xfer.
1.staticirrtmpc_xfer(structi2c_adapter*adapzstructi2c_msg*msgszin
tnum)
2.{
3.structi2c_msg*pmsg;
4.inti;
5.intret=O;
6.unsignedlongorig_jiffies=jiffies;
7.structmpc_i2c*i2c二i2c_get_adapda+a(adap);
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
23.
24.
25.
26.
27.
2&
29.
30.
31.
mpc_i2c_start(i2c);〃设置I2CCR[MEN],便逢I2Cmodule
//一直读I2CSR[MBB],等待I2C总线空闲下来
while(readb(i2c->base+MPC_I2C_SR)&CSR_MBB){
if(signal_pending(current)){
pr_debug("I2C:
Interrupted\nH);
writeccr(i2cz0);
return-EINTR;
}
讦■fies,orig^jiffies+HZ)){
pr_debugCT2C:
timeout\n,1);
if(readb(i2c->base+MPC_I2C_SR)==
(CSR_MCF|CSR_MBB|CSR_RXAK))
mpc_i2c_fixup(i2c);
return・EIO;
}
schedule();
}
for(i=0;ret>=0&&i«/FONT>num;i++){
pmsg二&msgs[i];
pr_debug(Hboing%s%dbytestoOxx•%dof%dmessages\n,,/
32.pmsg->flags&I2C_M_Rb?
"reacT:
"write",
33.pmsg->len/pmsg・》addr,i+lznum);
34.〃根拥消息里的flag匙行读操作或写操作
35.if(pmsg->flags&I2C_M_RD)
36.ret=mpc_read(i2c/pmsg・》addr\pmsg・》buf.pmsgi);
37.else
3&ret=mpc_wr计e(i2c,pmsg^addr,pmsg・》buf,pmsg^len,i);
39.}
40.mpc_i2c_stop(i2c);//保iiF•为I2CCSR[MSTA]为0,曝证能触发STOP
41.return(ret«/FONT>0)?
ret:
num;
42.}
1.staticintmpc_write(structmpc_i2c*120,inttarget,
2.constu8*data,intlength,intrestart)
工{
4.inti;
5.tinsignedtimeout=i2c・》adap・timeou十;
6.u32flags=restart?
CCR_RSTA:
0;
7.
9.if(irestart)
10.writeccr(i2c/CCR_MEN);
11.//"J了I2CCR[CCR_MSTA],触发CPUSTART 12.writeccr(i2c,CCR_MIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags); is.//CPU技送…个'」slaveI2Caddr和0((1: bit) 14.writeb((target«/FONT>«/FONT>1),i2c->base+MPC_I2C_bR); 15. 15.if(i2c_wait(i2c#timeout,1)«/FONT>0)f! slave 16.retur 18. 17.for(i=0;i«/FONT>length;i++){ 20. 2i.writeb(data[i],i2c->base+MPC_I2C_DR);CPU接‘艾数扑;,丄: Jregaddr和data 23.if(i2c_wait(i2c/timeout,1)«/FONT>0)slave 24.retur 25.} 26. 26.re+urnO; i.staticinti2c_wait(structmpc_i2c*(20,unsignedtimeout,intwriting) 2{ 3.unsignedlongorig_jiffies=jiffies; 4.u32x; 5.intresult=O; 6. 6.if(i2c->irq==0) s.{//右」仁讥I2C5R,i? iiaCSREMIF]? ? .1 9.while(! (readb(i2c->base+MPC_I2C_SR)&CSR_MIF)){ 10.schedule(); 11.if(time_af+er(jiffies/orig_jiffies++imeout)){ 12.pr_debug("I2C: tirr\eout\nN); 13.writeccr(i2c/0); 14.result=・EIO; 15.break; 16.} 17.} 18.x=readb(i2c->base+MPC_I2C_SR); 19.wri十eb(O.i2c->base+MPC_I2C_SR); 21. 22.result=wai+_event_in+erruptible_timeout(i2c 23.(i2c->interrupt&CSR_MIF),timeout*HZ); 24. 24.if(unlikely(result«/FONT>0)){ 25.pr_debug(HI2C: waitinterrupted\nh); 26.writeccr(i2c/0); 27.}elseif(unlikely(! (i2c->interrupt&CSR_MIF))){ 28.pr_debug(,,I2C: waittimeout\nH); 29.writeccr(i2c/0); 30.result=-ETIMEbOUT; 31.} 33. 32.x=i2c十; 33.i2c->interrupt=0; 34.} 37. 35.if(result«/FONT>0) 36.re+urnresult; 40. 37.if(! (x&CSR_MCF)){ 38.pr_debug("I2C: unfinished\n"); 39.returEIO; 45. 46.if(x&CSR_MAL){//仲裁失败 47.pr_debug("I2C: MAL\n"); 4&return・EIO; 49.} 50. 50.if(writing&&(x&CSR_RXAK)){//\;,;;殳攵j;JACK 51.pr_debug("I2C: NoRXAKXn"); 53. 52.writeccr(i2c/CCR_MEN); 53.return・EIO; 54.} 55.re+urnO; 5&} 1.staticintmpc_read(structmpc_i2c*i2c,inttarget, 2.u8*data,intleng十h.intrestart) 工{ 4.unsignedtimeout=i2c・》adap.timeout; 5.inti; 6.u32flags=restart? CCR_RSTA: 0; 7. 7.灣以防万S保证■模块使能 8.if(irestart) 9.writeccr(i2c/CCR_MEN); ii・ 】2.//汴门门门虛把CCR_MSTA置1.i汕*START 13.writeccr(i2czCCR_AAIEN|CCR_MEN|CCR_MSTA|CCR_MTX|flags); 14. 15. 16. 17.//CPU发送slaveI2Caddr和读操作1 is.writeb((+arget«/FONT>«/FONT>1)|1,i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- I2C 总线 协议 讲述
![提示](https://static.bdocx.com/images/bang_tan.gif)