📄 sta013.c.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 + -