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

📄 sta013.lst

📁 用LPC932控制sta013解码芯片
💻 LST
📖 第 1 页 / 共 4 页
字号:
 714          void sta_DownloadUpdate(void)
 715          {
 716   1              u16 i=0;
 717   1              u8 reg, mydata;
 718   1              reg = STA013_UpdateData[i++];
 719   1              mydata = STA013_UpdateData[i++];
 720   1              //结束标志"0xFF"
 721   1              while( (reg != 0xff) )
 722   1              {
 723   2                      sta_WriteReg(reg, mydata);
 724   2              if(reg==0x10)
 725   2                      {
 726   3                         Delays(50);
 727   3                      }
 728   2                      reg = STA013_UpdateData[i++];
 729   2                      mydata =STA013_UpdateData[i++];
 730   2      
 731   2              }
 732   1      }
 733          
 734          //设置音调
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 13  

 735          void sta_SetTone(s8 bassEnh, u16 bassFreq, s8 trebleEnh, u16 trebleFreq)
 736          {
 737   1              //设置低音增益
 738   1              sta_WriteReg(STA_REG_BASS_FREQUENCY_LOW,  (bassFreq   ) & 0xFF );
 739   1              sta_WriteReg(STA_REG_BASS_FREQUENCY_HIGH, (bassFreq>>8) & 0xFF );
 740   1              
 741   1              //注意界限
 742   1              bassEnh = MIN(bassEnh,MAX_BASS_ENHANCE);
 743   1              bassEnh = MAX(bassEnh,MIN_BASS_ENHANCE);
 744   1              sta_WriteReg(STA_REG_BASS_ENHANCE, bassEnh);
 745   1          
 746   1              //设置高音增益
 747   1              sta_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW,  (trebleFreq   ) & 0xFF );
 748   1              sta_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH, (trebleFreq>>8) & 0xFF );
 749   1      
 750   1              //注意界限
 751   1              trebleEnh = MIN(trebleEnh,MAX_TREBLE_ENHANCE);
 752   1              trebleEnh = MAX(trebleEnh,MIN_TREBLE_ENHANCE);
 753   1              sta_WriteReg(STA_REG_TREBLE_ENHANCE, trebleEnh);
 754   1          
 755   1              //
 756   1              sta_WriteReg( STA_REG_TONE_ATTEN, MAX(bassEnh,trebleEnh));
 757   1      }
 758          
 759          //配置STA013并开始解压
 760          void sta_StartDecoder(void)
 761          {   
 762   1              //软件复位
 763   1              sta_WriteReg(STA_REG_SOFT_RESET, 0x01);
 764   1              sta_WriteReg(STA_REG_SOFT_RESET,                0x00);
 765   1          
 766   1              //静音与配置DAC输出
 767   1              sta_WriteReg(STA_REG_MUTE,                              0x01);
 768   1              sta_WriteReg(STA_REG_PCMDIVIDER,                0x01);  // 32-bit mode, O_FAC = 256
 769   1              sta_WriteReg(STA_REG_PCMCONF,                   0x31);  // 18-bit mode & more
 770   1          
 771   1              //配置PLL
 772   1              sta_WriteReg(STA_REG_PLLFRAC_441_H,             0x67);
 773   1              sta_WriteReg(STA_REG_PLLFRAC_441_L,             0x77);
 774   1              sta_WriteReg(STA_REG_PLLFRAC_H,                 0xbb);
 775   1              sta_WriteReg(STA_REG_PLLFRAC_L,                 0x3a);
 776   1              sta_WriteReg(STA_REG_MFSDF_441,                 0x10);
 777   1              sta_WriteReg(STA_REG_MFSDF,                             0x0F);
 778   1           
 779   1              //配置界面等
 780   1              sta_WriteReg(STA_REG_PLLCTL_2,                  0x0C);
 781   1              sta_WriteReg(STA_REG_PLLCTL_3,                  0x00);
 782   1              sta_WriteReg(STA_REG_PLLCTL_1,                  0xA1);
 783   1              sta_WriteReg(STA_REG_SCLK_POL,                  0x00);  // data sampled on rising edge
 784   1              sta_WriteReg(STA_REG_REQ_POL,                   0x01);  // REQ line active high
 785   1              sta_WriteReg(STA_REG_DATA_REQ_ENABLE,   0x04);
 786   1              sta_WriteReg(STA_REG_PLLCTL_1,                  0xA1);
 787   1          
 788   1              //设置音调
 789   1              sta_SetTone(0, 0, 0, 0);
 790   1          
 791   1              //STA013开始运行
 792   1              sta_WriteReg(STA_REG_RUN,  0x01);
 793   1              sta_WriteReg(STA_REG_PLAY, 0x01);
 794   1              sta_WriteReg(STA_REG_MUTE, 0x00);
 795   1      }
 796          
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 14  

 797          //STA013初始化
 798          u8 sta_Init(void)
 799          {   
 800   1              //复位
 801   1              sta_Reset();
 802   1      
 803   1              //识别STA013
 804   1              if(sta_ReadReg(STA_REG_IDENT) != STA_IDENT)
 805   1              {
 806   2                      return 0;
 807   2              }
 808   1              //配置STA013
 809   1          sta_DownloadUpdate();
 810   1      //      sta_updata();
 811   1              //开始解压
 812   1              sta_StartDecoder();     
 813   1              return 1;
 814   1      }
 815          
 816          void sta_SetVolume(u8 volume, s8 balance)
 817          {
 818   1              char attenL, attenR;
 819   1      
 820   1              // volume is expected as 0-100 value
 821   1              // Note:
 822   1              #define MIN_VOLUME_ATTENUATION     0
 823   1              #define MAX_VOLUME_ATTENUATION     96
 824   1      
 825   1              if( balance > 0)
 826   1              {       // balance to the left, attenuate right
 827   2                      attenL = (100 - volume);
 828   2                      attenR = (100 - volume) - (balance);
 829   2              }
 830   1              else
 831   1              {       // balance to the right, attenuate left
 832   2                      attenL = (100 - volume) + (balance);
 833   2                      attenR = (100 - volume);
 834   2              }
 835   1              // respect limits
 836   1              attenL = MIN(attenL,MAX_VOLUME_ATTENUATION);
 837   1              attenL = MAX(attenL,MIN_VOLUME_ATTENUATION);
 838   1              attenR = MIN(attenR,MAX_VOLUME_ATTENUATION);
 839   1              attenR = MAX(attenR,MIN_VOLUME_ATTENUATION);
 840   1      
 841   1              // set volume
 842   1              sta_WriteReg(STA_REG_DLA, attenL);
 843   1              sta_WriteReg(STA_REG_DLB, MAX_VOLUME_ATTENUATION);
 844   1              sta_WriteReg(STA_REG_DRA, attenR);
 845   1              sta_WriteReg(STA_REG_DRB, MAX_VOLUME_ATTENUATION);
 846   1      }
 847          
 848          void spiSendbyte()
 849          {   
 850   1         unsigned int i=0;
 851   1         unsigned char done;
 852   1         while(done)
 853   1         {
 854   2            while(DATA_REQ)        
 855   2            {
 856   3              SPDAT=readdata[i++];                         //向从机发送数据
 857   3              while((SPSTAT & 0x80)==0);         //等待SPIF为1
 858   3              SPSTAT=0xC0;
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 15  

 859   3                  if(i==512)
 860   3                      {
 861   4                         done=0;
 862   4                         break;
 863   4                      }
 864   3            }
 865   2         }
 866   1      }
 867          
 868          void read(unsigned int block,unsigned int page,unsigned char *buffer)  //读操作
 869          {
 870   1         unsigned int i;
 871   1         unsigned int blockpage=(block<<4)+page;
 872   1      //写命令
 873   1         flash_ce=0;  
 874   1         flash_cle=1;
 875   1         flash_we=0;
 876   1         P0=0x00;
 877   1         flash_we=1;
 878   1         flash_cle=0;
 879   1         flash_ale=1;
 880   1      
 881   1      //写地址
 882   1         flash_we=0;
 883   1         P0=0x00;
 884   1         i++;
 885   1         flash_we=1;
 886   1         
 887   1         flash_we=0;
 888   1         P0=blockpage & 0xff;
 889   1         i++;
 890   1         flash_we=1;
 891   1         
 892   1         flash_we=0;
 893   1         P0=(blockpage>>8) & 0xff;
 894   1         i++;
 895   1         flash_we=1;
 896   1         flash_ale=0;
 897   1         
 898   1         while(!flash_rb);
 899   1         P0M1=0xff;
 900   1         P0M2=0x00;
 901   1         for(i=0;i<512;i++)
 902   1         {
 903   2            flash_re=0;
 904   2            *(buffer+i)=P0;
 905   2            flash_re=1;
 906   2         }
 907   1         P0M1=0x00;
 908   1         P0M2=0x00;  
 909   1         flash_ce=1;
 910   1      }
 911          
 912          void sta_SendToDecoder()
 913          {
 914   1          unsigned int data flash_block;
 915   1              unsigned char data flash_page;
 916   1             for(flash_block=1;flash_block<5;flash_block++)
 917   1             {
 918   2                for(flash_page=0;flash_page<16;flash_page++)
 919   2                {
 920   3                       read(flash_block,flash_page,&readdata);
C51 COMPILER V7.07   STA013                                                                05/13/2005 11:52:11 PAGE 16  

 921   3                   spiSendbyte();
 922   3                }
 923   2             }
 924   1      }
 925          
 926          void main(void)
 927          {
 928   1          BIT_EN=1;
 929   1              IoIni();
 930   1          sta_Init();
 931   1              sta_SetVolume(50,10);
 932   1              while(1)
 933   1              {
 934   2              sta_SendToDecoder();
 935   2              }
 936   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1438    ----
   CONSTANT SIZE    =   4014    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      42
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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