<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/624f986674bc5c010546c1b8/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624f986674bc5c010546c1b8/bg1.jpg"><div class="t m0 x1 h2 y1 ff1 fs0 fc0 sc0 ls0 ws0">C8051F MCU</div><div class="t m1 x2 h3 y1 ff2 fs1 fc0 sc1 ls1 ws1">应</div><div class="t m0 x3 h4 y1 ff1 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m1 x4 h3 y1 ff2 fs1 fc0 sc1 ls1 ws1">用</div><div class="t m0 x5 h4 y1 ff1 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m1 x6 h3 y1 ff2 fs1 fc0 sc1 ls1 ws1">笔</div><div class="t m0 x7 h4 y1 ff1 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m1 x8 h3 y1 ff2 fs1 fc0 sc1 ls1 ws1">记</div><div class="t m0 x9 h5 y1 ff3 fs0 fc0 sc0 ls1 ws1"> </div><div class="t m0 xa h6 y2 ff4 fs0 fc0 sc0 ls1 ws1"> </div><div class="t m0 xb h7 y3 ff4 fs3 fc0 sc0 ls1 ws1"> </div><div class="t m0 xc h8 y4 ff4 fs4 fc0 sc0 ls2 ws2">Silicon Laboratories Inc. <span class="_"> </span> <span class="_ _0"> </span><span class="ff2 ls1 ws1">新华龙电子有限公司<span class="ff4"> </span></span></div><div class="t m0 xc h8 y5 ff4 fs4 fc0 sc0 ls3 ws3">4635 Boston Lane <span class="_ _1"> </span><span class="ff2 ls1 ws1">深圳市福田区华强北路现代之窗大厦<span class="_ _2"> </span><span class="ff4">A<span class="_"> </span></span>座<span class="_ _2"> </span></span><span class="ls4 ws4">13F C<span class="_"> </span><span class="ff2 ls1 ws1">室</span><span class="ws1">(518013) </span></span></div><div class="t m0 xc h9 y6 ff4 fs4 fc0 sc0 ls5 ws5">Austin, TX 78735 <span class="_ _3"> </span> <span class="_ _4"> </span> </div><div class="t m0 xd h9 y7 ff4 fs4 fc0 sc0 ls1 ws6">0755-83645240 83645242 83645244 83645251 </div><div class="t m0 xe ha y8 ff5 fs0 fc0 sc0 ls6 ws1">AN013 <span class="_ _5"> </span><span class="ff2 ls1">—<span class="ff5"> <span class="_ _5"> </span></span>用<span class="_ _6"> </span></span><span class="ls7">SMBus<span class="_ _6"> </span><span class="ff2 ls1">实现串行通信<span class="ff4"> </span></span></span></div><div class="t m0 xf hb y9 ff4 fs5 fc0 sc0 ls1 ws1"> </div><div class="t m0 x10 hc ya ff4 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m0 x11 hd yb ff2 fs6 fc0 sc1 ls8 ws1">相关器件<span class="ff6 sc0 ls1"> </span></div><div class="t m0 x10 he yc ff2 fs2 fc0 sc0 ls1 ws1">本应用笔记适用于下列器件:<span class="ff4"> </span></div><div class="t m0 x10 he yd ff5 fs2 fc0 sc0 ls9 ws1">C8051F000<span class="ff2 ls1">、<span class="_ _7"></span><span class="ff5 ls9">C8051F001<span class="ff2 ls1">、<span class="_ _7"></span><span class="ff5 lsa">C8051F002<span class="ff2 ls1">、<span class="_ _7"></span><span class="ff5 lsb">C8051F005<span class="ff2 ls1">、<span class="_ _7"></span><span class="ff5 ls9">C8051F006<span class="ff2 ls1">、<span class="_ _7"></span><span class="ff5 lsc">C8051F010<span class="ff2 ls1">、<span class="_ _8"></span><span class="ff5 lsd">C8051F01<span class="_ _9"></span>1</span></span></span></span></span></span></span></span></span></span></span></span></div><div class="t m0 xc he ye ff2 fs2 fc0 sc0 ls1 ws1">和<span class="_ _a"> </span><span class="ff5 lsc">C8051F012</span>。<span class="ff5"> </span></div><div class="t m0 x10 hc yf ff4 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m0 x11 hf y10 ff7 fs0 fc0 sc0 ls1 ws1">引言<span class="ff5"> </span></div><div class="t m0 x10 he y11 ff4 fs2 fc0 sc0 lsd ws1">C8051F0xx<span class="_ _b"></span><span class="ff2 lse">系列器件有一个符合系统管理总线标准<span class="_ _c"> </span></span><span class="lsf">1.1<span class="_ _d"> </span><span class="ff2 lse">版以及</span><span class="ls1">I</span></span></div><div class="t m0 x12 h10 y12 ff4 fs7 fc0 sc0 ls1 ws1">2</div><div class="t m0 x13 he y11 ff4 fs2 fc0 sc0 ls1 ws1">C<span class="ff2 lse">串行总线标准的</span><span class="ls10">SMBus<span class="_ _b"></span><span class="ff2 ls11">串行</span></span></div><div class="t m0 xc he y13 ff4 fs2 fc0 sc0 ls12 ws1">I/O<span class="ff2 ls1">器件。</span><span class="ls13">SMBus<span class="ff2 ls1">是一个双向、二线接口,能与多个器件通信。</span><span class="ls14">SMBus<span class="ff2 ls1">是英特尔公司的商标;<span class="_ _e"></span><span class="ff4">I</span></span></span></span></div><div class="t m0 x14 h10 y14 ff4 fs7 fc0 sc0 ls1 ws1">2</div><div class="t m0 x15 he y15 ff4 fs2 fc0 sc0 ls1 ws1">C<span class="ff2">是</span></div><div class="t m0 xc he y16 ff2 fs2 fc0 sc0 ls1 ws1">菲力浦半导体公司的商标。<span class="ff4"> </span></div><div class="t m0 x10 he y17 ff2 fs2 fc0 sc0 ls1 ws1">本应用笔记介绍<span class="_ _c"> </span><span class="ff4 ls10">SMBus<span class="_ _d"> </span></span>总线的配置和操作。本文提供示例汇编代码和‘<span class="ff4">C</span>’代码:<span class="_ _f"></span>(<span class="ff4">1</span>)与单</div><div class="t m0 xc he y18 ff2 fs2 fc0 sc0 ls15 ws1">个具有一字节地址空间的<span class="_ _c"> </span><span class="ff4 ls16">EEPROM<span class="_ _10"> </span></span>接口的汇编语言程序;<span class="_ _11"></span><span class="ls1">(<span class="_ _b"></span><span class="ff4">2<span class="_ _12"></span></span><span class="ls15">)与多个具有二字节地址空<span class="_ _e"></span>间的</span></span></div><div class="t m0 xc he y19 ff4 fs2 fc0 sc0 ls16 ws1">EEPROM<span class="_"> </span><span class="ff2 ls1">接口的<span class="_ _a"> </span><span class="ff4">C<span class="_"> </span></span>语言程序;<span class="_ _f"></span>(<span class="ff4">3</span>)两个<span class="_ _a"> </span><span class="ff4 lsf">C8051F0xx<span class="_"> </span></span>点对点通信的<span class="_ _a"> </span><span class="ff4">C<span class="_"> </span></span>语言程序。<span class="ff4"> </span></span></div><div class="t m0 x10 hf y1a ff5 fs0 fc0 sc0 ls7 ws1">SMBus<span class="_ _6"> </span><span class="ff7 ls1">规范<span class="ff5"> </span></span></div><div class="t m0 x10 he y1b ff2 fs2 fc0 sc0 ls1 ws1">本节介绍<span class="_ _a"> </span><span class="ff4 ls14">SMBus<span class="_"> </span></span>协议。对<span class="_ _a"> </span><span class="ff4 ls14">SMBus<span class="_"> </span></span>的讨论从下一节<span class="ff4 ls9 ws7"> --</span>“使用<span class="_ _a"> </span><span class="ff4 ls14">SMBus</span>”开始。<span class="ff4"> </span></div><div class="t m0 x10 h11 y1c ff3 fs8 fc0 sc0 ls17 ws1">SMBus</div><div class="t m1 x16 h12 y1c ff2 fs9 fc0 sc1 ls18 ws1">结构</div><div class="t m0 x17 h11 y1c ff3 fs8 fc0 sc0 ls1 ws1"> </div><div class="t m0 x10 he y1d ff2 fs2 fc0 sc0 ls1 ws1">一个<span class="_ _5"> </span><span class="ff4 ls14">SMBus<span class="_ _13"> </span></span>系统是一个二线网络,网络中的每一个器件有一个唯一的地址并可以被网络中的</div><div class="t m0 xc he y1e ff2 fs2 fc0 sc0 ls1 ws1">其它器件访问。<span class="_ _14"></span>所有的传输过程都由一个主器件启动;<span class="_ _14"></span>如果一个器件识别出自己的地址并回应,<span class="_ _14"></span>它</div><div class="t m0 xc he y1f ff2 fs2 fc0 sc0 ls1 ws1">就是那次传输的从器件。<span class="_ _15"></span>值得注意的是,<span class="_ _15"></span>没有必要指定一个主器件。<span class="_ _15"></span>对于任何一次数据传输,<span class="_ _15"></span>任何</div><div class="t m0 xc he y20 ff2 fs2 fc0 sc0 ls1 ws1">一个器件都可以作为主器件或从器件。<span class="_ _16"></span>当两个器件试图同时启动一次传输时,<span class="_ _16"></span>仲裁机制将强迫一个</div><div class="t m0 xc he y21 ff2 fs2 fc0 sc0 ls19 ws1">器件放弃总线。这种仲裁机制是<span class="_ _e"></span>非破坏性的(一个器件赢<span class="_ _e"></span>得总线,但没有信息丢失)<span class="_ _11"></span><span class="ls1">。我们将在仲</span></div><div class="t m0 xc he y22 ff2 fs2 fc0 sc0 ls1 ws1">裁一节深入讨论仲裁机制。<span class="ff4"> </span></div><div class="t m0 x10 he y23 ff4 fs2 fc0 sc0 ls14 ws1">SMBus<span class="_"> </span><span class="ff2 ls1">通信使用两根线:<span class="_ _e"></span><span class="ff4 ls1a">SDA<span class="_ _e"></span><span class="ff2 ls1">(串行数据)<span class="_ _e"></span>和<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_ _e"></span><span class="ff2 ls1">(串行时钟)<span class="_ _11"></span>。每根线都是双向的,<span class="_ _9"></span>其方向</span></span></span></span></span></div><div class="t m0 xc he y24 ff2 fs2 fc0 sc0 ls1 ws1">取决于器件所处的工作方式。主器件总是提供<span class="_ _a"> </span><span class="ff4 ls10">SCL</span>;主、从器件都可以在<span class="_ _13"> </span><span class="ff4 ls1a">SDA<span class="_"> </span></span>上传输数据。两根</div><div class="t m0 xc he y25 ff2 fs2 fc0 sc0 ls1 ws1">线都应通过一个上拉电路接到正电源。<span class="_ _14"></span><span class="ff4 ls14">SMBus<span class="_"> </span><span class="ff2 ls1">线上的所有器件都应有漏极开路或集电极开路输出,</span></span></div><div class="t m0 xc he y26 ff2 fs2 fc0 sc0 ls1 ws1">这样可使总线空闲时保持高电平。<span class="_ _14"></span>如果一个或多个器件输出低电平信号,<span class="_ _14"></span>总线被拉为低电平。<span class="_ _14"></span>要使</div><div class="t m0 xc he y27 ff2 fs2 fc0 sc0 ls1 ws1">总线保持在高电平,所有的器件都必须输出高电平。第二页中的图<span class="_ _13"> </span><span class="ff4">1<span class="_"> </span></span>给出一个典型的<span class="_ _13"> </span><span class="ff4 ls14">SMBus<span class="_ _13"> </span></span>总线</div><div class="t m0 xc he y28 ff2 fs2 fc0 sc0 ls1 ws1">配置。<span class="ff4"> </span></div><div class="t m0 x10 hc y29 ff4 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m0 x18 h8 y7 ff4 fs5 fc0 sc0 ls1 ws1"> <span class="_ _17"> </span><span class="ff2 fs4">电话:</span></div><div class="t m0 xc h9 y2a ff4 fs4 fc0 sc0 ls1b ws1">Email: <span class="fc1 ls3">mcuinfo@silabs.com</span></div><div class="t m0 x19 h9 y2b ff4 fs4 fc0 sc0 ls1 ws1"> </div><div class="t m2 x1a h13 y2b ff2 fsa fc0 sc0 ls1 ws1">(版权所有)</div><div class="t m0 x1b h8 y2b ff4 fs4 fc0 sc0 ls1 ws1"> <span class="_ _18"> </span><span class="ff2">电邮:</span><span class="fc1 ls1c">shenzhen@xhl.com.cn</span><span class="ls1d"> </span></div><div class="t m0 xc h9 y2c ff4 fs4 fc0 sc0 ls1e ws1">Internet: <span class="fc1 ls1f">www<span class="_ _15"></span>.silabs.com</span></div><div class="t m0 x1c h8 y2d ff4 fs4 fc0 sc0 ls1 ws1"> <span class="_ _19"> </span><span class="ff2">网址:</span><span class="fc1 ls3">www<span class="_ _9"></span>.xhl.com.cn<span class="fc0 ls1"> </span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624f986674bc5c010546c1b8/bg2.jpg"><div class="t m0 x1d h14 y2e ff5 fsb fc0 sc0 ls20 ws1">AN013 <span class="_ _13"> </span><span class="ff2 ls1">—<span class="ff5"> <span class="_ _5"> </span></span>用<span class="_ _5"> </span></span><span class="ls21">SMBus<span class="_ _5"> </span><span class="ff2 ls1">实现串行通信<span class="ff4"> </span></span></span></div><div class="t m0 x1e h7 y2f ff4 fs3 fc0 sc0 ls1 ws1"> </div><div class="t m0 x1f h15 y30 ff5 fsc fc0 sc0 ls22 ws1">VDD<span class="_"> </span>=<span class="_"> </span>+5V/+<span class="_ _e"></span>3V</div><div class="t m3 x20 h16 y31 ff5 fsd fc0 sc0 ls23 ws1">SDA</div><div class="t m3 x20 h16 y32 ff5 fsd fc0 sc0 ls24 ws1">SCL</div><div class="t m4 x21 h17 y33 ff2 fse fc0 sc0 ls1 ws1">器件<span class="_ _b"></span><span class="ff5">3<span class="_ _1a"></span><span class="ff2">器件<span class="_ _b"></span><span class="ff5">2<span class="_ _1b"></span><span class="ff2">器件<span class="_ _b"></span><span class="ff5">1</span></span></span></span></span></div><div class="t m4 x22 h18 y34 ff4 fsf fc0 sc0 ls1 ws1"> </div><div class="t m4 x10 h18 y35 ff4 fsf fc0 sc0 ls1 ws1"> </div><div class="t m4 x23 h19 y36 ff2 fsf fc0 sc1 ls1 ws1">图<span class="_ _a"> </span><span class="ff6 sc0 ls25">1. <span class="_"> </span></span><span class="ls26">典型的<span class="_ _a"> </span><span class="ff6 sc0 ls27">SMBus<span class="_"> </span></span>总线配置</span><span class="ff6 sc0"> </span></div><div class="t m5 x10 h1a y37 ff2 fs10 fc0 sc1 ls28 ws1">握手</div><div class="t m4 x24 h1b y37 ff3 fs11 fc0 sc0 ls1 ws1"> </div><div class="t m4 x10 h19 y38 ff4 fsf fc0 sc0 ls29 ws1">SMBus<span class="_"> </span><span class="ff2 ls1">采用多种线路条件作为器件间的握手信号。<span class="_ _8"></span>注意,<span class="_ _8"></span>在一次数据传输中,<span class="_ _8"></span><span class="ff4 ls2a">SDA<span class="_"> </span><span class="ff2 ls1">只能在<span class="_ _a"> </span></span><span class="ls10">SCL</span></span></span></div><div class="t m4 xc h19 y39 ff2 fsf fc0 sc0 ls1 ws1">为低时改变电平。在<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_"> </span></span>为高电平时<span class="_ _a"> </span><span class="ff4 ls2a">SDA<span class="_"> </span></span>发生改变则是代表如下的开始和停止信号:<span class="ff4"> </span></div><div class="t m4 x10 h19 y3a ff2 fsf fc0 sc1 ls26 ws1">开始:<span class="sc0 ls1">该条件启动一次传输过程。当<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_"> </span></span>为高电平时<span class="_ _a"> </span><span class="ff4 ls2a">SDA<span class="_"> </span></span>上出现一个下降沿。<span class="ff4"> </span></span></div><div class="t m4 x10 h19 y3b ff2 fsf fc0 sc1 ls26 ws1">结束:<span class="sc0 ls1">该条件结束一次传输过程。当<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_"> </span></span>为高电平时<span class="_ _a"> </span><span class="ff4 ls2a">SDA<span class="_"> </span></span>上出现一个上升沿。<span class="ff4"> </span></span></div><div class="t m4 x10 h19 y3c ff2 fsf fc0 sc1 ls26 ws1">应答:<span class="sc0 ls1">也称为<span class="_ _a"> </span><span class="ff4 ls2b">ACK</span>,接收器件发送该信号表示确认。例如,在器件<span class="_ _1c"> </span><span class="ff4">X<span class="_"> </span></span>收到一个字节后,它将</span></div><div class="t m4 xc h19 y3d ff2 fsf fc0 sc0 ls1 ws1">发送一个<span class="_ _a"> </span><span class="ff4 ls2b">ACK<span class="_"> </span></span>确认传输成功。<span class="ff4 ls2b">ACK<span class="_"> </span></span>条件是在<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_"> </span></span>为高时采样到<span class="_ _a"> </span><span class="ff4 ls2a">SDA<span class="_"> </span></span>为低电平。<span class="ff4"> </span></div><div class="t m4 x10 h19 y3e ff2 fsf fc0 sc1 ls26 ws1">非应答:<span class="_ _14"></span><span class="sc0 ls2c">也称为<span class="_ _1c"> </span><span class="ff4 ls2d">NACK</span><span class="ls1">,<span class="_ _14"></span>这是在<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_ _1c"> </span></span>为高电平时采样到<span class="_ _a"> </span><span class="ff4 ls2a">SDA<span class="_"> </span></span>为高电平。<span class="_ _14"></span>当接收器件不能产生</span></span></div><div class="t m4 xc h19 y3f ff4 fsf fc0 sc0 ls2b ws1">ACK<span class="_"> </span><span class="ff2 ls1">时,<span class="_ _9"></span>发送器件看到的是<span class="_ _a"> </span><span class="ff4 ls2d">NACK<span class="_ _b"></span></span>。<span class="_ _9"></span>在典型的数据传输中,收到<span class="_ _2"> </span><span class="ff4 ls2d">NACK<span class="_"> </span></span>信号表示所寻址的从器件</span></div><div class="t m4 xc h19 y40 ff2 fsf fc0 sc0 ls1 ws1">没有准备好或不在总线上。<span class="_ _16"></span>一个处于接收状态的主器件发送<span class="_ _a"> </span><span class="ff4 ls2d">NACK<span class="_"> </span></span>表示这是传输的最后一个字节。</div><div class="t m4 xc h19 y41 ff2 fsf fc0 sc0 ls1 ws1">在下一节中将对这两种情况进行进一步讨论。图<span class="_ _a"> </span><span class="ff4">2<span class="_"> </span></span>给出了握手信号时序。<span class="ff4"> </span></div><div class="t m4 x10 h18 y42 ff4 fsf fc0 sc0 ls1 ws1"> </div><div class="t m4 x25 h1c y43 ff5 fs12 fc0 sc0 ls2e ws1">SLA6<span class="_ _1d"> </span>R/W</div><div class="t m4 x20 h1d y44 ff5 fs13 fc0 sc0 ls2f ws1">SL<span class="_ _b"></span>A5<span class="_ _b"></span>-0</div><div class="t m4 x26 h1e y45 ff5 fs14 fc0 sc0 ls30 ws1">D7</div><div class="t m4 x27 h1f y46 ff5 fs15 fc0 sc0 ls31 ws1">D6-0</div><div class="t m4 x28 h20 y47 ff5 fs16 fc0 sc0 ls32 ws1">STAR<span class="_ _b"></span>T<span class="_ _1e"> </span>STOP<span class="_ _1f"> </span>NAC<span class="_ _b"></span>K<span class="_ _20"> </span>STOP</div><div class="t m4 x29 h20 y48 ff5 fs16 fc0 sc0 ls33 ws1">SDA</div><div class="t m4 x29 h20 y49 ff5 fs16 fc0 sc0 ls34 ws1">SCL</div><div class="t m4 x2a h20 y4a ff5 fs16 fc0 sc0 ls35 ws1">STAR<span class="_ _b"></span>T</div><div class="t m4 x2b h21 y4b ff5 fs17 fc0 sc0 ls36 ws1">ACK</div><div class="t m4 x2c h22 y4c ff4 fs18 fc0 sc0 ls1 ws1"> </div><div class="t m4 x10 h22 y4d ff4 fs18 fc0 sc0 ls1 ws1"> </div><div class="t m4 x2d h23 y4e ff2 fs18 fc0 sc1 ls1 ws1">图<span class="_ _a"> </span><span class="ff6 sc0 ls37 ws8">2. SMBus<span class="_"> </span></span><span class="ls38">时序</span><span class="ff6 sc0"> </span></div><div class="t m5 x10 h24 y4f ff2 fs19 fc0 sc1 ls39 ws1">传输方式</div><div class="t m4 x2e h25 y4f ff3 fs1a fc0 sc0 ls1 ws1"> </div><div class="t m4 x10 h23 y50 ff2 fs18 fc0 sc0 ls1 ws1">有两种可能的传输方式:<span class="_ _15"></span>写<span class="_ _9"></span>(从主器件到从器件)<span class="_ _9"></span>和读<span class="_ _15"></span>(从从器件到主器件)<span class="_ _f"></span>。<span class="_ _9"></span>在一次传输中,</div><div class="t m4 xc h23 y51 ff2 fs18 fc0 sc0 ls1 ws1">任何一个器件都可以是四种角色之一。<span class="_ _15"></span>这四种角色将在下面说明。<span class="_ _15"></span>注意,<span class="_ _11"></span>‘从地址<span class="_ _e"></span><span class="ff4 ls3a">+R/W<span class="ff2 ls3b">’是<span class="_ _12"></span>指<span class="_ _12"></span>一<span class="_ _21"></span>个</span></span></div><div class="t m4 xc h23 y52 ff4 fs18 fc0 sc0 ls1 ws1">8<span class="_"> </span><span class="ff2">位传输(</span>7<span class="_"> </span><span class="ff2">位地址,</span>1<span class="_"> </span><span class="ff2">位<span class="_ _a"> </span></span><span class="ls3a">R/W</span><span class="ff2">)<span class="_ _f"></span>。<span class="ff4"> </span></span></div><div class="t m4 x10 h23 y53 ff4 fs18 fc0 sc0 ls1 ws1">1<span class="ff2">)主发送器:在该方式下,器件在<span class="_ _13"> </span></span><span class="ls3c">SDA<span class="_ _5"> </span></span><span class="ff2">上发送串行数据,在<span class="_ _5"> </span></span><span class="ls3d">SCL<span class="_ _5"> </span></span><span class="ff2">上输出时钟。器件用一个</span></div><div class="t m4 xc h23 y54 ff2 fs18 fc0 sc0 ls1 ws1">起始条件启动传输过程,发送从地址<span class="ff4 ls3e">+W</span>,然后等待从器件的<span class="_ _13"> </span><span class="ff4 ls3f">ACK</span>。收到<span class="_ _13"> </span><span class="ff4 ls3f">ACK<span class="_ _13"> </span></span>后,器件发送一个</div><div class="t m4 xc h23 y55 ff2 fs18 fc0 sc0 ls1 ws1">或多个字节数据,<span class="_ _7"></span>每个字节都要由从器件确认。<span class="_ _7"></span>在发送完最后一个字节后,<span class="_ _22"></span>器件发送一个停止条件。<span class="_ _11"></span><span class="ff4"> </span></div><div class="t m4 xc h26 y56 ff4 fs1b fc0 sc0 ls1 ws1"> </div><div class="t m4 xc h22 y57 ff4 fs18 fc0 sc0 ls1 ws1">2<span class="fs1c ls40"> <span class="_ _23"></span><span class="fs18 ls41 ws9">AN013-1.0 <span class="_ _22"></span>MAR01 <span class="fs1c ls42 ws1"> </span></span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624f986674bc5c010546c1b8/bg3.jpg"><div class="t m0 x1d h14 y58 ff5 fsb fc0 sc0 ls20 ws1">AN013 <span class="_ _13"> </span><span class="ff2 ls1">—<span class="ff5"> <span class="_ _5"> </span></span>用<span class="_ _5"> </span></span><span class="ls21">SMBus<span class="_ _5"> </span><span class="ff2 ls1">实现串行通信<span class="ff4"> </span></span></span></div><div class="t m0 x1e h7 y59 ff4 fs3 fc0 sc0 ls1 ws1"> </div><div class="t m0 x10 he y5a ff4 fs2 fc0 sc0 ls1 ws1">2<span class="ff2">)主接收器:在该方式下,器件在<span class="_ _13"> </span></span><span class="ls1a">SDA<span class="_ _5"> </span></span><span class="ff2">上接收串行数据,在<span class="_ _5"> </span></span><span class="ls10">SCL<span class="_ _5"> </span></span><span class="ff2">上输出时钟。器件用一个</span></div><div class="t m0 xc he y5b ff2 fs2 fc0 sc0 ls1 ws1">起始条件启动传输过程,之后发送从地址<span class="ff4 ls43">+R</span>。在收到从器件对地址的<span class="_ _6"> </span><span class="ff4 ls16">ACK<span class="_ _5"> </span></span>后,在<span class="_ _6"> </span><span class="ff4 ls10">SCL<span class="_ _6"> </span></span>上输出时</div><div class="t m0 xc he y5c ff2 fs2 fc0 sc0 ls1 ws1">钟并在<span class="_ _a"> </span><span class="ff4 ls1a">SDA<span class="_"> </span></span>上接收数据。在接收完最后一个字节后,器件将发送一个<span class="_ _a"> </span><span class="ff4 ls44">NACK<span class="_"> </span></span>和一个停止条件。<span class="ff4"> </span></div><div class="t m0 x10 he y5d ff4 fs2 fc0 sc0 ls1 ws1">3<span class="ff2">)从发送器:在该方式下,器件在<span class="_ _13"> </span></span><span class="ls1a">SDA<span class="_ _5"> </span></span><span class="ff2">上输出串行数据,在<span class="_ _5"> </span></span><span class="ls10">SCL<span class="_ _5"> </span></span><span class="ff2">上接受时钟。器件接收一</span></div><div class="t m0 xc he y5e ff2 fs2 fc0 sc0 ls1 ws1">个起始条件和它自己的从地址<span class="ff4 ls43">+R</span>,然后发出<span class="_ _13"> </span><span class="ff4 ls16">ACK<span class="_ _5"> </span></span>并进入从发送方式。器件在<span class="_ _5"> </span><span class="ff4 ls45">SDA<span class="_ _13"> </span></span>上发送数据,</div><div class="t m0 xc he y5f ff2 fs2 fc0 sc0 ls1 ws1">在发送完每个字节后都要收到一个<span class="_ _a"> </span><span class="ff4 ls16">ACK</span>。<span class="_ _e"></span>在传输完最后一个字节后,主器件发送一个<span class="_ _a"> </span><span class="ff4 ls44">NACK<span class="_"> </span></span>和一</div><div class="t m0 xc he y60 ff2 fs2 fc0 sc0 ls1 ws1">个停止条件。<span class="ff4"> </span></div><div class="t m0 x10 he y61 ff4 fs2 fc0 sc0 ls1 ws1">4<span class="ff2">)<span class="_ _15"></span>从接收器:<span class="_ _14"></span>在该方式下,<span class="_ _15"></span>器件收到来自主器件的起始条件和和它自己的从地址<span class="ff4 ls46">+W</span>。<span class="_ _15"></span>然后发</span></div><div class="t m0 xc he y62 ff2 fs2 fc0 sc0 ls1 ws1">出<span class="_ _1c"> </span><span class="ff4 ls16">ACK<span class="_ _1c"> </span></span>并进入从接收方式。现在器件在<span class="_ _1c"> </span><span class="ff4 ls1a">SDA<span class="_ _13"> </span></span>上接收串行数据,在<span class="_ _1c"> </span><span class="ff4 ls10">SCL<span class="_ _1c"> </span></span>上接收时钟。在接收完每</div><div class="t m0 xc he y63 ff2 fs2 fc0 sc0 ls1 ws1">个字节后都要发送一个<span class="_ _5"> </span><span class="ff4 ls16">ACK</span>,在接收到主器件的停止条件后退出从接收方式。图<span class="_ _5"> </span><span class="ff4">3<span class="_ _6"> </span></span>示出典型的写</div><div class="t m0 xc he y64 ff2 fs2 fc0 sc0 ls1 ws1">操作情况。<span class="_ _f"></span>(<span class="ff4">1</span>)示出一个成功的传送过程。<span class="ff4"> </span></div><div class="t m0 x10 he y65 ff2 fs2 fc0 sc0 ls1 ws1">在(<span class="ff4">2</span>)中,主器件在发送完从地址<span class="ff4 ls43">+W<span class="_ _6"> </span></span>后收到一个<span class="_ _24"> </span><span class="ff4 ls44">NACK</span>。这种情况发生在从器件‘离线’</div><div class="t m0 xc he y66 ff2 fs2 fc0 sc0 ls1 ws1">时,<span class="_ _14"></span>表示它不能回应其从地址。<span class="_ _14"></span>在这种情况下主器件应发出一个停止条件或重新发出起始条件。<span class="_ _14"></span>为</div><div class="t m0 xc he y67 ff2 fs2 fc0 sc0 ls19 ws1">了重试传输过程,主器件在发<span class="_ _e"></span>出停止条件后重新发送起始<span class="_ _e"></span>条件和从地址<span class="ff4 ls43">+W</span>。主器件将一<span class="_ _e"></span>直重复该</div><div class="t m0 xc he y68 ff2 fs2 fc0 sc0 ls1 ws1">循环过程,直到收到一个<span class="_ _a"> </span><span class="ff4 ls16">ACK<span class="_"> </span></span>为止。这被称为“应答查询”<span class="_ _f"></span>。<span class="ff4"> </span></div><div class="t m0 x10 hc y69 ff4 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m6 x2f h27 y6a ff5 fs1d fc0 sc0 ls1 ws1">P</div><div class="t m7 x30 h28 y6b ff5 fs1e fc0 sc0 ls1 ws1">A</div><div class="t m8 x31 h29 y6c ff5 fs1f fc0 sc0 ls47 ws1">(2<span class="_ _b"></span>)</div><div class="t m8 x31 h29 y6d ff5 fs1f fc0 sc0 ls47 ws1">(3<span class="_ _b"></span>)</div><div class="t m9 x32 h2a y6e ff5 fs20 fc0 sc0 ls1 ws1">A</div><div class="t ma x33 h2b y6f ff5 fs21 fc0 sc0 ls48 ws1">SL<span class="_ _e"></span>A<span class="_ _1c"> </span>+<span class="_ _1c"> </span>R</div><div class="t mb x34 h2c y70 ff5 fs22 fc0 sc0 ls1 ws1">S</div><div class="t mb x31 h2c y71 ff5 fs22 fc0 sc0 ls49 ws1">(4<span class="_ _b"></span>)</div><div class="t mc x34 h2d y72 ff5 fs23 fc0 sc0 ls1 ws1">P</div><div class="t md x35 h2e y73 ff5 fs24 fc0 sc0 ls1 ws1">A</div><div class="t me x36 h2f y74 ff5 fs25 fc0 sc0 ls4a ws1">S=</div><div class="t me x36 h2f y75 ff5 fs25 fc0 sc0 ls4b ws1">SL<span class="_ _e"></span>A<span class="_ _1c"> </span>=<span class="_ _25"> </span>(<span class="_ _9"></span>7<span class="_ _26"> </span>)</div><div class="t me x36 h2f y76 ff5 fs25 fc0 sc0 ls4c ws1">W=</div><div class="t me x36 h2f y77 ff5 fs25 fc0 sc0 ls4d ws1">R=</div><div class="t me x36 h2f y78 ff5 fs25 fc0 sc0 ls4e ws1">Dat<span class="_ _9"></span>a<span class="_ _1c"> </span>=</div><div class="t me x36 h2f y79 ff5 fs25 fc0 sc0 ls4a ws1">A=</div><div class="t me x36 h2f y7a ff5 fs25 fc0 sc0 ls4a ws1">A=</div><div class="t me x36 h2f y7b ff5 fs25 fc0 sc0 ls4a ws1">P=</div><div class="t mf x37 h30 y7c ff5 fs26 fc0 sc0 ls1 ws1">S</div><div class="t m10 x38 h31 y7d ff5 fs27 fc0 sc0 ls4f ws1">SLA<span class="_ _1c"> </span>+<span class="_ _1c"> </span>W</div><div class="t m11 x30 h32 y7e ff5 fs28 fc0 sc0 ls1 ws1">A</div><div class="t m12 x39 h33 y7f ff5 fs29 fc0 sc0 ls50 ws1">Dat<span class="_ _e"></span>a</div><div class="t m13 x32 h34 y80 ff5 fs2a fc0 sc0 ls1 ws1">P</div><div class="t m14 x35 h35 y81 ff5 fs2b fc0 sc0 ls1 ws1">A</div><div class="t m15 x3a h36 y82 ff5 fs2c fc0 sc0 ls1 ws1">A<span class="_ _27"></span><span class="ls51">Dat<span class="_ _15"></span>a</span></div><div class="t m16 x31 h37 y83 ff5 fs2d fc0 sc0 ls52 ws1">(1<span class="_ _b"></span>)</div><div class="t m17 x3b h38 y84 ff5 fs2e fc0 sc0 ls53 ws1">Dat<span class="_ _9"></span>a</div><div class="t m18 x3c h39 y85 ff2 fs2f fc0 sc0 ls1 ws1">写成功</div><div class="t m18 x3d h39 y86 ff2 fs2f fc0 sc0 ls1 ws1">在<span class="_ _28"> </span><span class="ff5 ls54 wsa">SLA + W<span class="_ _d"> </span></span>后收到<span class="_ _5"> </span><span class="ff5">NACK</span></div><div class="t m18 x3c h39 y87 ff2 fs2f fc0 sc0 ls1 ws1">在应答后发出重复起始条件</div><div class="t m18 x3c h39 y88 ff2 fs2f fc0 sc0 ls1 ws1">在数据之<span class="_ _c"> </span>后收<span class="_ _29"> </span><span class="ff5 ls55">NA<span class="_ _2a"></span><span class="ff8 ls1">到<span class="_ _2b"> </span><span class="ff5">CK</span></span></span></div><div class="t m18 x1c h39 y89 ff2 fs2f fc0 sc0 ls1 ws1">从主器件到从器件</div><div class="t m18 x1c h39 y8a ff2 fs2f fc0 sc0 ls1 ws1">从从器件到主器件</div><div class="t m18 x3e h39 y8b ff2 fs2f fc0 sc0 ls1 ws1">任意数据字节数和应答</div><div class="t m18 x3f h39 y8c ff2 fs2f fc0 sc0 ls1 ws1">起始</div><div class="t m18 x40 h39 y8d ff2 fs2f fc0 sc0 ls1 ws1">从地址<span class="_ _2c"> </span>位</div><div class="t m18 x41 h39 y8e ff2 fs2f fc0 sc0 ls1 ws1">写<span class="_ _28"> </span><span class="ff5">(1<span class="_ _21"></span></span>位<span class="_ _28"> </span><span class="ff5">)</span></div><div class="t m18 x41 h39 y8f ff2 fs2f fc0 sc0 ls1 ws1">读<span class="_ _28"> </span><span class="ff5">(1<span class="_ _21"></span></span>位<span class="_ _28"> </span><span class="ff5">)</span></div><div class="t m18 x35 h39 y90 ff2 fs2f fc0 sc0 ls1 ws1">串行数据<span class="_ _c"> </span><span class="ff5">(8<span class="_ _21"></span></span>位<span class="_ _28"> </span><span class="ff5">)</span></div><div class="t m18 x3f h39 y91 ff2 fs2f fc0 sc0 ls1 ws1">确认</div><div class="t m18 x8 h39 y92 ff2 fs2f fc0 sc0 ls1 ws1">非确认</div><div class="t m18 x8 h39 y93 ff2 fs2f fc0 sc0 ls1 ws1">停止</div><div class="t m18 x42 h3a y94 ff4 fs30 fc0 sc0 ls1 ws1"> </div><div class="t m18 x43 h3b y95 ff2 fs30 fc0 sc1 ls1 ws1">图<span class="_ _a"> </span><span class="ff6 sc0 ls56">3. <span class="_"> </span></span><span class="ls57">典型的写操作情况</span><span class="ff6 sc0"> </span></div><div class="t m18 xa h3c y96 ff6 fs30 fc0 sc0 ls1 ws1"> </div><div class="t m18 x10 h3b y97 ff2 fs30 fc0 sc0 ls58 ws1">在(<span class="_ _28"></span><span class="ff4 ls1">3<span class="ff2">)<span class="_ _14"></span>中,<span class="_ _14"></span>主器件在收到一个<span class="_ _a"> </span><span class="ff4 ls3f">ACK<span class="_"> </span></span>后重新发出起始条件。<span class="_ _14"></span>这一过程允许主器件在不放弃总线</span></span></div><div class="t m18 xc h3b y98 ff2 fs30 fc0 sc0 ls59 ws1">的情况下启动一个新的传输过<span class="_ _b"></span>程(例如,从写操作切<span class="_ _b"></span>换到读操作)<span class="_ _f"></span>。重复起始条件<span class="_ _b"></span>通常在访问</div><div class="t m18 xc h3b y99 ff4 fs30 fc0 sc0 ls3f ws1">EEPROM<span class="_ _d"> </span><span class="ff2 ls1">时使用,因为一个读操作前面必<span class="_ _b"></span>须有一个写存储器地址的操<span class="_ _b"></span>作。在所提供的三个代码<span class="_ _b"></span>示</span></div><div class="t m18 x44 h3d y9a ff4 fs31 fc0 sc0 ls5a ws1"> </div><div class="t m18 x45 h3a y9b ff4 fs32 fc0 sc0 ls5b ws1"> <span class="fs30 ls56 wsb"> AN013-1.0 <span class="_ _2d"></span>MAR01<span class="fs32 ls5b ws1"> <span class="fs30 ls1">3<span class="fs32"> </span></span></span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624f986674bc5c010546c1b8/bg4.jpg"><div class="t m0 x1d h14 y2e ff5 fsb fc0 sc0 ls20 ws1">AN013 <span class="_ _13"> </span><span class="ff2 ls1">—<span class="ff5"> <span class="_ _5"> </span></span>用<span class="_ _5"> </span></span><span class="ls21">SMBus<span class="_ _5"> </span><span class="ff2 ls1">实现串行通信<span class="ff4"> </span></span></span></div><div class="t m0 x1e h7 y2f ff4 fs3 fc0 sc0 ls1 ws1"> </div><div class="t m0 xc he y5a ff2 fs2 fc0 sc0 ls1 ws1">例中都有重复起始条件。<span class="ff4"> </span></div><div class="t m0 x10 he y9c ff2 fs2 fc0 sc0 ls5c ws1">在(<span class="_ _12"></span><span class="ff4 ls1">4<span class="_ _b"></span></span>)中<span class="_ _12"></span>,<span class="ff4 ls44">NACK<span class="_"> </span></span><span class="ls1">是在<span class="_ _b"></span>接收完一个数据字节后收到的。<span class="_ _15"></span>在典型的<span class="_ _a"> </span><span class="ff4 ls10">SMBus<span class="_"> </span></span>总线中,<span class="_ _14"></span>这是接收器</span></div><div class="t m0 xc he y9d ff2 fs2 fc0 sc0 ls19 ws1">指示错误的方式。主器件或者象<span class="_ _e"></span>在(<span class="ff4 ls1">2</span>)中那样发送一个停<span class="_ _e"></span>止条件后重试传输过程,或者放<span class="_ _e"></span>弃这次</div><div class="t m0 xc he y9e ff2 fs2 fc0 sc0 ls1 ws1">传输。<span class="_ _14"></span>注意:<span class="_ _14"></span><span class="ff4 ls44">NACK<span class="_"> </span><span class="ff2 ls1">的使用并不仅限于发生错误的情况,<span class="_ _15"></span>应答级别是一个用户可定义的特性,<span class="_ _14"></span>可以</span></span></div><div class="t m0 xc he y9f ff2 fs2 fc0 sc0 ls1 ws1">随着应用的不同而变化。<span class="ff4"> </span></div><div class="t m0 x10 he ya0 ff2 fs2 fc0 sc0 ls1 ws1">图<span class="_ _a"> </span><span class="ff4">4<span class="_"> </span></span>示出典型的读操作情况。<span class="_ _f"></span>(<span class="ff4">1</span>)示出一个成功的读过程。<span class="ff4"> </span></div><div class="t m0 x10 he ya1 ff2 fs2 fc0 sc0 ls5d ws1">在(<span class="_ _12"></span><span class="ff4 ls1">2<span class="ff2">)<span class="_ _9"></span>中,<span class="_ _14"></span>主器件在发送完从地址<span class="ff4 ls46">+R<span class="_"> </span></span>后收到一个<span class="_ _a"> </span><span class="ff4 ls44">NACK</span>。<span class="_ _15"></span>这种情况的处理与在写操作的<span class="_ _9"></span>(<span class="ff4">2</span>)</span></span></div><div class="t m0 xc he ya2 ff2 fs2 fc0 sc0 ls1 ws1">中讨论的一样。<span class="_ _14"></span>主器件可用应答查询来重试传输过程或放弃这次传输。<span class="_ _2e"></span>(<span class="ff4">3</span>)<span class="_ _14"></span>示出主器件在发送完一</div><div class="t m0 xc he ya3 ff2 fs2 fc0 sc0 ls1 ws1">个字节数据后重复发出起始条件的过程。<span class="_ _16"></span>这与写操作中讨论的重复起始条件状态是一样的。<span class="_ _16"></span>一个主</div><div class="t m0 xc he ya4 ff2 fs2 fc0 sc0 ls1 ws1">器件可以在传输完任何一个字节后重新发出起始条件,可以在重复起始条件之后启动读或写操作。</div><div class="t m0 xc he ya5 ff2 fs2 fc0 sc0 ls1 ws1">一般来说,重复起始条件用于改变方向(<span class="ff4 ls5e">R/W</span>)或改变地址(从器件)<span class="_ _f"></span>。<span class="ff4"> </span></div><div class="t m0 x10 he ya6 ff2 fs2 fc0 sc0 ls1 ws1">注意,<span class="_ _7"></span>在读和写的示意图中所看到的只是典型情况。<span class="_ _7"></span>总线错误、<span class="_ _22"></span>超时和总线竞争都有可能发生。</div><div class="t m0 xc he ya7 ff2 fs2 fc0 sc0 ls1 ws1">超时用于检测一次传输过程是否停止或总线何时空闲。常常有这样的情况:一个器件保持<span class="_ _24"> </span><span class="ff4 ls10">SCL<span class="_ _6"> </span></span>为</div><div class="t m0 xc he ya8 ff2 fs2 fc0 sc0 ls1 ws1">低电平,<span class="_ _2f"></span>直到它准备好继续传输过程为止。<span class="_ _2f"></span>这种过程允许一个低速从器件与一个快速的主器件通信,</div><div class="t m0 xc he ya9 ff2 fs2 fc0 sc0 ls1 ws1">因为停止总线操作实际上相当于降低了<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_ _1c"> </span></span>频率。系统管理总线协议规定:<span class="ff4 ls10">SMBus<span class="_ _1c"> </span></span>系统中的所有</div><div class="t m0 xc he yaa ff2 fs2 fc0 sc0 ls1 ws1">器件必须将任何大于<span class="_ _1c"> </span><span class="ff4 ls5f">25ms<span class="_ _1c"> </span></span>的<span class="_ _1c"> </span><span class="ff4 ls10">SCL<span class="_ _1c"> </span></span>低电平视为“超时”<span class="_ _f"></span>。发生种情况时,总线上的所有器件必须进</div><div class="t m0 xc he yab ff2 fs2 fc0 sc0 ls1 ws1">行通信复位。<span class="_ _22"></span>也有可能发生高电平<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_"> </span></span>超时。<span class="_ _22"></span><span class="ls60">如果<span class="_ _a"> </span><span class="ff4 ls1a">SDA<span class="_"> </span></span><span class="ls1">和<span class="_ _a"> </span><span class="ff4 ls61">SCL<span class="_"> </span></span>同时为高电平的时间大于<span class="_ _a"> </span><span class="ff4 ls62">50<span class="_"> </span></span>微秒,</span></span></div><div class="t m0 xc he yac ff2 fs2 fc0 sc0 ls1 ws1">则可认为总线处于空闲状态。<span class="ff4"> </span></div><div class="t m0 x10 hc yad ff4 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m0 x46 h3e yae ff5 fs33 fc0 sc0 ls63 ws1">S=</div><div class="t m0 x46 h3e yaf ff5 fs33 fc0 sc0 ls64 ws1">SL<span class="_ _e"></span>A<span class="_ _13"> </span>=</div><div class="t m0 x46 h3e yb0 ff5 fs33 fc0 sc0 ls65 ws1">W=</div><div class="t m0 x46 h3e yb1 ff5 fs33 fc0 sc0 ls66 ws1">R=</div><div class="t m0 x46 h3e yb2 ff5 fs33 fc0 sc0 ls67 ws1">Data<span class="_ _1c"> </span>=</div><div class="t m0 x46 h3e yb3 ff5 fs33 fc0 sc0 ls63 ws1">A=</div><div class="t m0 x46 h3e yb4 ff5 fs33 fc0 sc0 ls63 ws1">A=</div><div class="t m0 x46 h3e yb5 ff5 fs33 fc0 sc0 ls63 ws1">P=</div><div class="t m0 x47 h3f yb6 ff5 fs34 fc0 sc0 ls68 ws1">Dat<span class="_ _e"></span>a</div><div class="t m0 x48 h40 yb7 ff5 fs35 fc0 sc0 ls1 ws1">P</div><div class="t m0 x49 h41 yb8 ff5 fs36 fc0 sc0 ls1 ws1">A</div><div class="t m0 x4a h42 yb9 ff5 fs37 fc0 sc0 ls69 ws1">(2)</div><div class="t m0 x4a h42 yba ff5 fs37 fc0 sc0 ls69 ws1">(3)</div><div class="t m0 x4b h43 ybb ff5 fs38 fc0 sc0 ls1 ws1">A</div><div class="t m0 x4c h44 ybc ff5 fs39 fc0 sc0 ls6a ws1">SL<span class="_ _e"></span>A<span class="_ _13"> </span>+<span class="_ _a"> </span>R</div><div class="t m0 x4d h45 ybd ff5 fs3a fc0 sc0 ls1 ws1">S</div><div class="t m0 x4a h46 ybe ff5 fs3b fc0 sc0 ls6b ws1">(1)</div><div class="t m0 x4e h47 ybf ff5 fs3c fc0 sc0 ls1 ws1">S</div><div class="t m0 x4f h48 yc0 ff5 fs3d fc0 sc0 ls6c ws1">SLA<span class="_"> </span>+<span class="_ _1c"> </span>R</div><div class="t m0 x49 h49 yc1 ff5 fs3e fc0 sc0 ls1 ws1">A</div><div class="t m0 x50 h4a yc2 ff5 fs3f fc0 sc0 ls6d ws1">Data</div><div class="t m0 x4b h4b yc3 ff5 fs40 fc0 sc0 ls1 ws1">P</div><div class="t m0 x51 h4c yc4 ff5 fs41 fc0 sc0 ls1 ws1">A</div><div class="t m0 x52 h4d yc5 ff5 fs42 fc0 sc0 ls1 ws1">A</div><div class="t m0 x53 h4e yc6 ff5 fs43 fc0 sc0 ls6e ws1">Dat<span class="_ _e"></span>a</div><div class="t m0 x54 h4f yc7 ff2 fs44 fc0 sc0 ls1 ws1">读成功</div><div class="t m0 x55 h4f yc8 ff2 fs44 fc0 sc0 ls1 ws1">在<span class="_ _12"></span><span class="ff5">SLA + R<span class="_ _a"> </span></span>后收到<span class="_ _2"> </span><span class="ff5">NACK</span></div><div class="t m0 x55 h4f yc9 ff2 fs44 fc0 sc0 ls1 ws1">在<span class="_ _12"></span><span class="ff5">ACK<span class="_ _30"> </span></span>后发出重复起始条件</div><div class="t m0 x25 h4f yca ff2 fs44 fc0 sc0 ls1 ws1">从主器件到从器件</div><div class="t m0 x25 h4f ycb ff2 fs44 fc0 sc0 ls1 ws1">从从器件到主器件</div><div class="t m0 xe h4f ycc ff2 fs44 fc0 sc0 ls1 ws1">任意数据字节数和应答</div><div class="t m0 x56 h4f ycd ff2 fs44 fc0 sc0 ls1 ws1">起始</div><div class="t m0 x57 h4f yce ff2 fs44 fc0 sc0 ls1 ws1">停止</div><div class="t m0 x41 h4f ycf ff2 fs44 fc0 sc0 ls1 ws1">从地址</div><div class="t m0 x58 h4f yd0 ff2 fs44 fc0 sc0 ls1 ws1">写<span class="_ _12"></span><span class="ff5">(1<span class="_ _12"></span></span>位<span class="_ _12"></span><span class="ff5">)</span></div><div class="t m0 x58 h4f yd1 ff2 fs44 fc0 sc0 ls1 ws1">读<span class="_ _12"></span><span class="ff5">(1<span class="_ _12"></span></span>位<span class="_ _12"></span><span class="ff5">)</span></div><div class="t m0 x59 h4f yd2 ff2 fs44 fc0 sc0 ls1 ws1">串行数据<span class="_ _a"> </span><span class="ff5">(8<span class="_ _12"></span></span>位<span class="_ _12"></span><span class="ff5">)</span></div><div class="t m0 x56 h4f yd3 ff2 fs44 fc0 sc0 ls1 ws1">确认</div><div class="t m0 x5a h4f yd4 ff2 fs44 fc0 sc0 ls1 ws1">非确认</div><div class="t m0 x5b h50 yd5 ff5 fs44 fc0 sc0 ls6f ws1">(7<span class="_ _31"> </span>)</div><div class="t m0 x5c h4f yd6 ff2 fs44 fc0 sc0 ls1 ws1">位</div><div class="t m0 x5d h51 yd7 ff4 fs45 fc0 sc0 ls1 ws1"> </div><div class="t m0 x10 h51 yd8 ff4 fs45 fc0 sc0 ls1 ws1"> </div><div class="t m0 x43 h52 yd9 ff2 fs45 fc0 sc1 ls1 ws1">图<span class="_ _a"> </span><span class="ff6 sc0 ls70">4. <span class="_"> </span></span><span class="ls71">典型的读操作情况</span><span class="ff6 sc0"> </span></div><div class="t m0 xc h53 yda ff4 fs46 fc0 sc0 ls1 ws1"> </div><div class="t m0 xc h51 ydb ff4 fs45 fc0 sc0 ls1 ws1">4<span class="fs47 ls72"> <span class="_ _23"></span><span class="fs45 ls73 wsc">AN013-1.0 <span class="_ _22"></span>MAR01 <span class="fs47 ls74 ws1"> </span></span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/624f986674bc5c010546c1b8/bg5.jpg"><div class="t m0 x1d h14 y58 ff5 fsb fc0 sc0 ls20 ws1">AN013 <span class="_ _13"> </span><span class="ff2 ls1">—<span class="ff5"> <span class="_ _5"> </span></span>用<span class="_ _5"> </span></span><span class="ls21">SMBus<span class="_ _5"> </span><span class="ff2 ls1">实现串行通信<span class="ff4"> </span></span></span></div><div class="t m0 x1e h7 y59 ff4 fs3 fc0 sc0 ls1 ws1"> </div><div class="t m1 x10 h12 ydc ff2 fs9 fc0 sc1 ls18 ws1">总线竞争</div><div class="t m0 x2e h11 ydc ff3 fs8 fc0 sc0 ls1 ws1"> </div><div class="t m0 x10 he ydd ff2 fs2 fc0 sc0 ls1 ws1">如果在同一个<span class="_ _a"> </span><span class="ff4 ls14">SMBus<span class="_"> </span></span>系统中有多个主器件,<span class="_ _32"></span>有可能出现两个主器件同时启动传输过程的情况。</div><div class="t m0 xc he yde ff2 fs2 fc0 sc0 ls1 ws1">如果发生这种情况,总线仲裁机制就会强迫一个器件放弃总线。<span class="ff4"> </span></div><div class="t m0 x10 he ydf ff2 fs2 fc0 sc0 ls1 ws1">总线仲裁机制是什么:<span class="_ _16"></span>两个主器件继续发送过程,<span class="_ _16"></span>直到其中一个试图发送高电平而另一个试图</div><div class="t m0 xc he ye0 ff2 fs2 fc0 sc0 ls1 ws1">发送低电平为止。<span class="_ _14"></span>由于总线是漏极开路的,<span class="_ _14"></span>试图发送低电平的器件将获得总线控制权。<span class="_ _14"></span>发送高电平</div><div class="t m0 xc he ye1 ff2 fs2 fc0 sc0 ls1 ws1">的器件放弃总线,<span class="_ _15"></span>其它器件继续其传输过程。<span class="_ _15"></span>注意,<span class="_ _15"></span>这种总线争用是非破坏性的:<span class="_ _15"></span>总会有一个器件</div><div class="t m0 xc he ye2 ff2 fs2 fc0 sc0 ls1 ws1">赢得总线。<span class="ff4"> </span></div><div class="t m0 x10 he ye3 ff2 fs2 fc0 sc0 ls1 ws1">总线仲裁机制如何工作:假设器件<span class="_ _a"> </span><span class="ff4">X<span class="_"> </span></span>和器件<span class="_ _a"> </span><span class="ff4">Y<span class="_"> </span></span>争用总线。赢得总线的器件<span class="_ _2"> </span><span class="ff4">X<span class="_"> </span></span>不受仲裁机制的</div><div class="t m0 xc he ye4 ff2 fs2 fc0 sc0 ls1 ws1">任何影响。因为数据是在移位寄存器中移出、移入,所以器件<span class="_ _5"> </span><span class="ff4">Y<span class="_ _6"> </span></span>不丢失任何数据。图<span class="_ _5"> </span><span class="ff4">5<span class="_ _6"> </span></span>给出了两</div><div class="t m0 xc he ye5 ff2 fs2 fc0 sc0 ls1 ws1">个器件在总线竞争期间输出时序示例。注意:器件<span class="_ _a"> </span><span class="ff4">Y<span class="_"> </span></span>在放弃总线后开始接收数据。<span class="ff4"> </span></div><div class="t m0 x10 hc ye6 ff4 fs2 fc0 sc0 ls1 ws1"> </div><div class="t m0 x5e h54 ye7 ff5 fs48 fc0 sc0 ls1 ws1">0<span class="_ _33"></span><span class="ls75">11<span class="_ _34"></span>1<span class="_ _35"></span>0<span class="_ _35"></span>1<span class="_ _34"></span>1<span class="_ _35"></span>0</span></div><div class="t m0 x37 h55 ye8 ff5 fs49 fc0 sc0 ls1 ws1">0<span class="_ _33"></span><span class="ls76">11<span class="_ _36"></span>1<span class="_ _35"></span>1</span></div><div class="t m0 x5e h56 ye9 ff5 fs4a fc0 sc0 ls1 ws1">0<span class="_ _33"></span><span class="ls77">11<span class="_ _34"></span>1<span class="_ _35"></span>0<span class="_ _35"></span>1<span class="_ _34"></span>1<span class="_ _35"></span>0</span></div><div class="t m0 x5f h57 yea ff2 fs4b fc0 sc0 ls1 ws1">器件<span class="_ _28"> </span><span class="ff5">X</span></div><div class="t m0 x5f h57 yeb ff2 fs4b fc0 sc0 ls1 ws1">器件<span class="_ _28"> </span><span class="ff5">Y</span></div><div class="t m0 x60 h57 yec ff2 fs4b fc0 sc0 ls1 ws1">总线上的信号</div><div class="t m0 x61 h57 yed ff2 fs4b fc0 sc0 ls1 ws1">器件<span class="_ _28"> </span><span class="ff5">Y</span></div><div class="t m0 x2a h57 yee ff2 fs4b fc0 sc0 ls1 ws1">放弃总线</div><div class="t m0 x5d h58 yef ff4 fs4c fc0 sc0 ls1 ws1"> </div><div class="t m0 x10 h58 yf0 ff4 fs4c fc0 sc0 ls1 ws1"> </div><div class="t m0 x62 h59 yf1 ff2 fs4c fc0 sc1 ls1 ws1">图<span class="_ _a"> </span><span class="ff6 sc0 ls78">5. <span class="_"> </span></span><span class="ls79">总线竞争过程</span><span class="ff6 sc0"> </span></div><div class="t m0 x10 h5a yf2 ff7 fs4d fc0 sc0 ls1 ws1">使用<span class="_ _6"> </span><span class="ff5">SMBus </span></div><div class="t m0 x10 h59 yf3 ff4 fs4c fc0 sc0 ls14 ws1">SMBus<span class="_ _d"> </span><span class="ff2 ls79">可以工作在主和从方式。总<span class="_ _e"></span>线硬件为串行传输提供了时序和移位控制;字节控制<span class="_ _e"></span>是用</span></div><div class="t m0 xc h59 yf4 ff2 fs4c fc0 sc0 ls1 ws1">户定义的。<span class="ff4 ls14">SMBus<span class="_"> </span></span>硬件完成下列与应用无关的任务:<span class="ff4"> </span></div><div class="t m0 x10 h59 yf5 ff2 fs4c fc0 sc0 ls1 ws1">时序控制:<span class="_ _15"></span>在主方式,<span class="_ _9"></span>硬件在<span class="_ _a"> </span><span class="ff4 ls10">SCL<span class="_"> </span></span>上产生时钟信号用来同步<span class="_ _a"> </span><span class="ff4 ls7a">SDA<span class="_"> </span></span>上的<span class="_ _b"></span>数据。<span class="_ _15"></span>硬件还识别超时</div><div class="t m0 xc h59 yf6 ff2 fs4c fc0 sc0 ls1 ws1">和总线错误。<span class="ff4"> </span></div><div class="t m0 x10 h59 yf7 ff2 fs4c fc0 sc0 ls1 ws1">串行数据传输:硬件控制所有在<span class="_ _13"> </span><span class="ff4 ls7b">SD<span class="_ _b"></span>A<span class="_ _13"> </span></span>上移入和移出的数据,包括应答级别。应答级别是用户</div><div class="t m0 xc h59 yf8 ff2 fs4c fc0 sc0 ls1 ws1">定义的,细节在下面的寄存器定义中解释。<span class="ff4"> </span></div><div class="t m0 x10 h59 yf9 ff2 fs4c fc0 sc0 ls1 ws1">从地址识别:<span class="_ _14"></span>硬件能识别来自另一个器件的起始条件,<span class="_ _14"></span>并读取随后的从器件地址。<span class="_ _14"></span>如果从地址</div><div class="t m0 xc h59 yfa ff2 fs4c fc0 sc0 ls1 ws1">与<span class="_ _6"> </span><span class="ff4 ls14">SMBus<span class="_ _24"> </span></span>地址寄存器(下面将定义)中的内容匹配,则硬件应答该地址。注意:只有在<span class="_ _6"> </span><span class="ff4 ls7c">AA</span><span class="ls79">(地</span></div><div class="t m0 xc h59 yfb ff2 fs4c fc0 sc0 ls1 ws1">址应答)被置位时该功能才被允许。<span class="ff4"> </span></div><div class="t m1 x10 h5b yfc ff2 fs4e fc0 sc1 ls7d ws1">配置与控制</div><div class="t m19 x63 h5c yfc ff3 fs4f fc0 sc0 ls1 ws1"> </div><div class="t m19 x10 h59 yfd ff4 fs4c fc0 sc0 ls14 ws1">SMBus<span class="_"> </span><span class="ff2 ls1">的工作由下列寄存器中的内容决定。<span class="ff4"> </span></span></div><div class="t m19 x10 h59 yfe ff6 fs4c fc0 sc0 ls7e ws1">SMB0ST<span class="_ _15"></span>A<span class="ff2 sc1 ls1">。</span><span class="ff4 ls14">SMBus<span class="_"> </span><span class="ff2 ls1">状态寄存器保持着代表<span class="_ _a"> </span></span><span class="ls10">SMBus<span class="_"> </span><span class="ff2 ls1">当前状态的<span class="_ _a"> </span><span class="ff4">8<span class="_"> </span></span>位状态代码。<span class="_ _e"></span>只有在<span class="_ _a"> </span><span class="ff4 ls7b">SI<span class="_"> </span></span>位被</span></span></span></div><div class="t m19 x44 h5d yff ff4 fs50 fc0 sc0 ls7f ws1"> </div><div class="t m19 x45 h58 y100 ff4 fs51 fc0 sc0 ls80 ws1"> <span class="fs4c ls78 wsd"> AN013-1.0 <span class="_ _2d"></span>MAR01<span class="fs51 ls80 ws1"> <span class="fs4c ls1">5<span class="fs51"> </span></span></span></span></div></div><div class="pi" data-data='{"ctm":[1.611639,0.000000,0.000000,1.611639,0.000000,0.000000]}'></div></div>