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

📄 sta013.c.svn-base

📁 数字广播系统的开发源码
💻 SVN-BASE
字号:


//#include <iom16v.h>
//#include <macros.h>
//#include "../Code/GloblDef.h"
#include "config.h"
#include "STA013.h"
/*
const BYTE BassTrebleTable[8][6]=
{  // TRLow   TRHigh   BSLow   BSHigh   TEhnc   BSEnhc
      {0x40, 0x1F,   70,   0,      0x00,   0x00}, // Normal
      {0x58, 0x1B,   100,  0,      0x06,   0x0C}, // HiBS, HiTrbl
      {0xE8, 0x03,   0x58, 0x02,   0x06,   0x09}, // HiVocal
      {0x58, 0x1B,   100,  0,      0xF7,   0xF7}, // LowBS, LowTrbl, LowVocal
      {0x58, 0x1B,   70,   0,      0xF7,   0x0C}, // HiBs, LowTrbl
      {0x58, 0x1B,   70,   0,      0x06,   0xF7}, // LowBs, HiTrbl
      {0xE8, 0x03,   0x58, 0x02,   0x06,   0xF7}, // LowMidBS, HiMidTrbl
      {0xE8, 0x03,   0x58, 0x02,   0xF7,   0x06}, // HiMidBS, LowMidTrbl
};
*/

//STA013复位
void sta_Reset()
{
	PORTA|=1<<RST;        	//RST低为复位
	PORTA&=~(1<<RST);
	Delay_us(1200);
	PORTA|=1<<RST;
}

//STA013初始化
unsigned char sta_Init(void)
{
	//复位
	sta_Reset();

	//识别STA013
	if(sta_ReadReg(0x01) != 0xac)
	{
		return 0;
	}

	//配置STA013
	sta_DownloadUpdate();
	//开始解压
	sta_StartDecoder();

	return 1;
}

/*************************************************************************************/
//读取STA013的寄存器
unsigned char sta_ReadReg(unsigned char reg)
/*************************************************************************************/
{
	unsigned char data;
	sta_ReadDevice(STA_I2C_DEV, reg, 1, &data);
	return data;
}

/*************************************************************************************/
//写STA013的寄存器
void sta_WriteReg(unsigned char reg, unsigned char data)
/*************************************************************************************/
{
	i2cSend(STA_I2C_DEV, reg, 1, &data);
}

/*************************************************************************************/
//向STA013写配置文件
/*************************************************************************************/
void sta_DownloadUpdate()
{
        /*
	unsigned int i = 0;
	unsigned char reg, data;

	reg  = PRG_RDB(STA013_UpdateData + i++);
	data = PRG_RDB(STA013_UpdateData + i++);

	while(reg != 0xff) //结束标志"0xFF"
	{
		sta_WriteReg(reg, data);
		reg  = PRG_RDB(STA013_UpdateData + i++);
		data = PRG_RDB(STA013_UpdateData + i++);
	} */
        
        unsigned int i = 0;
        do 
        {
	  I2C_Write(STA013_UpdateData[i],device1, STA013_UpdateData[i+1]);	  
          i += 2;
	 }while(STA013_UpdateData[i] != 0xff); 
        
}


/*************************************************************************************/
//通过I2C向STA013发送数据
void i2cSend(unsigned char device, unsigned char subAddr, unsigned char length, unsigned char *data)
/*************************************************************************************/
{
	unsigned char ERRORCOUNT = 10;

	while (ERRORCOUNT--)
	{
		twi_start();

		while (twi_writebyte(device)  != TW_MT_SLA_ACK  );
		while (twi_writebyte(subAddr) != TW_MT_DATA_ACK );

		while(length--)
			twi_writebyte(*data++);
   		break;
    }
    twi_stop();
}

/*************************************************************************************/
//通过I2C读STA013
void sta_ReadDevice(unsigned char device, unsigned char subAddr, unsigned char length, unsigned char *data)
/*************************************************************************************/
{
	unsigned char ERRORCOUNT = 10;

	while(ERRORCOUNT--)
	{
		twi_start();

		while (twi_writebyte(device)  != TW_MT_SLA_ACK  );
		while (twi_writebyte(subAddr) != TW_MT_DATA_ACK );

      	twi_start();
		while (twi_writebyte(device | 0x01)  != TW_MT_SLA_ACK  );

		//(读ReadLen-1)个数据,并发出Ack应答,表示还继续读。
		while(--length)
			twi_readbyte_ack(*data++);
		//读最后一个数据,并发出NAck应答,表示不再读。
		twi_readbyte_nack(*data);

		break;
	}
	twi_stop();
}


/*************************************************************************************/
//设置音调
void sta_SetTone(char bassEnh, unsigned int bassFreq, char trebleEnh, unsigned int 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);
}

/*************************************************************************************/
//停止解压
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(unsigned int *bitrate, unsigned char *sampFreq, unsigned char *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;
*/
}

/*************************************************************************************/
unsigned int sta_GetAverageBitrate(void)
/*************************************************************************************/
{
	return (2 * sta_ReadReg(STA_REG_AVERAGE_BITRATE));
}

/*************************************************************************************/
void sta_SetVolume(unsigned char volume, char 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
unsigned char sta_Demand(void)
/*************************************************************************************/
{
	return bit_is_set(STA_REQ_IN, STA_REQ);
}

/*************************************************************************************/
//发送MP3数据到STA013
void sta_SendToDecoder(unsigned int len)
/*************************************************************************************/
{
	unsigned int pt = 0;
	char j;
	unsigned char done = 1;
	unsigned char 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传送
	    SPDR = mdata;
		loop_until_bit_is_set(SPSR, 7);

		pt++;
		len--;
		if(len == 0)
		{
	     	done = 0;
	     	break;
		}
	  }
	}
}
///////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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