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

📄 vs1002.c

📁 AVR对VS1002D的控制代码. VS1002D是一块MP3解码IC,这是用AVR做的MP3.
💻 C
📖 第 1 页 / 共 3 页
字号:
}

void vsSerialWrite(uint8_t data)
{
	S0SPDR = data;
	while(!(S0SPSR & (1 << 7)));
}

uint8_t vsSerialRead(void)
{
	S0SPDR = 0xff;
	while(!(S0SPSR & (1 << 7)));
	return S0SPDR;
}

uint8_t vsReset(void)
{
	uint32_t i;
	FIO0CLR = 1 << 22;	// nXRST
	for(i = 0; i < 100; i ++);
	FIO0SET = 1 << 22;	// nXRST
	if(vsWaitForNDRQ(50000))
		return 0xff;
	vsSetVolume(0xff, 0xff);
	vsSCIWrite(SCI_CLOCKF, 0x9770);		// CLKI is 2 * 12.000MHz
	if(vsWaitForDRQ(50000))
		return 0xff;
	vsSCIWrite(SCI_AUDATA, 0x000a);		// Slow sample rate for slow analog part startup
	for(i = 0; i < 10000; i ++);
	vsSetVolume(0xfe, 0xfe);			// Switch on the analog parts
	vsSCIWrite(SCI_AUDATA, 0xac45);		// 44kHz
	vsSetVolume(32, 32);
	vsSetBass(0, 10);		// 0db, 100Hz
	return 0;
}

void vsWaitFor5us(void)
{
	__asm
	{
		mov		r1, #0x3c			// Wait for 5us
		loop:
		sub		r1, r1, #0x1
		cmp		r1, #0x00
		bne		loop
	}
}

uint16_t vsSCIRead(uint8_t addr)
{
	uint16_t r;
	FIO1CLR = (1 << 19);		// nXCS
	vsSerialWrite(0x03);
	vsWaitFor5us();
	vsSerialWrite(addr);
	r = vsSerialRead() << 8;
	r += vsSerialRead();
	FIO1SET = (1 << 19);		// nXCS
	vsWaitFor5us();
	return r;
}

void vsSCIWrite(uint8_t addr, uint16_t data)
{
	FIO1CLR = (1 << 19);		// nXCS
	vsSerialWrite(0x02);
	vsWaitFor5us();
	vsSerialWrite(addr);
	vsSerialWrite(data >> 8);
	vsSerialWrite(data);
	FIO1SET = (1 << 19);		// nXCS
	vsWaitFor5us();
}

void vsSDIWrite(uint8_t data)
{
	FIO1CLR = (1 << 24);		// nXDCS
	vsSerialWrite(data);
	FIO1SET = (1 << 24);		// nXDCS
}

void vsSDIBurstWrite(uint8_t *buffer, uint16_t n)
{
	FIO1CLR = (1 << 24);		// nXDCS
	while((n --) > 0)
		vsSerialWrite(*(buffer ++));
	FIO1SET = (1 << 24);		// nXDCS
}

uint8_t vsSoftReset(void)
{
	uint32_t i;
	vsSCIWrite(SCI_MODE, SM_SDINEW | SM_RESET);
	if(vsWaitForNDRQ(50000))
		return 0xff;
	if(vsWaitForDRQ(50000))
		return 0xff;
	vsSCIWrite(SCI_CLOCKF, 0x9770);		// CLKI is 2 * 12.000MHz
	for(i = 0; i < 100; i ++);
	vsSDIWrite(0);
	vsSDIWrite(0);
	vsSDIWrite(0);
	vsSDIWrite(0);
	return 0;
}

uint8_t vsVersion(void)
{
	return (vsSCIRead(SCI_STATUS) >> 4) & 0x7;
}

void vsSetVolume(uint8_t l, uint8_t r)
{
	vsSCIWrite(SCI_VOL, ((l << 8) + r));
}

void vsSetBass(uint8_t amp, uint8_t freq)
{
	vsSCIWrite(SCI_BASS, ((amp & 0x0f) << 4) | (freq & 0x0f));
}

uint8_t vsEnterSineTest(uint16_t freq)
{
	uint8_t data[8] = {0x53, 0xef, 0x6e, 0xff, 0x00, 0x00, 0x00, 0x00};
	uint32_t i;
	FIO0CLR = 1 << 22;	// nXRST
	for(i = 0; i < 100; i ++);
	FIO0SET = 1 << 22;	// nXRST
	if(vsWaitForNDRQ(50000))
		return 0xff;
	vsSCIWrite(SCI_CLOCKF, 0x9770);		// CLKI is 2 * 12.000MHz
	vsSetVolume(20, 20);
	vsSCIWrite(SCI_MODE, SM_SDINEW | SM_TESTS);
	if(vsWaitForDRQ(50000))
		return 0xff;
	data[3] = ((freq * 128) / 44100) & 0x1f;
	vsSDIBurstWrite(data, 8);
	return 0;
}

void vsExitSineTest(void)
{
	uint8_t data[8] = {0x45, 0x78, 0x69, 0x74, 0x00, 0x00, 0x00, 0x00};
	vsWaitForDRQ(50000);
	vsSDIBurstWrite(data, 8);
}

void vsPlayBeep(void)
{
	uint32_t i;
	for(i = 0; i < 4800; i += 32)
	{
		vsWaitForDRQ(0xffffffff);
		vsSDIBurstWrite(vsBeepMP3 + i, 32);
	}
	vsSendZeroStream();
}

void vsSendZeroStream(void)
{
	uint32_t i;
	for(i = 0; i < 2048; i += 32)
	{
		vsWaitForDRQ(0xffffffff);
		vsSDIBurstWrite(vsZeroStream, 32);
	}
}

⌨️ 快捷键说明

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