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

📄 smbus_8c-source.html

📁 用AVR453开发的电池保护板的C语言程序,希望对大家有用!
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<a name="l00412"></a>00412       {<a name="l00413"></a>00413         <a class="code" href="bootldr_8h.html#c7f9993307a3c3559f56d0353613de62">SMBvariables</a>[<a class="code" href="bootldr_8h.html#8b71774d964d8895ae3091bcb40bf2fe">SMBV_BattStatus</a>][<a class="code" href="bootldr_8h.html#7341bfdcbd33f530cc0b75d2e62358cc">lobyte</a>] |= <a class="code" href="bootldr_8h.html#2bdc5a6b268dc4322b1f032918629a0b">SMBerr_UnknownError</a>;<a name="l00414"></a>00414         <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">//generate a bus timeout.</span><a name="l00415"></a>00415         TWCR = (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);           <span class="comment">//disable int, and DON'T clear the TWINT flag!</span><a name="l00416"></a>00416         <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>;                  <span class="comment">//Reset the state machine.</span><a name="l00417"></a>00417         <span class="keywordflow">return</span>;<a name="l00418"></a>00418       }<a name="l00419"></a>00419       TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWIE);    <span class="comment">//must re-enable ACKing</span><a name="l00420"></a>00420       <span class="keywordflow">break</span>;<a name="l00421"></a>00421 <a name="l00422"></a>00422     <span class="keywordflow">case</span> <a class="code" href="smbus_8c.html#df764cbdea00d65edcd07bb9953ad2b7ce05baed30278f132f7d9d27a502e7a0">TW_Wait4Stop</a>:<a name="l00423"></a>00423       <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="l00424"></a>00424       {<a name="l00425"></a>00425         TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWIE);  <span class="comment">//must re-enable ACKing</span><a name="l00426"></a>00426         <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>;                  <span class="comment">//Reset the state machine.</span><a name="l00427"></a>00427       }<a name="l00428"></a>00428       <span class="keywordflow">else</span><a name="l00429"></a>00429         TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWIE);      <span class="comment">//must NOT re-enable ACKing yet!</span><a name="l00430"></a>00430       <span class="keywordflow">break</span>;<a name="l00431"></a>00431 <a name="l00432"></a>00432 <a name="l00433"></a>00433     <span class="comment">//SLAVE-mode states follow.</span><a name="l00434"></a>00434 <a name="l00435"></a>00435     <span class="keywordflow">case</span> <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b94d13a4b6be6ef4404b13908d933e1ad">TW_Wait4Cmd</a>:   <span class="comment">//upon entry, we expect to have received a Cmd byte.</span><a name="l00436"></a>00436       <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="l00437"></a>00437       {<a name="l00438"></a>00438         tmp = TWDR;<a name="l00439"></a>00439         <span class="keywordflow">if</span>(tmp &lt;= <a class="code" href="bootloader__smbus_8c.html#335910998ef911de0e71a0c1b059e565">HIGHEST_SMB_CMD</a>)      <span class="comment">//Is the Cmd within valid range?</span><a name="l00440"></a>00440         {<a name="l00441"></a>00441           <a class="code" href="smbus_8c.html#50d57ab7cb03b10099411f378522dadd">CurrentCmd</a> = tmp;             <span class="comment">//Save a copy.</span><a name="l00442"></a>00442           tmp = <a class="code" href="interpret_8h.html#98f76d05b9eb74053793b1fc1835b663">SM_Cmd_Table</a>[tmp][0];   <span class="comment">//Grab the Command Characteristics/Features flags.</span><a name="l00443"></a>00443           <span class="keywordflow">if</span>(tmp &amp; <a class="code" href="interpret_8h.html#3ffa90cb904c7f395662aa7573e79b4f">SMBslave</a>)            <span class="comment">//Is the Command valid for Slaves?</span><a name="l00444"></a>00444           {                             <span class="comment">//The command appears to be valid.</span><a name="l00445"></a>00445             TWISR_CmdFeatures = tmp;    <span class="comment">//Save the Feature flags for use in Wait4RW state.</span><a name="l00446"></a>00446             <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bbc8bda251da4d6aae1c2bfb2900c1444">TW_Wait4RW</a>;   <span class="comment">//set up next state</span><a name="l00447"></a>00447             TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWIE);      <span class="comment">//enable ACKing</span><a name="l00448"></a>00448             <span class="keywordflow">return</span>;<a name="l00449"></a>00449           }<a name="l00450"></a>00450         }<a name="l00451"></a>00451       }<a name="l00452"></a>00452       <span class="comment">//In all cases except those that 'return' (above), it's an error.</span><a name="l00453"></a>00453       <a class="code" href="bootldr_8h.html#c7f9993307a3c3559f56d0353613de62">SMBvariables</a>[<a class="code" href="bootldr_8h.html#8b71774d964d8895ae3091bcb40bf2fe">SMBV_BattStatus</a>][<a class="code" href="bootldr_8h.html#7341bfdcbd33f530cc0b75d2e62358cc">lobyte</a>] |= <a class="code" href="bootldr_8h.html#2bdc5a6b268dc4322b1f032918629a0b">SMBerr_UnknownError</a>;<a name="l00454"></a>00454       <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">//generate a bus timeout.</span><a name="l00455"></a>00455       TWCR = (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);     <span class="comment">//disable int, and DON'T clear the TWINT flag!</span><a name="l00456"></a>00456       <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>;            <span class="comment">//Reset the state machine.</span><a name="l00457"></a>00457       <span class="keywordflow">return</span>;<a name="l00458"></a>00458 <span class="comment">//    break;</span><a name="l00459"></a>00459 <a name="l00460"></a>00460 <a name="l00461"></a>00461     <span class="keywordflow">case</span> <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bbc8bda251da4d6aae1c2bfb2900c1444">TW_Wait4RW</a>:    <span class="comment">//We will now find out if we will RX more, or we need to TX a reply instead.</span><a name="l00462"></a>00462       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#be4452976a52cc5e091f32ead12669ce">TWS_RDATA</a> == Status)           <span class="comment">//It is a WRITE-type command. Prep the RX buffer to accept more data.</span><a name="l00463"></a>00463       { <span class="comment">//NOTE: except for OptionalMfgFunction5, all WRITE cmds are 2-byte, plus optional PEC.</span><a name="l00464"></a>00464         <span class="comment">//Place all bytes of the transaction into the buffer so we can do a PEC on it if needed.</span><a name="l00465"></a>00465         <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[0] = TWAR &amp; 0xFE;      <span class="comment">//store everything incl. the slave address for computing PEC.</span><a name="l00466"></a>00466         <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[1] = <a class="code" href="smbus_8c.html#50d57ab7cb03b10099411f378522dadd">CurrentCmd</a>;       <span class="comment">//store the previously-send Command.</span><a name="l00467"></a>00467         <a class="code" href="bootloader__smbus_8c.html#49479463989e8f9b15cb6aa66d0667e7">TW_RxBuf</a>[2] = TWDR;             <span class="comment">//store this first DATA byte</span><a name="l00468"></a>00468         <a class="code" href="bootloader__smbus_8c.html#98071e48f8969fdd79e1fa2337d0b6dd">TW_RxBufIndex</a> = 3;              <span class="comment">//use RxBufIndex as the index to store data in the buffer.</span><a name="l00469"></a>00469         <span class="keywordflow">if</span>(TWISR_CmdFeatures &amp; <a class="code" href="interpret_8h.html#1200a2673b359fcd7568b69b684cc625">SCWW</a>)    <span class="comment">//is it a Write-WORD command type?</span><a name="l00470"></a>00470         {<a name="l00471"></a>00471             <a class="code" href="bootloader__smbus_8c.html#d200369e2af9e1b8a915e2e856190208">TW_RxBufCnt</a> = 1;            <span class="comment">//We expect 1 more data byte, and possibly PEC after that.</span><a name="l00472"></a>00472         }<a name="l00473"></a>00473         <span class="keywordflow">else</span><a name="l00474"></a>00474         <span class="keywordflow">if</span>(TWISR_CmdFeatures &amp; <a class="code" href="interpret_8h.html#fb396475fb3fa7a935530e516e420c76">SCWG</a>)    <span class="comment">//is it a write-BLOCK command (must be OptionalMfgFunction5 then)</span><a name="l00475"></a>00475         {<a name="l00476"></a>00476           tmp = TWDR;<a name="l00477"></a>00477           <span class="keywordflow">if</span>((tmp &gt;= 1) &amp;&amp; (tmp &lt;= 32))<a name="l00478"></a>00478             <a class="code" href="bootloader__smbus_8c.html#d200369e2af9e1b8a915e2e856190208">TW_RxBufCnt</a> = TWDR;<a name="l00479"></a>00479           <span class="keywordflow">else</span><a name="l00480"></a>00480           {<a name="l00481"></a>00481             <a class="code" href="bootldr_8h.html#c7f9993307a3c3559f56d0353613de62">SMBvariables</a>[<a class="code" href="bootldr_8h.html#8b71774d964d8895ae3091bcb40bf2fe">SMBV_BattStatus</a>][<a class="code" href="bootldr_8h.html#7341bfdcbd33f530cc0b75d2e62358cc">lobyte</a>] |= <a class="code" href="bootldr_8h.html#4a42c77a65eb6185d98043e9a9e0bf64">SMBerr_BadSize</a>;<a name="l00482"></a>00482             <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">//generate a bus timeout.</span><a name="l00483"></a>00483             TWCR = (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);       <span class="comment">//disable int, and DON'T clear the TWINT flag!</span><a name="l00484"></a>00484             <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>;              <span class="comment">//Reset the state machine.</span><a name="l00485"></a>00485             <span class="keywordflow">return</span>;<a name="l00486"></a>00486           }<a name="l00487"></a>00487         }<a name="l00488"></a>00488         <span class="keywordflow">else</span>    <span class="comment">//this Command doesn't allow EITHER word OR group/block Writes! It's Read-only!</span><a name="l00489"></a>00489         {<a name="l00490"></a>00490           <a class="code" href="bootldr_8h.html#c7f9993307a3c3559f56d0353613de62">SMBvariables</a>[<a class="code" href="bootldr_8h.html#8b71774d964d8895ae3091bcb40bf2fe">SMBV_BattStatus</a>][<a class="code" href="bootldr_8h.html#7341bfdcbd33f530cc0b75d2e62358cc">lobyte</a>] |= <a class="code" href="bootldr_8h.html#57b202debe9843681ec52b63736308ed">SMBerr_AccessDenied</a>;<a name="l00491"></a>00491           <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">//Not a WRITE-type cmd, so generate a bus timeout.</span><a name="l00492"></a>00492           TWCR = (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN);         <span class="comment">//disable int, and DON'T clear the TWINT flag!</span><a name="l00493"></a>00493           <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55bb2ed574d9e01f56cd38bf441a8085640">TW_IDLE</a>;                <span class="comment">//Reset the state machine.</span><a name="l00494"></a>00494           <span class="keywordflow">return</span>;<a name="l00495"></a>00495         }<a name="l00496"></a>00496         <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55be4714c204fd9c4052ca3208a63493baa">TW_Wait4Data</a>;<a name="l00497"></a>00497         TWCR = (1&lt;&lt;TWINT) | (1&lt;&lt;TWEA) | (1&lt;&lt;TWEN) | (1&lt;&lt;TWIE);  <span class="comment">//enable ACKing</span><a name="l00498"></a>00498       }<a name="l00499"></a>00499       <span class="keywordflow">else</span><a name="l00500"></a>00500       <span class="keywordflow">if</span>(<a class="code" href="bootloader__smbus_8c.html#6ab2d53631ce164e3cd5fb1d1d1658ab">TWS_REPEAT</a> == Status)  <span class="comment">//We saw a re-Start, so must be getting ready for a Read cmd.</span><a name="l00501"></a>00501       { <span class="comment">//Must now interpret previously-sent CurrentCmd &amp; set up Reply data.</span><a name="l00502"></a>00502         <span class="keywordflow">if</span>(TWISR_CmdFeatures &amp; (<a class="code" href="interpret_8h.html#a85af9d88231ee9fe08e31e03ba2d11b">SCRW</a> | <a class="code" href="interpret_8h.html#f5e6b90ad1abedbf1c8b369dca830d8a">SCRG</a>))   <span class="comment">//Is it a 'ReadWord' or 'ReadGroup' command type?</span><a name="l00503"></a>00503         {<a name="l00504"></a>00504           <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">//Foreground decoder will set up TWCR.</span><a name="l00505"></a>00505           <a class="code" href="smbus_8c.html#6fd44d05795c577681c33fe2f105300c">TWISR_state</a> = <a class="code" href="bootloader__smbus_8c.html#06fc87d81c62e9abb8790b6e5713c55b83d27cae0915c8a8002877623dcb0dc9">TW_ReplyData</a>;           <span class="comment">//Move to next state.</span><a name="l00506"></a>00506         }<a name="l00507"></a>00507         <span class="keywordflow">else</span><a name="l00508"></a>00508         {<a name="l00509"></a>00509           <a class="code" href="bootldr_8h.html#c7f9993307a3c3559f56d0353613de62">SMBvariables</a>[<a class="code" href="bootldr_8h.html#8b71774d964d8895ae3091bcb40bf2fe">SMBV_BattStatus</a>][<a class="code" href="bootldr_8h.html#7341bfdcbd33f530cc0b75d2e62358cc">lobyte</a>] |= <a class="code" href="bootldr_8h.html#2bdc5a6b268dc4322b1f032918629a0b">SMBerr_UnknownError</a>;<a name="l00510"></a>00510           <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">//Not a READ-type cmd,

⌨️ 快捷键说明

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