⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bootloader__smbus_8c-source.html

📁 用AVR453开发的电池保护板的C语言程序,希望对大家有用!
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00457"></a>00457 <a name="l00458"></a><a class="code" href="bootloader__smbus_8c.html#6288eba0f8e8ad3ab1544ad731eb7667">00458</a> <span class="keywordtype">void</span> <a class="code" href="bootloader__smbus_8c.html#6288eba0f8e8ad3ab1544ad731eb7667">main</a>(<span class="keywordtype">void</span>)<a name="l00459"></a>00459 {<a name="l00460"></a>00460   <a class="code" href="bootloader__smbus_8c.html#032b86b5f939827a0002366ac7fc8bec">init_boot</a>();<a name="l00461"></a>00461 <a name="l00462"></a>00462   <span class="keywordflow">for</span>(;;)<a name="l00463"></a>00463   {<a name="l00464"></a>00464 <a name="l00465"></a>00465 <span class="preprocessor">#ifdef ENABLE_TESTCODE</span><a name="l00466"></a>00466 <span class="preprocessor"></span>    TestManager();<a name="l00467"></a>00467 <span class="preprocessor">#endif</span><a name="l00468"></a>00468 <span class="preprocessor"></span><a name="l00469"></a>00469     <span class="keywordflow">if</span>(TWCR &amp; (1&lt;&lt;TWINT))                       <span class="comment">//Note that the TWI handler is POLLED in the BootLoader.</span><a name="l00470"></a>00470       <a class="code" href="bootloader__smbus_8c.html#58df858fee5f740965467ecca7c82509">TWI_handler</a>();<a name="l00471"></a>00471 <a name="l00472"></a>00472     <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a>)<a name="l00473"></a>00473     {<a name="l00474"></a>00474       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> == <a class="code" href="bootloader__smbus_8c.html#1fef3300524ef987fa146cc892813b20">SMB_SetUpReply</a>)        <span class="comment">/* Have Foreground set up TW_TxBuf[]. */</span><a name="l00475"></a>00475       {<a name="l00476"></a>00476         <a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> = 0;<a name="l00477"></a>00477         <a class="code" href="bootloader__smbus_8c.html#3ca104d2814c6ccf28810b616cc05ed2">SMB_Reply</a>();<a name="l00478"></a>00478       }<a name="l00479"></a>00479       <span class="keywordflow">else</span><a name="l00480"></a>00480       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> == <a class="code" href="bootloader__smbus_8c.html#07b00aac11ba389d5b53e2f9d54bd0bd">SMB_GotCmdData</a>)<a name="l00481"></a>00481       {<a name="l00482"></a>00482         <a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> = 0;<a name="l00483"></a>00483         <a class="code" href="bootloader__smbus_8c.html#bee976a1ba64bc7089b0d73ea432900e">SMB_CmdInterpreter</a>();<a name="l00484"></a>00484       }<a name="l00485"></a>00485       <span class="keywordflow">else</span><a name="l00486"></a>00486       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> == <a class="code" href="bootloader__smbus_8c.html#75ae04e7aaa973e59f86209a3e8f7d3c">SMB_GenBusTimeout</a>)     <span class="comment">/* Tell Foreground to generate a bus timeout, as we saw an error! */</span><a name="l00487"></a>00487       {<a name="l00488"></a>00488         <a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> = 0;<a name="l00489"></a>00489         <a class="code" href="bootloader__smbus_8c.html#ca63a36687837bf3be196ecb830f8488">SMB_BusTimeout</a>();<a name="l00490"></a>00490       }<a name="l00491"></a>00491     }<a name="l00492"></a>00492 <a name="l00493"></a>00493     <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#f33d081c122ae07ed5bc40dde462f294">LoopFlag</a>)                                <span class="comment">/* handle a repeated SLOW memory operation off-line */</span><a name="l00494"></a>00494       <a class="code" href="bootloader__smbus_8c.html#b2877bccb3f42d66ebf4f3eafc283789">LoopMemory</a>();<a name="l00495"></a>00495   }<a name="l00496"></a>00496 }<a name="l00497"></a>00497 <a name="l00498"></a>00498 <a name="l00499"></a>00499 <a name="l00500"></a>00500 <a name="l00501"></a>00501 <a name="l00502"></a>00502 <a name="l00503"></a>00503 <a name="l00504"></a>00504 <a name="l00505"></a>00505 <a name="l00506"></a>00506 <a name="l00507"></a>00507 <span class="comment">/* *************************************************************************</span><a name="l00508"></a>00508 <span class="comment"> *</span><a name="l00509"></a>00509 <span class="comment"> *   Low-Level SMBus Communications State Machine</span><a name="l00510"></a>00510 <span class="comment"> *</span><a name="l00511"></a>00511 <span class="comment"> ************************************************************************* */</span><a name="l00512"></a>00512 <a name="l00513"></a>00513 <span class="comment">//unsigned char TW_state = TW_IDLE;     //state variable</span><a name="l00514"></a>00514 <a name="l00515"></a>00515 <span class="comment">//State Machine states</span><a name="l00516"></a><a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bbc8bda251da4d6aae1c2bfb2900c1444">00516</a> <span class="keyword">enum</span> <span class="comment">/*TW_State*/</span> {<a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>=0, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b94d13a4b6be6ef4404b13908d933e1ad">TW_Wait4Cmd</a>, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bbc8bda251da4d6aae1c2bfb2900c1444">TW_Wait4RW</a>, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55be4714c204fd9c4052ca3208a63493baa">TW_Wait4Data</a>, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b83d27cae0915c8a8002877623dcb0dc9">TW_ReplyData</a>, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bd258cb231677f6a95dcf1c9f239e2b36">TW_MSLA_W</a>, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b2166c37a639d0f299b5195aa8672bd41">TW_MCMD_W</a>, <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b5e645a72fc9d3ddf3f193019985ffab5">TW_MDATA_W</a> };<a name="l00517"></a>00517 <a name="l00518"></a><a class="code" href="bootloader__smbus_8c.html#58df858fee5f740965467ecca7c82509">00518</a> <span class="keywordtype">void</span> <a class="code" href="bootloader__smbus_8c.html#58df858fee5f740965467ecca7c82509">TWI_handler</a>(<span class="keywordtype">void</span>)<a name="l00519"></a>00519 {<a name="l00520"></a>00520   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="bootloader__smbus_8c.html#5eb4c6bfb0fa42aab6bbd6d25337fd6f">Status</a>;<a name="l00521"></a>00521 <a name="l00522"></a>00522   Status = TWSR &amp; 0xF8;         <span class="comment">//This identifies what caused the interrupt to fire.</span><a name="l00523"></a>00523 <a name="l00524"></a>00524   <span class="keywordflow">switch</span>(<a class="code" href="bootloader__smbus_8c.html#92d370ad8db899645afdd375ba4a8130">TW_state</a>)<a name="l00525"></a>00525   {<a name="l00526"></a>00526     <span class="keywordflow">default</span>:<a name="l00527"></a>00527     <span class="keywordflow">case</span> <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>:       <span class="comment">//If not SLA_W or RSTOP, is an error!</span><a name="l00528"></a>00528       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#13ec926035138d61a7e90193645942ee">TWS_SLA_W</a> == Status)   <span class="comment">// saw Slave address match with a Write bit</span><a name="l00529"></a>00529       {<a name="l00530"></a>00530         <a class="code" href="bootloader__smbus_8c.html#92d370ad8db899645afdd375ba4a8130">TW_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b94d13a4b6be6ef4404b13908d933e1ad">TW_Wait4Cmd</a>;<a name="l00531"></a>00531       }<a name="l00532"></a>00532       <span class="keywordflow">else</span><a name="l00533"></a>00533       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#ea29a640c276fdaea02372a2c1ac5f78">TWS_RSTOP</a> == Status)   <span class="comment">//Saw a Stop, possibly left over from previous cmd.</span><a name="l00534"></a>00534       {<a name="l00535"></a>00535          ;                      <span class="comment">//Everything is probably OK.  Take no action.</span><a name="l00536"></a>00536       }<a name="l00537"></a>00537       <span class="keywordflow">else</span> <span class="comment">//had some type of error!</span><a name="l00538"></a>00538       {<a name="l00539"></a>00539         <a class="code" href="bootloader__smbus_8c.html#72f0b2eb64dd62ffa6bb85ef96947543">TWI_CmdFlags</a> = <a class="code" href="bootloader__smbus_8c.html#75ae04e7aaa973e59f86209a3e8f7d3c">SMB_GenBusTimeout</a>;       <span class="comment">//Flag the error &amp; stay in this state.</span><a name="l00540"></a>00540         TWCR = (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);         <span class="comment">//disable int, and DON'T clear the TWINT flag!</span><a name="l00541"></a>00541         <span class="keywordflow">return</span>;<a name="l00542"></a>00542       }<a name="l00543"></a>00543       TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);        <span class="comment">//must re-enable ACKing</span><a name="l00544"></a>00544       <span class="keywordflow">break</span>;<a name="l00545"></a>00545 <a name="l00546"></a>00546 <a name="l00547"></a>00547     <span class="comment">//SLAVE-mode states follow.</span><a name="l00548"></a>00548 <a name="l00549"></a>00549     <span class="keywordflow">case</span> <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b94d13a4b6be6ef4404b13908d933e1ad">TW_Wait4Cmd</a>:   <span class="comment">//upon entry, we've expect to have received a Cmd byte.</span><a name="l00550"></a>00550       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#494d83524c0a35a9680f8abf43538088">TWS_RCMD</a> == Status)            <span class="comment">//It appears that we have received a Command byte now.</span><a name="l00551"></a>00551       {<a name="l00552"></a>00552         <span class="keywordflow">if</span>(<a class="code" href="bootldr_8h.html#9dd30d0b984c0e74c658139d03452540">SMBV_Opt5</a> == TWDR)<a name="l00553"></a>00553         {<a name="l00554"></a>00554           <a class="code" href="bootloader__smbus_8c.html#92d370ad8db899645afdd375ba4a8130">TW_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bbc8bda251da4d6aae1c2bfb2900c1444">TW_Wait4RW</a>;        <span class="comment">//set up next state</span><a name="l00555"></a>00555           TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);    <span class="comment">//enable ACKing</span><a name="l00556"></a>00556           <span class="keywordflow">return</span>;<a name="l00557"></a>00557         }<a name="l00558"></a>00558       }<a name="l00559"></a>00559       <span class="comment">//In all c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -