📄 vs1002.c
字号:
}
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 + -