📄 vs1011b._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 + -