📄 smbus_8c-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><title>AVR453 Smart Battery Reference Design: smbus.c Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"><link href="tabs.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.5.3 --><div class="tabs"> <ul> <li><a href="main.html"><span>Main Page</span></a></li> <li class="current"><a href="files.html"><span>Files</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> </ul></div><h1>smbus.c</h1><a href="smbus_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* This file has been prepared for Doxygen automatic documentation generation.*/</span><a name="l00027"></a>00027 <span class="comment">// Revision List:</span><a name="l00028"></a>00028 <span class="comment">// June 13, 2005: fixed error in handling receive BLOCK (added use of byte count).</span><a name="l00029"></a>00029 <span class="comment">// June 6, 2005: added clearing of SMLOCK after data successfully sent.</span><a name="l00030"></a>00030 <span class="comment">// June 5, 2005: changed TWBR init value to be 12 instead of 11 to make 100KHz.</span><a name="l00031"></a>00031 <span class="comment">// May 10, 2005: added init of TWBR during Master Transmit mode.</span><a name="l00032"></a>00032 <a name="l00033"></a>00033 <a name="l00034"></a>00034 <a name="l00035"></a>00035 <span class="comment">//#include <pgmspace.h></span><a name="l00036"></a>00036 <span class="preprocessor">#include <inavr.h></span><a name="l00037"></a>00037 <a name="l00038"></a>00038 <a name="l00039"></a><a class="code" href="smbus_8c.html#ae08ff0a047918e0245782dd183dad98">00039</a> <span class="preprocessor">#define MODULE_SMBUS </span><span class="comment">/* ensure that we instantiate our variables in smbus.h */</span><a name="l00040"></a>00040 <span class="preprocessor">#include "<a class="code" href="smbus_8h.html" title="Headerfile for smbus.c.">smbus.h</a>"</span> <span class="comment">//instantiates variables & flash strings</span><a name="l00041"></a>00041 <a name="l00042"></a>00042 <span class="preprocessor">#include "<a class="code" href="timer_8h.html" title="Headerfile for timer.c.">timer.h</a>"</span> <span class="comment">//required for BusFault timer activation</span><a name="l00043"></a>00043 <span class="preprocessor">#include "<a class="code" href="pack_8h.html" title="Battery pack definitions.">pack.h</a>"</span> <span class="comment">//required for a few calculations</span><a name="l00044"></a>00044 <span class="preprocessor">#include "<a class="code" href="analog_8h.html" title="Headerfile for analog.c.">analog.h</a>"</span> <span class="comment">//required for SMBus analog calculations</span><a name="l00045"></a>00045 <span class="preprocessor">#include "<a class="code" href="calibration_8h.html" title="Defines and variables for calibration.">calibration.h</a>"</span> <span class="comment">//required for SMBus analog calculations</span><a name="l00046"></a>00046 <span class="comment">//#include "iom406_320.h"</span><a name="l00047"></a>00047 <span class="preprocessor">#include <iom406.h></span> <span class="comment">// IAR headerfile for Mega406 (EW 410)</span><a name="l00048"></a>00048 <span class="preprocessor">#include "<a class="code" href="interpret_8h.html" title="SMBus Protocol command interpreter.">interpret.h</a>"</span> <span class="comment">// ONLY include this file in THIS module!</span><a name="l00049"></a>00049 <span class="preprocessor">#include "<a class="code" href="main_8h.html" title="Headerfile for main.c.">main.h</a>"</span><a name="l00050"></a>00050 <span class="preprocessor">#include "<a class="code" href="pwrmgmt_8h.html" title="Headerfile for pwrmgmt.c.">pwrmgmt.h</a>"</span><a name="l00051"></a>00051 <a name="l00052"></a>00052 <a name="l00053"></a>00053 <span class="comment">//extern __flash unsigned char SM_Cmd_Table[0x40][2]; //in interpret.c</span><a name="l00054"></a><a class="code" href="smbus_8c.html#916745d77521d46a99ea0095280b5931">00054</a> <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> char (*<a class="code" href="smbus_8c.html#916745d77521d46a99ea0095280b5931">ptr2funcUC_V</a>)(void);<a name="l00055"></a>00055 <span class="keyword">extern</span> <a class="code" href="smbus_8c.html#916745d77521d46a99ea0095280b5931">ptr2funcUC_V</a> <a class="code" href="smbus_8c.html#ebb13d6b6410405e45b00a32d45819c3">SMB_ReadCmd</a>[];<a name="l00056"></a>00056 <span class="keyword">extern</span> <a class="code" href="smbus_8c.html#916745d77521d46a99ea0095280b5931">ptr2funcUC_V</a> <a class="code" href="smbus_8c.html#486a831e66aa5b95cdcc10b47b103525">SMB_WriteCmd</a>[];<a name="l00057"></a>00057 <a name="l00058"></a>00058 <span class="comment">//Internally-needed prototypes</span><a name="l00059"></a>00059 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="bootloader__smbus_8c.html#5f618411d2cdff90205d6d0aa2955f47">FastCRC</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> LastCRC, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> newbyte);<a name="l00060"></a>00060 <span class="comment">//extern unsigned char SMLOCK;</span><a name="l00061"></a>00061 <a name="l00062"></a>00062 <a name="l00063"></a>00063 <span class="comment">//This is used to check for an out-of-bounds SMBus command.</span><a name="l00064"></a><a class="code" href="smbus_8c.html#335910998ef911de0e71a0c1b059e565">00064</a> <span class="preprocessor">#define HIGHEST_SMB_CMD 0x3F</span><a name="l00065"></a>00065 <span class="preprocessor"></span><a name="l00066"></a>00066 <a name="l00067"></a>00067 <span class="comment">//Two-Wire-Interface TWSR (STATUS) values</span><a name="l00068"></a>00068 <span class="comment">//Note that since our Prescale value is 0, we don't need to MASK the Status byte.</span><a name="l00069"></a>00069 <a name="l00070"></a>00070 <span class="comment">// Globally applicable TWI status codes:</span><a name="l00071"></a><a class="code" href="smbus_8c.html#a97cb618d034cb6839032c8bd522c87b">00071</a> <span class="preprocessor">#define TWS_MASK 0xF8 </span><span class="comment">/* Two-Wire Status Mask */</span><a name="l00072"></a><a class="code" href="smbus_8c.html#e7995cec56b63997d9edad281b650815">00072</a> <span class="preprocessor">#define TWS_NSTAT 0xF8 </span><span class="comment">/* No Status Available now */</span><a name="l00073"></a>00073 <a name="l00074"></a>00074 <span class="comment">// MASTER-related Status codes:</span><a name="l00075"></a><a class="code" href="smbus_8c.html#5bee3e494d47b810f24429d69585e967">00075</a> <span class="preprocessor">#define TWS_START 0x08</span><a name="l00076"></a><a class="code" href="smbus_8c.html#5fbf6a86e9983516630dfd218a5633c5">00076</a> <span class="preprocessor"></span><span class="preprocessor">#define TWS_RESTART 0x10</span><a name="l00077"></a><a class="code" href="smbus_8c.html#42b34b4323c0fd4986325ecd815b60b6">00077</a> <span class="preprocessor"></span><span class="preprocessor">#define TWS_WRITE_ACK 0x18 </span><span class="comment">/* sent a SLA+W, got ACK */</span><a name="l00078"></a><a class="code" href="smbus_8c.html#0bafe5aa109b7a5d83fdd5f60ef5b385">00078</a> <span class="preprocessor">#define TWS_WRITE_NAK 0x20 </span><span class="comment">/* sent SLA+W, got NAK */</span><a name="l00079"></a><a class="code" href="smbus_8c.html#8241a83cf96e3888d0e070ca3b05c394">00079</a> <span class="preprocessor">#define TWS_TXDATA_ACK 0x28 </span><span class="comment">/* Data tx'd & was ACK'd */</span><a name="l00080"></a><a class="code" href="smbus_8c.html#c89c7128569b1c3abafd09505163440c">00080</a> <span class="preprocessor">#define TWS_TXDATA_NAK 0x30 </span><span class="comment">/* Data tx'd & was NAK'd */</span><a name="l00081"></a><a class="code" href="smbus_8c.html#f9fbed48fee232c98c76ceeb90089598">00081</a> <span class="preprocessor">#define TWS_LOST_ARB 0x38 </span><span class="comment">/* lost bus arbitration */</span><a name="l00082"></a>00082 <a name="l00083"></a><a class="code" href="smbus_8c.html#167dfada7e84dc4dd575d149b0c22b63">00083</a> <span class="preprocessor">#define TWS_READ_ACK 0x40 </span><span class="comment">/* got ACK from a SLA+R request */</span><a name="l00084"></a><a class="code" href="smbus_8c.html#0fbf23db05a5f381a4a6b43f7c7baa80">00084</a> <span class="preprocessor">#define TWS_READ_NAK 0x48 </span><span class="comment">/* got NAK from a SLA+R request */</span><a name="l00085"></a><a class="code" href="smbus_8c.html#c552dc01f8a59726d48a430d2480beb0">00085</a> <span class="preprocessor">#define TWS_RXDATA_ACK 0x50 </span><span class="comment">/* We rcvd data and ACKd back */</span><a name="l00086"></a><a class="code" href="smbus_8c.html#446dd75365fed815ae7fafce6045a460">00086</a> <span class="preprocessor">#define TWS_RXDATA_NACK 0x58 </span><span class="comment">/* We rcvd data and we NACKd back */</span><a name="l00087"></a>00087 <a name="l00088"></a>00088 <a name="l00089"></a>00089 <span class="comment">// SLAVE-related Status codes:</span><a name="l00090"></a><a class="code" href="smbus_8c.html#13ec926035138d61a7e90193645942ee">00090</a> <span class="preprocessor">#define TWS_SLA_W 0x60 </span><span class="comment">/* Got SLA + Write */</span><a name="l00091"></a><a class="code" href="smbus_8c.html#56a6f2a019fcb0f004ad6a8619fd9b3f">00091</a> <span class="preprocessor">#define TWS_SLA_R 0xA8 </span><span class="comment">/* Got SLA + Read */</span><a name="l00092"></a><a class="code" href="smbus_8c.html#be4452976a52cc5e091f32ead12669ce">00092</a> <span class="preprocessor">#define TWS_RDATA 0x80 </span><span class="comment">/* Got a data byte */</span><a name="l00093"></a><a class="code" href="smbus_8c.html#494d83524c0a35a9680f8abf43538088">00093</a> <span class="preprocessor">#define TWS_RCMD 0x80 </span><span class="comment">/* Got a command byte */</span><a name="l00094"></a><a class="code" href="smbus_8c.html#ea29a640c276fdaea02372a2c1ac5f78">00094</a> <span class="preprocessor">#define TWS_RSTOP 0xA0 </span><span class="comment">/* Got a Stop */</span><a name="l00095"></a><a class="code" href="smbus_8c.html#6ab2d53631ce164e3cd5fb1d1d1658ab">00095</a> <span class="preprocessor">#define TWS_REPEAT 0xA0 </span><span class="comment">/* Got a Repeated-Start */</span><a name="l00096"></a><a class="code" href="smbus_8c.html#69333e59f4e48bd3130a871152cc17ae">00096</a> <span class="preprocessor">#define TWS_RACK 0xB8 </span><span class="comment">/* Send a data byte and got an ACK back */</span><a name="l00097"></a><a class="code" href="smbus_8c.html#d3a2ba13b4f5c4ccac0d9d5a67a08c9c">00097</a> <span class="preprocessor">#define TWS_RNAK 0xC0 </span><span class="comment">/* Sent a data byte and got a NAK back */</span><a name="l00098"></a><a class="code" href="smbus_8c.html#bbcbb34c39f265e9f1e6c9872d94ad4a">00098</a> <span class="preprocessor">#define TWS_FINAL 0xC8 </span><span class="comment">/* Sent the final byte, got ACK back */</span><a name="l00099"></a><a class="code" href="smbus_8c.html#8c024ae4ce59e738c0c2fb18b46b0d5c">00099</a> <span class="preprocessor">#define TWS_BERR 0x00 </span><span class="comment">/* Saw a Bus Error */</span><a name="l00100"></a>00100 <a name="l00101"></a>00101 <a name="l00102"></a>00102 <span class="comment">// Two-Wire CONTROL values</span><a name="l00103"></a>00103 <a name="l00104"></a><a class="code" href="smbus_8c.html#bf6a65c1680e0edd146211861c8c5553">00104</a> <span class="preprocessor">#define TWC_GO 0x85 </span><span class="comment">/* clr TWINT; assert ENA & IntEna */</span><a name="l00105"></a><a class="code" href="smbus_8c.html#02ae11063bed552cd7eb5f7ef9a2f7b9">00105</a> <span class="preprocessor">#define TWC_READ_NoACK 0x85 </span><span class="comment">/* read a byte, but don't ACK when done */</span><a name="l00106"></a><a class="code" href="smbus_8c.html#d7ec9502e19df2e84ec22c9d4969bb4d">00106</a> <span class="preprocessor">#define TWC_START 0xA5 </span><span class="comment">/* send START bit, assert ENA & IntEna */</span><a name="l00107"></a><a class="code" href="smbus_8c.html#6a0336e7346cd3b7841f100fa7fcd458">00107</a> <span class="preprocessor">#define TWC_STOP 0x94 </span><span class="comment">/* leave INT *DISabled* when done */</span><a name="l00108"></a><a class="code" href="smbus_8c.html#04331a8125354510652ba96cf5ef2afa">00108</a> <span class="preprocessor">#define TWC_RESTART 0xB5 </span><span class="comment">/* send STOP, then START again; INT ena */</span><a name="l00109"></a>00109 <a name="l00110"></a>00110 <a name="l00111"></a>00111 <span class="comment">/* ************************************************************************* */</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -