📄 sta013_8c-source.html
字号:
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, &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 & 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 & 0x18)>>3;00598 00599 <span class="comment">// sampling frequency is in head[11:10]</span>00600 sampFreqIndex = ((headM & 0x0C)>>2) | (mpegID<<2);00601 00602 <span class="comment">// bitrate index is in head[15:12]</span>00603 bitrateIndex = ((headM & 0xF0)>>4) | ((mpegID & 0x01)<<4);00604 <span class="comment">//bitrateIndex = ((headM & 0xF0)>>4) | (1<<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 & 0xC0)>>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) << 16 |</span>00618 <span class="comment"> (unsigned long)sta013ReadReg(STA_REG_HEAD_M) << 8 |</span>00619 <span class="comment"> (unsigned long)sta013ReadReg(STA_REG_HEAD_L);</span>00620 <span class="comment"></span>00621 <span class="comment">// hdr->word = l;</span>00622 <span class="comment">// hdr->emphasis = l & 0x03;</span>00623 <span class="comment">// hdr->isOriginal = (l >> 2) & 0x01;</span>00624 <span class="comment">// hdr->isCopyrighted = (l >> 3) & 0x01;</span>00625 <span class="comment">// hdr->modeExtension = (l >> 4) & 0x03;</span>00626 <span class="comment">// hdr->mode = (l >> 6) & 0x03;</span>00627 <span class="comment">// hdr->private = (l >> 8) & 0x01;</span>00628 <span class="comment">// hdr->padding = (l >> 9) & 0x01;</span>00629 <span class="comment">// hdr->frequencyIndex = (l >> 10) & 0x03;</span>00630 <span class="comment">// hdr->bitrateIndex = (l >> 12) & 0x0f;</span>00631 <span class="comment">// hdr->protection = (l >> 16) & 0x01;</span>00632 <span class="comment">// hdr->layer = (l >> 17) & 0x03;</span>00633 <span class="comment">// hdr->ID = (l >> 19) & 0x01;</span>00634 <span class="comment">// hdr->ID_ex = (l >> 20) & 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 > 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 ) & 0xFF );00680 sta013WriteReg(STA_REG_BASS_FREQUENCY_HIGH, (bassFreq>>8) & 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 ) & 0xFF );00688 sta013WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH, (trebleFreq>>8) & 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 <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 + -