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

📄 vs1011b._c

📁 采用Mega16+VS1011B+SD卡制作的Mp3
💻 _C
字号:
# include "iom16v.h"
# include "macros.h"
# include "VS1011B.h"

#define uchar unsigned char
#define uint  unsigned int
#ifndef  SPI_CS_Deassert()
		 #define MMC_SD_PORT       PORTB  //引脚定义
		 #define MMC_SD_CS_PIN     4      //mega16,MMC/SD卡的片选引脚,接PortB4/ss
		 #define SPI_CS_Deassert() MMC_SD_PORT |=  BIT(MMC_SD_CS_PIN)  //SS为高,释放MMC
#endif

extern void Delay(unsigned int DelayTimes);
//以最低速度运行	//low speed
void VS1011B_SPI_Low(void)
{
	SPCR =   BIT(SPE)|BIT(MSTR)|BIT(SPR1)|BIT(SPR0);
	SPSR &= ~BIT(SPI2X);
}

//以FCK/4速度运行	//full speed
void VS1011B_SPI_High(void)
{
	SPCR =  BIT(SPE)|BIT(MSTR);
	SPSR |= BIT(SPI2X);
}

//向VS1011B写一字节		//write one byte to vs1011b
void VS1011B_WriteByte(unsigned char CH)
{   
	SPDR = CH;
	while(!(SPSR & BIT(SPIF)));
}

//从VS1011B读一字节		//read one byte from vs1011b
unsigned char VS1011B_ReadByte(void)
{
    SPDR = 0xff;
	while(!(SPSR & BIT(SPIF)));
	return SPDR;
}

//写寄存器,参数,地址和数据	//config register
void VS1011B_WriteCMD(unsigned char addr, unsigned int dat)
{
	VS1011B_XDCS_H();
	VS1011B_XCS_L();
	VS1011B_WriteByte(0x02);
	VS1011B_WriteByte(addr);
	VS1011B_WriteByte(dat>>8);
	VS1011B_WriteByte(dat);
	VS1011B_XCS_H();
}

//读寄存器,参数 地址 返回内容	//read register
unsigned int VS1011B_ReadCMD(unsigned char addr)
{
	unsigned int temp;
	VS1011B_XDCS_H();
	VS1011B_XCS_L();
	VS1011B_WriteByte(0x03);
	VS1011B_WriteByte(addr);
	temp = VS1011B_ReadByte();
	temp <<= 8;
	temp += VS1011B_ReadByte();
	VS1011B_XCS_H();
	return temp;
}

//写数据,音乐数据		//write data (music data)
void VS1011B_WriteDAT(unsigned char dat)
{
	VS1011B_XDCS_L();
	VS1011B_WriteByte(dat);
	VS1011B_XDCS_H();
	VS1011B_XCS_H();
}

// 1 means fail, 0 OK!
unsigned char VS1011B_Init(void)
{
	unsigned char retry;
	unsigned int Tmp;
	DDRB |= BIT(4)|BIT(5)|BIT(7);  //mega16,这些SPI端口要输出
	DDRB &=~BIT(6); //MISO为输入方式 
	SPI_CS_Deassert();  //释放MMC/SD卡
	VS1011B_PORT_INI();
	DDRA &=~BIT(VS1011B_DREQ); //DREQ为输入			
	PORTA|= BIT(VS1011B_DREQ); //DREQ=1
	
	VS1011B_XCS_H();
	VS1011B_XDCS_H();
	VS1011B_XRESET_L();
	Delay(2);
	VS1011B_XRESET_H();//使能芯片	//chip select
	VS1011B_SPI_Low();//先以低频操作	//low speed
	Delay(2);
	Delay(2);
	retry=0;
	
	VS1011B_ReadCMD(0x03);
	while(VS1011B_ReadCMD(0x03)!=CLOCK_REG)//写时钟寄存器	//set PLL register
	{
		VS1011B_WriteCMD(0x03,CLOCK_REG);
		if(retry++ >10 )return 1;
	}

	Delay(2);
	
	VS1011B_WriteCMD(0x05,0xBB81);//0xBB81 AC45);
	
	retry=0;
	Tmp=DefaultVolume*256+DefaultVolume;
	while(VS1011B_ReadCMD(0x0b) != Tmp)//设音量	//set Volume
	{
		VS1011B_WriteCMD(0x0b,Tmp);
		if(retry++ >10 )return 2;
	}

	retry=0;
	Tmp=DefaultBass;
	while(VS1011B_ReadCMD(0x02)!=Tmp)//写低音寄存器	
	{
		VS1011B_WriteCMD(0x02,Tmp);
		if(retry++ >10 )return 1;
	}
	Delay(2);
	
	retry=0;
	while(VS1011B_ReadCMD(0x00) != 0x0800)//0x0800)//写mode寄存器	//set mode register
	{
		VS1011B_WriteCMD(0x00,0x0800);//0x0800);
		if(retry++ >10 )return 3;//
	}

	Delay(2);

	VS1011B_SoftReset();
	VS1011B_SPI_High();
	return 0;
}

//VS1003软件复位	//VS1003 soft reset
void VS1011B_SoftReset(void)
{
	VS1011B_WriteCMD(0x00,0x0804);//写复位		//reset
	Delay(2);//延时,至少1.35ms //wait at least 1.35ms
	DDRA &=~BIT(VS1011B_DREQ); //DREQ为输入			
	PORTA|= BIT(VS1011B_DREQ); //DREQ=1
}

⌨️ 快捷键说明

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