📄 sta013.lst
字号:
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 + -