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

📄 mmc_8c-source.html

📁 MP3播放器源代码, VS1003B
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00192   ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[10]);00193   ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[11]);00194   ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[12]);00195   ConsolePutHex8(<a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[13]);00196 00197   <span class="comment">//mediaSerialNumber[0] = diskSect.raw.buf[10];</span>00198   <span class="comment">//mediaSerialNumber[1] = diskSect.raw.buf[11];</span>00199   <span class="comment">//mediaSerialNumber[2] = diskSect.raw.buf[12];</span>00200   <span class="comment">//mediaSerialNumber[3] = diskSect.raw.buf[13];</span>00201 00202   ConsolePutChar(<span class="charliteral">'\r'</span>);00203   00204   <span class="comment">/* print out card ident register</span>00205 <span class="comment">  for (c=0; c&lt;30; c++){</span>00206 <span class="comment">    if ((c&amp;0x03)==0) ConsolePutChar(' ');</span>00207 <span class="comment">    ConsolePutHex8(diskSect.raw.buf[c]);</span>00208 <span class="comment">  }</span>00209 <span class="comment">  */</span>00210 00211   <span class="keywordflow">return</span> 0; <span class="comment">/* All OK return */</span>00212 }00213 00214 00215 <a name="l00217"></a><a class="code" href="mmc_8c.html#a4">00217</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="mmc_8c.html#a4">RebootMMC</a>(){00218   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c;00219 00220   <span class="comment">//Try (indefinitely) to switch on the MMC card</span>00221   <span class="keywordflow">do</span>{00222     <a class="code" href="board_8h.html#a50">SPI8Clocks</a>(8);      00223     <span class="comment">/* MMC Don't use CRC - seems to be required by some MMC cards? */</span>00224     <a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x7B,0,0,0,0);00225     <span class="comment">/* MMC Init, command 0x40 should return 0x01 (idle) if all is ok. */</span>00226   }<span class="keywordflow">while</span> (<a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x40,0,0,0,0)!=0x01);00227   <span class="comment">// 0x01(idle) response detected.</span>00228   00229   ConsoleWrite(<span class="stringliteral">"Card found, starting... "</span>);00230   <span class="comment">/*Try max 255 times MMC Wake-up call: set to Not Idle (mmc returns 0x00)*/</span>00231   c=255;00232   <span class="keywordflow">while</span> ((c--)&amp;&amp;(<a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x41,0,0,0,16))){00233     <a class="code" href="board_8h.html#a51">Delay</a>(10);00234     <span class="keywordflow">if</span> (c==1){00235       <span class="comment">//timeout</span>00236       ConsoleWrite(<span class="stringliteral">"Failed.\r"</span>);00237       <span class="keywordflow">return</span> 2; <span class="comment">/* Not able to power up mmc */</span>00238     }00239   }00240 00241   ConsoleWrite(<span class="stringliteral">"Ok.\r"</span>);00242   <span class="keywordflow">return</span> 0;00243 }00244 00245 <a name="l00246"></a><a class="code" href="mmc_8h.html#a1">00246</a> <a class="code" href="board_8h.html#a47">Public</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="mmc_8c.html#a5">InitMMC</a>(){00247   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c;00248 00249   <span class="comment">//Switch off the MMC power supply</span>00250   <a class="code" href="board_8h.html#a28">MMC_OFF</a> = <a class="code" href="board_8h.html#a26">YES</a>; 00251 00252   ConsoleWrite (<span class="stringliteral">"Init: MMC\r"</span>);00253   <a class="code" href="board_8h.html#a51">Delay</a>(100);00254 00255   <span class="comment">//Switch on the MMC power supply</span>00256   <a class="code" href="board_8h.html#a28">MMC_OFF</a> = <a class="code" href="board_8h.html#a27">NO</a>;00257   <a class="code" href="board_8h.html#a51">Delay</a>(100);00258 00259   <a class="code" href="board_8h.html#a32">MMCSelect</a>();00260   <span class="comment">/* Allow MMC some time and clock cycles to reset */</span>00261   <span class="keywordflow">for</span> (c=0; c&lt;200; c++){    00262     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00263     <a class="code" href="board_8h.html#a43">SPIWait</a>();00264   }00265   <a class="code" href="board_8h.html#a51">Delay</a>(20);00266 00267   <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#a4">RebootMMC</a>()) <span class="keywordflow">return</span> 1; <span class="comment">//not able to powerup;</span>00268   <span class="comment">//An existing MMC card should be able to respond now.</span>00269 00270   <a class="code" href="mmc_8c.html#a3">GetStorageInformation</a>();00271   00272   <span class="comment">/* Set Block Size of 512 bytes (2 == 512 &lt;&lt; 8) */</span>00273   <span class="keywordflow">if</span> ((c=<a class="code" href="mmc_8c.html#a0">MmcCommand</a>(0x50,0,0,2,0))) <span class="keywordflow">return</span> c|0x80; <span class="comment">/* blocksize error */</span>00274   00275   <span class="comment">/* Check if MMC supports interrupted data transfer */</span>00276   <span class="comment">/* This does a simple checksum check to see if interrupted and </span>00277 <span class="comment">   * non-interrupted read blocks are the same. */</span>00278   <span class="comment">/* This could be a function, so it is in braces for clarity purposes */</span>00279   {  00280     <span class="keywordflow">if</span> (<a class="code" href="mmc_8h.html#a2">SeekSector</a>(0)) <span class="keywordflow">return</span> 2; <span class="comment">//Storage powerup failure    </span>00281     <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#a9">ReadPhysicalSector</a>()) <span class="keywordflow">return</span> 2; <span class="comment">//Storage powerup failure</span>00282 00283     <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> = <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[511];00284     <span class="keywordflow">for</span> (c=0; c&lt;250; c++){00285       <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> += <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[c];00286     }00287     00288     <span class="keywordflow">if</span> (<a class="code" href="mmc_8h.html#a2">SeekSector</a>(0)) <span class="keywordflow">return</span> 2;<span class="comment">//Storage powerup failure</span>00289     00290     <span class="comment">/* Send some extra SPI clocks */</span>00291     <a class="code" href="board_8h.html#a33">MMCDeselect</a>();00292     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00293     <span class="keywordflow">for</span> (c=0; c&lt;100; c++){00294       <a class="code" href="board_8h.html#a44">SPIPutChar</a>(0xff);00295     }00296     <a class="code" href="board_8h.html#a43">SPIWait</a>();00297     00298     <span class="keywordflow">if</span> (<a class="code" href="mmc_8c.html#a9">ReadPhysicalSector</a>()){00299       ConsoleWrite(<span class="stringliteral">"Interrupted read failed.\r"</span>);00300       ConsoleWrite(<span class="stringliteral">"Using compatibility mode.\r"</span>);00301       <span class="keywordflow">return</span> 0x0e; <span class="comment">//ok but no support for seek-before-read</span>00302       00303     }<span class="keywordflow">else</span>{00304       <span class="comment">//Check if received data was same</span>00305       <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> -= <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[511];00306       <span class="keywordflow">for</span> (c=0; c&lt;250; c++){00307         <a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a> -= <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>[c];00308       }00309     }00310     00311     <span class="keywordflow">if</span> (<a class="code" href="board_8c.html#a0">temp</a>.<a class="code" href="unionTemp.html#o1">i</a>) { <span class="comment">/* Checksum does not match */</span>00312       ConsoleWrite(<span class="stringliteral">"This MMC has no support for interrupted read. "</span>);00313       ConsoleWrite(<span class="stringliteral">"Using compatibility mode.\r"</span>);00314       <span class="keywordflow">return</span> 0x0e; <span class="comment">//ok but no support for seek-before-read</span>00315     }00316     00317     ConsoleWrite(<span class="stringliteral">"\rInitMMC ok.\r"</span>);00318   }00319 00320   <span class="comment">/* All OK return */</span>00321   <span class="keywordflow">return</span> 0; <span class="comment">//ok and MMC supports seek-before-read</span>00322 00323 }00324 00325 <a name="l00330"></a><a class="code" href="mmc_8c.html#a6">00330</a> <span class="keywordtype">void</span> <a class="code" href="mmc_8c.html#a6">PerformBlockRead</a>(){00331 00332 <span class="preprocessor">#ifdef MMCDEBUG</span>00333 <span class="preprocessor"></span>  ConsoleWrite(<span class="stringliteral">"&lt;R"</span>); <span class="comment">//Actual Read</span>00334 <span class="preprocessor">#endif</span>00335 <span class="preprocessor"></span>00336   <span class="comment">/* Use shared global buffer pointer for speed*/</span>00337   <span class="comment">/* Loop unrolled 16 times for SPEED! :) */</span>00338   <a class="code" href="buffer_8c.html#a1">dataBufPtr</a> = <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>;00339   <span class="keywordflow">while</span> (<a class="code" href="buffer_8c.html#a1">dataBufPtr</a> &lt; <a class="code" href="buffer_8c.html#a0">diskSect</a>.<a class="code" href="unionDiskBlock.html#o1">raw</a>.<a class="code" href="structDiskBlock_1_1Raw.html#o0">buf</a>+512){00340     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00341     <a class="code" href="board_8h.html#a43">SPIWait</a>();00342     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00343     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00344     <a class="code" href="board_8h.html#a43">SPIWait</a>();00345     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00346     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00347     <a class="code" href="board_8h.html#a43">SPIWait</a>();00348     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00349     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00350     <a class="code" href="board_8h.html#a43">SPIWait</a>();00351     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00352     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00353     <a class="code" href="board_8h.html#a43">SPIWait</a>();00354     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00355     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00356     <a class="code" href="board_8h.html#a43">SPIWait</a>();00357     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00358     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00359     <a class="code" href="board_8h.html#a43">SPIWait</a>();00360     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00361     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00362     <a class="code" href="board_8h.html#a43">SPIWait</a>();00363     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00364     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00365     <a class="code" href="board_8h.html#a43">SPIWait</a>();00366     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00367     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00368     <a class="code" href="board_8h.html#a43">SPIWait</a>();00369     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00370     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00371     <a class="code" href="board_8h.html#a43">SPIWait</a>();00372     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;00373     <a class="code" href="board_8h.html#a45">SPIPutCharWithoutWaiting</a>(0xff);00374     <a class="code" href="board_8h.html#a43">SPIWait</a>();00375     *<a class="code" href="buffer_8c.html#a1">dataBufPtr</a>++=<a class="code" href="board_8h.html#a46">SPI_RESULT_BYTE</a>;

⌨️ 快捷键说明

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