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

📄 sta013.c

📁 MP3播放程序
💻 C
📖 第 1 页 / 共 3 页
字号:
u8 sta_ReadReg(u8 reg){	u8 data;		sta_ReadDevice(STA_I2C_DEV, reg, 1, &data);	return data;}//写寄存器void sta_WriteReg(u8 reg, u8 data){	i2cSend(STA_I2C_DEV, reg, 1, &data);}//写配置文件void sta_DownloadUpdate(void){	u16 i;	u8 reg, data;	i=0;	reg = PRG_RDB(STA013_UpdateData + i++);	data = PRG_RDB(STA013_UpdateData + i++);	//结束标志"0xFF"	while( (reg != 0xff) )	{		sta_WriteReg(reg, data);		reg = PRG_RDB(STA013_UpdateData + i++);		data = PRG_RDB(STA013_UpdateData + i++);	}}//设置音调void sta_SetTone(s8 bassEnh, u16 bassFreq, s8 trebleEnh, u16 trebleFreq){	//设置低音增益	sta_WriteReg(STA_REG_BASS_FREQUENCY_LOW,  (bassFreq   ) & 0xFF );	sta_WriteReg(STA_REG_BASS_FREQUENCY_HIGH, (bassFreq>>8) & 0xFF );	//注意界限	bassEnh = MIN(bassEnh,MAX_BASS_ENHANCE);	bassEnh = MAX(bassEnh,MIN_BASS_ENHANCE);	sta_WriteReg(STA_REG_BASS_ENHANCE, bassEnh);	//设置高音增益	sta_WriteReg(STA_REG_TREBLE_FREQUENCY_LOW,  (trebleFreq   ) & 0xFF );	sta_WriteReg(STA_REG_TREBLE_FREQUENCY_HIGH, (trebleFreq>>8) & 0xFF );	//注意界限	trebleEnh = MIN(trebleEnh,MAX_TREBLE_ENHANCE);	trebleEnh = MAX(trebleEnh,MIN_TREBLE_ENHANCE);	sta_WriteReg(STA_REG_TREBLE_ENHANCE, trebleEnh);	//	sta_WriteReg( STA_REG_TONE_ATTEN, MAX(bassEnh,trebleEnh) );}//配置STA013并开始解压void sta_StartDecoder(void){	//软件复位	sta_WriteReg(STA_REG_SOFT_RESET,		0x01);	sta_WriteReg(STA_REG_SOFT_RESET,		0x00);	//静音与配置DAC输出	sta_WriteReg(STA_REG_MUTE,				0x01);	sta_WriteReg(STA_REG_PCMDIVIDER,		0x01);	// 32-bit mode, O_FAC = 256	sta_WriteReg(STA_REG_PCMCONF,			0x31);	// 18-bit mode & more	//配置PLL	sta_WriteReg(STA_REG_PLLFRAC_441_H,		0x67);	sta_WriteReg(STA_REG_PLLFRAC_441_L,		0x77);	sta_WriteReg(STA_REG_PLLFRAC_H,			0xbb);	sta_WriteReg(STA_REG_PLLFRAC_L,			0x3a);	sta_WriteReg(STA_REG_MFSDF_441,			0x10);	sta_WriteReg(STA_REG_MFSDF,				0x0F);	//配置界面等	sta_WriteReg(STA_REG_PLLCTL_2,			0x0C);	sta_WriteReg(STA_REG_PLLCTL_3,			0x00);	sta_WriteReg(STA_REG_PLLCTL_1,			0xA1);	sta_WriteReg(STA_REG_SCLK_POL,			0x00);	// data sampled on rising edge	sta_WriteReg(STA_REG_REQ_POL,			0x01);	// REQ line active high	sta_WriteReg(STA_REG_DATA_REQ_ENABLE,	0x04);	sta_WriteReg(STA_REG_PLLCTL_1,			0xA1);	//设置音调	sta_SetTone(0, 0, 0, 0);	//STA013开始运行	sta_WriteReg(STA_REG_RUN,  0x01);	sta_WriteReg(STA_REG_PLAY, 0x01);	sta_WriteReg(STA_REG_MUTE, 0x00);}//STA013初始化u8 sta_Init(void){	//复位	sta_Reset();	//识别STA013	if(sta_ReadReg(STA_REG_IDENT) != STA_IDENT)	{		return FALSE;	}	//配置STA013	sta_DownloadUpdate();	//开始解压	sta_StartDecoder();		return TRUE;}//停止解压void sta_StopDecoder(void){	//静音	sta_WriteReg(STA_REG_MUTE, 0x01);	//软件复位	sta_WriteReg(STA_REG_SOFT_RESET, 0x01);	sta_WriteReg(STA_REG_SOFT_RESET, 0x00);}//暂停解压void sta_PauseDecoder(void){	//静音	sta_WriteReg(STA_REG_MUTE, 0x01);	//停止	sta_WriteReg(STA_REG_PLAY, 0x00);}//恢复解压void sta_ResumeDecoder(void){	//开始解压	sta_WriteReg(STA_REG_PLAY, 0x01);	//放音	sta_WriteReg(STA_REG_MUTE, 0x00);}//获取MP3信息void sta_GetMP3Info(u16 *bitrate, u8 *sampFreq, u8 *mode){	u8 headL, headM, headH;	u8 mpegID, bitrateIndex, sampFreqIndex;		// get the MP3 header info	headH = sta_ReadReg(STA_REG_HEAD_H);	headM = sta_ReadReg(STA_REG_HEAD_M);	headL = sta_ReadReg(STA_REG_HEAD_L);	// IDex:ID is in head[20:19]	// 00 - MPEG2.5	// 01 - reserved	// 10 - MPEG2	// 11 - MPEG1	mpegID = (headH & 0x18)>>3;	// sampling frequency is in head[11:10]	sampFreqIndex = ((headM & 0x0C)>>2) | (mpegID<<2);	// bitrate index is in head[15:12]	bitrateIndex = ((headM & 0xF0)>>4) | ((mpegID & 0x01)<<4);	//bitrateIndex = ((headM & 0xF0)>>4) | (1<<4);		// mode is in head[7:6]	// 00 - stereo	// 01 - joint stereo	// 10 - dual channel	// 11 - single channel (mono)	*mode = (headL & 0xC0)>>6;		*bitrate =	2 * PRG_RDB( MP3_Bitrates + bitrateIndex );	*sampFreq = PRG_RDB( MP3_SamplingFrequencies + sampFreqIndex );/*   header = (unsigned long)sta_ReadReg(STA_REG_HEAD_H) << 16 |       (unsigned long)sta_ReadReg(STA_REG_HEAD_M) << 8  |       (unsigned long)sta_ReadReg(STA_REG_HEAD_L);//   hdr->word           = l;//   hdr->emphasis       = l & 0x03;//   hdr->isOriginal     = (l >> 2) & 0x01;//   hdr->isCopyrighted  = (l >> 3) & 0x01;//   hdr->modeExtension  = (l >> 4) & 0x03;//   hdr->mode           = (l >> 6) & 0x03;//   hdr->private        = (l >> 8) & 0x01;//   hdr->padding        = (l >> 9) & 0x01;//   hdr->frequencyIndex = (l >> 10) & 0x03;//   hdr->bitrateIndex   = (l >> 12) & 0x0f;//   hdr->protection     = (l >> 16) & 0x01;//   hdr->layer          = (l >> 17) & 0x03;//   hdr->ID             = (l >> 19) & 0x01;//   hdr->ID_ex          = (l >> 20) & 0x01;*/}u16 sta_GetAverageBitrate(void){	return (2 * sta_ReadReg(STA_REG_AVERAGE_BITRATE));}void sta_SetVolume(u8 volume, s8 balance){	char attenL, attenR;	// volume is expected as 0-100 value	// Note:	//	#define MIN_VOLUME_ATTENUATION     0	//	#define MAX_VOLUME_ATTENUATION     96	if( balance > 0)	{	// balance to the left, attenuate right		attenL = (100 - volume);		attenR = (100 - volume) - (balance);	}	else	{	// balance to the right, attenuate left		attenL = (100 - volume) + (balance);		attenR = (100 - volume);	}	// respect limits	attenL = MIN(attenL,MAX_VOLUME_ATTENUATION);	attenL = MAX(attenL,MIN_VOLUME_ATTENUATION);	attenR = MIN(attenR,MAX_VOLUME_ATTENUATION);	attenR = MAX(attenR,MIN_VOLUME_ATTENUATION);	// set volume	sta_WriteReg(STA_REG_DLA, attenL);	sta_WriteReg(STA_REG_DLB, MAX_VOLUME_ATTENUATION);	sta_WriteReg(STA_REG_DRA, attenR);	sta_WriteReg(STA_REG_DRB, MAX_VOLUME_ATTENUATION);}//检测STA013的REQu8 sta_Demand(void){	return bit_is_set(STA_REQ_IN, STA_REQ);}//发送MP3数据到STA013void sta_SendToDecoder(u16 len){	u16 pt = 0;	s8 j;	u8 done = 1;	u8 mdata;		while(done) 	{	  while(sta_Demand())	  {	  	mdata = PRG_RDB(mp3_data + pt);	     //用软串口传送//	     for(j = 7; j >= 0; j--)//	     {//	       cbi(STA_SCK_OUT, STA_SCK);//	       if((mdata >> j) & 1) sbi(STA_SDI_OUT, STA_SDI);//	       else cbi(STA_SDI_OUT, STA_SDI);//	       sbi(STA_SCK_OUT, STA_SCK);//	     }		//用SPI传送	    spiSendByte(mdata);		pt++;		len--;		if(len == 0)		{	     	done = 0;	     	break;		}	  }	}}

⌨️ 快捷键说明

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