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

📄 sta013.c

📁 mp3代码 要用的干净下啊 希望用东西共享啊
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	uint16 i;
	uint8 reg, data;

	i=0;

	reg = STA013_UpdateData[i++];
	data = STA013_UpdateData[i++];
	//结束标志"0xFF"
	while( (reg != 0xff) )
	{
		sta_WriteReg(reg, data);
		reg = STA013_UpdateData[i++];
		data = STA013_UpdateData[i++];
	}
}
//设置音调
void sta_SetTone(int8 bassEnh, uint16 bassFreq, int8 trebleEnh, uint16 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_MUTE, 0x01);
	sta_SetVolume(0,1);
	//软件复位
	sta_WriteReg(STA_REG_SOFT_RESET,		0x01);
	sta_WriteReg(STA_REG_SOFT_RESET,		0x00);
	sta_SetVolume(0,1);

	//静音与配置DAC输出
//	sta_WriteReg(STA_REG_MUTE,				0x01);
	sta_WriteReg(STA_REG_PCMDIVIDER,		0x01);	// 32-bit mode, O_FAC = 256
	sta_WriteReg(STA_REG_PCMCONF,			33);	// for cs4334

	//配置PLL
	
	sta_WriteReg(STA_REG_PLLFRAC_441_H,		0x04);
	sta_WriteReg(STA_REG_PLLFRAC_441_L,		0x00);
	sta_WriteReg(STA_REG_PLLFRAC_H,			0x85);
	sta_WriteReg(STA_REG_PLLFRAC_L,			85);
	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(11,			0x03);
	sta_WriteReg(STA_REG_PLLCTL_1,			161);
	sta_WriteReg(STA_REG_SCLK_POL,			0x00);	// data sampled on rising edge   
													//00~AVR SPI MODE: SPI0 or SPI3
													//04~AVR SPI MODE: SPI1 or SPI2 0r SPI3
													//如果使用BIT_EN 必须使用SPI0 or SPI1
	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初始化
uint8 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(uint16 *bitrate, uint8 *sampFreq, uint8 *mode)
{
	uint8 headL, headM, headH;
	uint8 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 * MP3_Bitrates [bitrateIndex];
	*sampFreq = 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;
*/
}

uint16 sta_GetAverageBitrate(void)
{
	return (2 * sta_ReadReg(STA_REG_AVERAGE_BITRATE));
}

void sta_SetVolume(uint8 volume, int8 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的REQ
uint8 sta_Demand(void)
{
	return (STA_REQ_IN&BIT(STA_REQ));
}
//发送MP3数据到STA013
void sta_SendToDecoder(uint16 len)
{
 	uint8 buffer[512];
//	uint8 *ptr;
	uint16 i,count;
	
	while(1)
	{
	count=FAT_FileRead(512,buffer); 
	if (count==0) break; 
//	ptr=buffer; 
	STA_BITEN_OUT|=BIT(STA_BITEN);
	STA_LED_OUT&=~BIT(STA_LED);
	i=0;
	 while (i<count)
	   {
	   while(sta_Demand())
	      {
		  Spi_Send(&buffer[i],1);
		  i++;
		  if (i>=512) break;
     	  }
		
	    }
	 STA_LED_OUT|=BIT(STA_LED);
	 STA_BITEN_OUT&=~BIT(STA_BITEN);  
	 }
	STA_LED_OUT|=BIT(STA_LED);
	STA_BITEN_OUT&=~BIT(STA_BITEN);
}

⌨️ 快捷键说明

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