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

📄 sta013_8c-source.html

📁 avr应用测试程序
💻 HTML
📖 第 1 页 / 共 3 页
字号:
00470     <span class="keywordflow">return</span> data;00471 }00472 00473 <span class="keywordtype">void</span> sta013WriteReg(u08 reg, u08 data)00474 {00475     <a class="code" href="i2csw_8c.html#a12">i2cSend</a>(STA_I2C_DEV, reg, 1, &amp;data);00476 }00477 00478 <span class="keywordtype">void</span> sta013DownloadUpdate(<span class="keywordtype">void</span>)00479 {00480     u16 i;00481     u08 reg, data;00482 00483     i=0;00484     <span class="comment">// get first reg/data pair</span>00485     reg = pgm_read_byte(STA013_UpdateData + i++);00486     data = pgm_read_byte(STA013_UpdateData + i++);00487     <span class="comment">// loop until end of update</span>00488     <span class="keywordflow">while</span>( (reg != 0xff) )00489     {00490         sta013WriteReg(reg, data);00491         reg = pgm_read_byte(STA013_UpdateData + i++);00492         data = pgm_read_byte(STA013_UpdateData + i++);00493     }00494 }00495 00496 00497 u08 sta013Init(<span class="keywordtype">void</span>)00498 {00499     <span class="comment">// reset STA013 device</span>00500     sta013HWReset();00501 00502     <span class="comment">// identify STA013 device</span>00503     <span class="keywordflow">if</span>(sta013ReadReg(STA_REG_IDENT) != STA_IDENT)00504     {00505         <span class="keywordflow">return</span> FALSE;00506     }00507 00508     <span class="comment">// do firmware configuration and update</span>00509     sta013DownloadUpdate();00510     <span class="comment">// start decoder</span>00511     sta013StartDecoder();00512     00513     <span class="keywordflow">return</span> TRUE;00514 }00515 00516 00517 <span class="keywordtype">void</span> sta013StartDecoder(<span class="keywordtype">void</span>)00518 {00519     <span class="comment">// Soft reset</span>00520     sta013WriteReg(STA_REG_SOFT_RESET,          0x01);00521     sta013WriteReg(STA_REG_SOFT_RESET,          0x00);00522 00523     <span class="comment">// Mute and configure DAC output</span>00524     sta013WriteReg(STA_REG_MUTE,                0x01);00525     sta013WriteReg(STA_REG_PCMDIVIDER,          0x01);  <span class="comment">// 32-bit mode, O_FAC = 256</span>00526     sta013WriteReg(STA_REG_PCMCONF,             0x31);  <span class="comment">// 18-bit mode &amp; more</span>00527 00528     <span class="comment">// Configure PLL for MP3 rates</span>00529     sta013WriteReg(STA_REG_PLLFRAC_441_H,       0x67);00530     sta013WriteReg(STA_REG_PLLFRAC_441_L,       0x77);00531     sta013WriteReg(STA_REG_PLLFRAC_H,           0xbb);00532     sta013WriteReg(STA_REG_PLLFRAC_L,           0x3a);00533     sta013WriteReg(STA_REG_MFSDF_441,           0x10);00534     sta013WriteReg(STA_REG_MFSDF,               0x0F);00535 00536     <span class="comment">// Configure interface polarities, etc</span>00537     sta013WriteReg(STA_REG_PLLCTL_2,            0x0C);00538     sta013WriteReg(STA_REG_PLLCTL_3,            0x00);00539     sta013WriteReg(STA_REG_PLLCTL_1,            0xA1);00540     sta013WriteReg(STA_REG_SCLK_POL,            0x00);  <span class="comment">// data sampled on rising edge</span>00541     sta013WriteReg(STA_REG_REQ_POL,             0x01);  <span class="comment">// REQ line active high</span>00542     sta013WriteReg(STA_REG_DATA_REQ_ENABLE,     0x04);00543     sta013WriteReg(STA_REG_PLLCTL_1,            0xA1);00544 00545     <span class="comment">// Set audio tone controls</span>00546     sta013SetTone(0, 0, 0, 0);00547 00548     <span class="comment">// Unmute and start running</span>00549     sta013WriteReg(STA_REG_RUN,  0x01);00550     sta013WriteReg(STA_REG_PLAY, 0x01);00551     sta013WriteReg(STA_REG_MUTE, 0x00);00552 }00553 00554 00555 <span class="keywordtype">void</span> sta013StopDecoder(<span class="keywordtype">void</span>)00556 {00557     <span class="comment">// mute output</span>00558     sta013WriteReg(STA_REG_MUTE, 0x01);00559     <span class="comment">// soft reset</span>00560     sta013WriteReg(STA_REG_SOFT_RESET, 0x01);00561     sta013WriteReg(STA_REG_SOFT_RESET, 0x00);00562 }00563 00564 00565 <span class="keywordtype">void</span> sta013PauseDecoder(<span class="keywordtype">void</span>)00566 {00567     <span class="comment">// enable mute</span>00568     sta013WriteReg(STA_REG_MUTE, 0x01);00569     <span class="comment">// stop the decoder</span>00570     sta013WriteReg(STA_REG_PLAY, 0x00);00571 }00572 00573 00574 <span class="keywordtype">void</span> sta013ResumeDecoder(<span class="keywordtype">void</span>)00575 {00576     <span class="comment">// run the decoder</span>00577     sta013WriteReg(STA_REG_PLAY, 0x01);00578     <span class="comment">// disable mute</span>00579     sta013WriteReg(STA_REG_MUTE, 0x00);00580 }00581 00582 <span class="keywordtype">void</span> sta013GetMP3Info(u16 *bitrate, u08 *sampFreq, u08 *mode)00583 {00584     u08 headL, headM, headH;00585     u08 mpegID, bitrateIndex, sampFreqIndex;00586     00587     <span class="comment">// get the MP3 header info</span>00588     headH = sta013ReadReg(STA_REG_HEAD_H);00589     headM = sta013ReadReg(STA_REG_HEAD_M);00590     headL = sta013ReadReg(STA_REG_HEAD_L);00591 00592     <span class="comment">// IDex:ID is in head[20:19]</span>00593     <span class="comment">// 00 - MPEG2.5</span>00594     <span class="comment">// 01 - reserved</span>00595     <span class="comment">// 10 - MPEG2</span>00596     <span class="comment">// 11 - MPEG1</span>00597     mpegID = (headH &amp; 0x18)&gt;&gt;3;00598 00599     <span class="comment">// sampling frequency is in head[11:10]</span>00600     sampFreqIndex = ((headM &amp; 0x0C)&gt;&gt;2) | (mpegID&lt;&lt;2);00601 00602     <span class="comment">// bitrate index is in head[15:12]</span>00603     bitrateIndex = ((headM &amp; 0xF0)&gt;&gt;4) | ((mpegID &amp; 0x01)&lt;&lt;4);00604     <span class="comment">//bitrateIndex = ((headM &amp; 0xF0)&gt;&gt;4) | (1&lt;&lt;4);</span>00605     00606     <span class="comment">// mode is in head[7:6]</span>00607     <span class="comment">// 00 - stereo</span>00608     <span class="comment">// 01 - joint stereo</span>00609     <span class="comment">// 10 - dual channel</span>00610     <span class="comment">// 11 - single channel (mono)</span>00611     *mode = (headL &amp; 0xC0)&gt;&gt;6;00612     00613     *bitrate =  2 * pgm_read_byte( MP3_Bitrates + bitrateIndex );00614     *sampFreq = pgm_read_byte( MP3_SamplingFrequencies + sampFreqIndex );00615 00616 <span class="comment">/*</span>00617 <span class="comment">   header = (unsigned long)sta013ReadReg(STA_REG_HEAD_H) &lt;&lt; 16 |</span>00618 <span class="comment">       (unsigned long)sta013ReadReg(STA_REG_HEAD_M) &lt;&lt; 8  |</span>00619 <span class="comment">       (unsigned long)sta013ReadReg(STA_REG_HEAD_L);</span>00620 <span class="comment"></span>00621 <span class="comment">//   hdr-&gt;word           = l;</span>00622 <span class="comment">//   hdr-&gt;emphasis       = l &amp; 0x03;</span>00623 <span class="comment">//   hdr-&gt;isOriginal     = (l &gt;&gt; 2) &amp; 0x01;</span>00624 <span class="comment">//   hdr-&gt;isCopyrighted  = (l &gt;&gt; 3) &amp; 0x01;</span>00625 <span class="comment">//   hdr-&gt;modeExtension  = (l &gt;&gt; 4) &amp; 0x03;</span>00626 <span class="comment">//   hdr-&gt;mode           = (l &gt;&gt; 6) &amp; 0x03;</span>00627 <span class="comment">//   hdr-&gt;private        = (l &gt;&gt; 8) &amp; 0x01;</span>00628 <span class="comment">//   hdr-&gt;padding        = (l &gt;&gt; 9) &amp; 0x01;</span>00629 <span class="comment">//   hdr-&gt;frequencyIndex = (l &gt;&gt; 10) &amp; 0x03;</span>00630 <span class="comment">//   hdr-&gt;bitrateIndex   = (l &gt;&gt; 12) &amp; 0x0f;</span>00631 <span class="comment">//   hdr-&gt;protection     = (l &gt;&gt; 16) &amp; 0x01;</span>00632 <span class="comment">//   hdr-&gt;layer          = (l &gt;&gt; 17) &amp; 0x03;</span>00633 <span class="comment">//   hdr-&gt;ID             = (l &gt;&gt; 19) &amp; 0x01;</span>00634 <span class="comment">//   hdr-&gt;ID_ex          = (l &gt;&gt; 20) &amp; 0x01;</span>00635 <span class="comment">*/</span>00636 }00637 00638 u16 sta013GetAverageBitrate(<span class="keywordtype">void</span>)00639 {00640     <span class="keywordflow">return</span> (2 * sta013ReadReg(STA_REG_AVERAGE_BITRATE));00641 }00642 00643 <span class="keywordtype">void</span> sta013SetVolume(u08 volume, s08 balance)00644 {00645     <span class="keywordtype">char</span> attenL, attenR;00646 00647     <span class="comment">// volume is expected as 0-100 value</span>00648     <span class="comment">// Note:</span>00649     <span class="comment">//  #define MIN_VOLUME_ATTENUATION     0</span>00650     <span class="comment">//  #define MAX_VOLUME_ATTENUATION     96</span>00651 00652     <span class="keywordflow">if</span>( balance &gt; 0)00653     {   <span class="comment">// balance to the left, attenuate right</span>00654         attenL = (100 - volume);00655         attenR = (100 - volume) - (balance);00656     }00657     <span class="keywordflow">else</span>00658     {   <span class="comment">// balance to the right, attenuate left</span>00659         attenL = (100 - volume) + (balance);00660         attenR = (100 - volume);00661     }00662     <span class="comment">// respect limits</span>00663     attenL = MIN(attenL,MAX_VOLUME_ATTENUATION);00664     attenL = MAX(attenL,MIN_VOLUME_ATTENUATION);00665     attenR = MIN(attenR,MAX_VOLUME_ATTENUATION);00666     attenR = MAX(attenR,MIN_VOLUME_ATTENUATION);00667 00668     <span class="comment">// set volume</span>00669     sta013WriteReg(STA_REG_DLA, attenL);00670     sta013WriteReg(STA_REG_DLB, MAX_VOLUME_ATTENUATION);00671     sta013WriteReg(STA_REG_DRA, attenR);00672     sta013WriteReg(STA_REG_DRB, MAX_VOLUME_ATTENUATION);00673 }00674 00675 00676 <span class="keywordtype">void</span> sta013SetTone(s08 bassEnh, u16 bassFreq, s08 trebleEnh, u16 trebleFreq)00677 {00678     <span class="comment">// set bass enhancement</span>00679     sta013WriteReg(STA_REG_BASS_FREQUENCY_LOW,  (bassFreq   ) &amp; 0xFF );00680     sta013WriteReg(STA_REG_BASS_FREQUENCY_HIGH, (bassFreq&gt;&gt;8) &amp; 0xFF );00681     <span class="comment">// respect limits</span>00682     bassEnh = MIN(bassEnh,MAX_BASS_ENHANCE);00683     bassEnh = MAX(bassEnh,MIN_BASS_ENHANCE);00684     sta013WriteReg(STA_REG_BASS_ENHANCE, bassEnh);00685 00686     <span class="comment">// set treble enhancement</span>00687     sta013WriteReg(STA_REG_TREBLE_FREQUENCY_LOW,  (trebleFreq   ) &amp; 0xFF );00688     sta013WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH, (trebleFreq&gt;&gt;8) &amp; 0xFF );00689     <span class="comment">// respect limits</span>00690     trebleEnh = MIN(trebleEnh,MAX_TREBLE_ENHANCE);00691     trebleEnh = MAX(trebleEnh,MIN_TREBLE_ENHANCE);00692     sta013WriteReg(STA_REG_TREBLE_ENHANCE, trebleEnh);00693 00694     <span class="comment">// set attentuation to avoid clipping</span>00695     sta013WriteReg( STA_REG_TONE_ATTEN, MAX(bassEnh,trebleEnh) );00696 }00697 00698 u08 sta013Demand(<span class="keywordtype">void</span>)00699 {00700     <span class="keywordflow">return</span> bit_is_set(STA013_DEMAND_PORTIN,STA013_DEMAND_PIN);00701 }</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:07 2006 for Procyon AVRlib by&nbsp;<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address></body></html>

⌨️ 快捷键说明

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