|
|
View previous topic :: View next topic |
Author |
Message |
rajshek_2010
Joined: 24 Nov 2005 Posts: 5
|
PIC with VLSI 1003 MP3 Decoder |
Posted: Tue Oct 07, 2008 12:55 am |
|
|
We are not able to do successful sine test. We are using the NEWMODE
SCI Interface seems to be working fine, since we are able to read write
data to registers.
Since Sine test / Memory test / SCI test are not working, looks like we
have an issue with SPI Interface.
For eg. In SCI test,
1. We shift to test mode by writing 0x0820 to the SCI Mode register
2. We are able to read the SCI Mode register as 0x0820
3. But we don’t get the same value from HDATAO register after
performing SCI test.
I am posting the sample code for reference:
Code: |
//#define Mp3PutInReset() output_high(MP3_XRESET)
#define Mp3PutInReset() output_low(MP3_XRESET)
/** Release the MP3 player chip from reset */
#define Mp3ReleaseFromReset() output_high(MP3_XRESET)
//#define Mp3ReleaseFromReset() output_low(MP3_XRESET)
/** Pull the VS10xx Control Chip Select line Low */
#define Mp3SelectControl() output_low(MP3_XCS)
/** Pull the VS10xx Control Chip Select line High */
#define Mp3DeselectControl() output_high(MP3_XCS)
/** Pull the VS10xx Data Chip Select line Low */
#define Mp3SelectData() output_low(MP3_XDCS)
/** Pull the VS10xx Data Chip Select line High */
#define Mp3DeselectData() output_high(MP3_XDCS)
#define SPIPutChar spi_write
/** Write VS10xx register*/
void Mp3WriteRegister(addressbyte,highbyte,lowbyte)
{
Mp3SelectControl();
SPIPutChar(VS_WRITE_COMMAND); //SPIPutCharWithoutWaiting
SPIPutChar((addressbyte));
SPIPutChar((highbyte));
SPIPutChar((lowbyte));
//SPIWait();
Mp3DeselectControl();
while (!INPUT(MP3_DREQ)); /* wait for startup */
}
int16 Mp3ReadRegister(addressbyte)
{
int8 high_byte,low_byte;
int16 read_data=0;
Mp3SelectControl();
SPIPutChar(VS_READ_COMMAND); //SPIPutCharWithoutWaiting
SPIPutChar((addressbyte));
while(!spi_data_is_in() );
// SPIPutChar(0xff);
// delay_us(10);
high_byte = spi_read(0);
// SPIPutChar(0xff);
delay_cycles(50);
// while(!spi_data_is_in() );
low_byte = spi_read(0);
//SPIWait();
Mp3DeselectControl();
read_data = make16(high_byte,low_byte);
while (!INPUT(MP3_DREQ)); /* wait for startup */
return read_data;
}
/** Soft Reset of VS10xx (Between songs) */
void Mp3SoftReset(){
/* Soft Reset of VS10xx */
Mp3WriteRegister (SPI_MODE, 0x08, 0x04); /* Newmode, Reset, No L1-2 */
Delay_ms(1); /* One millisecond delay */
while (!INPUT(MP3_DREQ)); /* wait for startup */
/* Set clock register, doubler etc. */
Mp3WriteRegister(SPI_CLOCKF, 0xa6, 0x96);
// Mp3WriteRegister(SPI_CLOCKF, 0x1A, 0x5E);
Delay_ms(1); /* One millisecond delay */
/* Send null bytes to data interface */
Mp3SelectData();
SPIPutChar(0);//SPIPutCharWithoutWaiting
SPIPutChar(0);
SPIPutChar(0);
SPIPutChar(0);
// SPIWait();
Mp3DeselectData();
}
/** Set VS10xx Volume Register */
void Mp3SetVolume(leftchannel,rightchannel)
{
Mp3WriteRegister(11,(leftchannel),(rightchannel));
}
/** Reset VS10xx */
void Mp3Reset()
{
Mp3PutInReset();
Delay_ms(1);
/* Send dummy SPI byte to initialize SPI */
SPIPutChar(0xFF);//SPIPutCharWithoutWaiting
/* Un-reset MP3 chip */
Mp3DeselectControl();
Mp3DeselectData();
Mp3ReleaseFromReset();
// Mp3SetVolume(0xFF,0xFF);
/* Set clock register, doubler etc. */
// Mp3WriteRegister(SPI_CLOCKF, 0xa6, 0x96); //oli 0xa66c//XTAL-35MHZ
// Mp3WriteRegister(SPI_CLOCKF, 0x1A, 0x5E); //oli 0xa66c//XTAL-35MHZ
/* Wait for DREQ */
while (!INPUT(MP3_DREQ));
/* Slow sample rate for slow analog part startup */
Mp3WriteRegister(SPI_AUDATA, 0, 10); /* 10 Hz */
Delay_ms(100);
/* Switch on the analog parts */
Mp3SetVolume(0xfe,0xfe);
// Mp3WriteRegister (SPI_AUDATA, 0xac, 0x45); //44100hz/* 8kHz */
Mp3WriteRegister (SPI_AUDATA, 31, 64); //44100hz/* 8kHz */
// Mp3SetVolume(20,20);
Mp3SoftReset();
/*********test and implement*/
// SPISetFastClock();
}
/** VS10xx Sine Test Function - Good getting started example */
void VsSineTest()
{
/* Reset MP3 chip */
Mp3PutInReset(); /* Pull xRESET low -> hardware reset */
Delay_MS(100); /* 100 ms delay */
/* Send dummy SPI byte to initialize SPI of Atmel microcontroller */
SPIPutChar(0xFF);//SPIPutCharWithoutWaiting
/* Un-reset MP3 chip */
Mp3DeselectControl(); /* Pull xCS high */
Mp3DeselectData(); /* Pull xDCS high */
Mp3ReleaseFromReset(); /* Pull xRESET high */
Delay_MS(100); /* 100 ms delay */
GREEN_LED_ON();// = LED_ON;
RED_LED_ON();// = LED_ON;
/* VS10xx Application Notes, chapter 4.8 ---------------------------------*/
/* As an example, let's write value 0x0820 to register 00 byte by byte */
Mp3SelectControl(); /* Now SPI writes go to SCI port */
SPIPutChar(0x02); /* Send SPI Byte, then wait for byte to be sent. */
SPIPutChar(0x00); /* 0x02 was WRITE command, 0x00 is register number */
SPIPutChar(0x08); /* This byte goes to MSB */
SPIPutChar(0x20); /* ..and this is LSB. (0x20=Allow Test Mode) */
SPIPutChar(0x00);
// SPIWait(); /* Wait until Atmel MCU signals SPI write complete */
Mp3DeselectControl(); /* Now SPI writes don't go to SCI port */
delay_ms(1);
mode_data=Mp3ReadRegister(SPI_MODE);
while (!INPUT(MP3_DREQ)); /* Wait for DREQ = 1 */
; /* Do nothing while waiting for DREQ = 1 */
/* Send a Sine Test Header to Data port*/
Mp3DeselectControl();
Mp3SelectData(); /* Now SPI writes go to SDI port */
delay_us(100);
SPIPutChar(0x53); /* - This is a special VLSI Solution test header - */
delay_us(100);
SPIPutChar(0xef); /* - that starts a sine sound. It's good for - */
delay_us(100);
SPIPutChar(0x6e); /* - testing your code, the chip and also for - */
delay_us(100);
SPIPutChar(0x44);//(0x00); /* - seeing if your MP3 decoder was manufactured - */
delay_us(100);
SPIPutChar(0x00); /* - by VLSI Solution oy. ------------------------ */
delay_us(100);
SPIPutChar(0x00);
delay_us(100);
SPIPutChar(0x00);
delay_us(100);
SPIPutChar(0x00);
delay_ms(100);
SPIPutChar(0x00);
// SPIWait();
Mp3DeselectData();
RED_LED_OFF();// = LED_OFF;
Delay_MS (10000); /* 500 ms delay */
GREEN_LED_OFF();// = LED_OFF;
// WHILE(1);
/* Stop the sine test sound */
Mp3SelectData();
SPIPutChar(0x45);
SPIPutChar(0x78);
SPIPutChar(0x69);
SPIPutChar(0x74);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
SPIPutChar(0x00);
// SPIWait();
Mp3DeselectData();
Delay_MS(500); /* 500 ms delay */
}
/** VS10xx Memory Test Function - Good getting started example */
void VsMemoryTest()
{
/* Reset MP3 chip */
Mp3PutInReset(); /* Pull xRESET low -> hardware reset */
Delay_MS(100); /* 100 ms delay */
/* VS10xx Application Notes, chapter 4.8 ---------------------------------*/
/* As an example, let's write value 0x0820 to register 00 byte by byte */
Mp3SelectControl(); /* Now SPI writes go to SCI port */
SPIPutChar(0x02); /* Send SPI Byte, then wait for byte to be sent. */
SPIPutChar(0x00); /* 0x02 was WRITE command, 0x00 is register number */
SPIPutChar(0x08); /* This byte goes to MSB */
SPIPutChar(0x20); /* ..and this is LSB. (0x20=Allow Test Mode) */
// SPIWait(); /* Wait until Atmel MCU signals SPI write complete */
Mp3DeselectControl(); /* Now SPI writes don't go to SCI port */
delay_ms(1);
mode_data=Mp3ReadRegister(SPI_MODE);
while (!INPUT(MP3_DREQ)) /* Wait for DREQ = 1 */
; /* Do nothing while waiting for DREQ = 1 */
/* Send a Sine Test Header to Data port */
Mp3SelectData(); /* Now SPI writes go to SDI port */
// delay_us(100);
SPIPutChar(0x4D); /* - This is a special VLSI Solution test header - */
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0xEA); /* - that starts a sine sound. It's good for - */
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0x6D); /* - testing your code, the chip and also for - */
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0x54);//(0x00); /* - seeing if your MP3 decoder was manufactured - */
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0x00); /* - by VLSI Solution oy. ------------------------ */
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0x00);
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0x00);
// Mp3SelectData(); /* Now SPI writes go to SDI port */
SPIPutChar(0x00);
delay_us(100);
// SPIWait();
Mp3DeselectData();
Delay_MS (40); /* 500 ms delay */
mode_data=Mp3ReadRegister(SPI_HDAT0);
Delay_MS(500); /* 500 ms delay */
}
/** VS10xx SCI Test Function - Good getting started example */
void VsSCITest()
{
/* Reset MP3 chip */
Mp3PutInReset(); /* Pull xRESET low -> hardware reset */
Delay_MS(100); /* 100 ms delay */
Mp3WriteRegister(SPI_MODE,0x08,0x20);
delay_ms(1);
mode_data=Mp3ReadRegister(SPI_MODE);
while (!INPUT(MP3_DREQ)) /* Wait for DREQ = 1 */
; /* Do nothing while waiting for DREQ = 1 */
/* Send a Sine Test Header to Data port */
Mp3SelectData(); /* Now SPI writes go to SDI port */
while (!INPUT(MP3_DREQ));
SPIPutChar(0x53); /* - This is a special VLSI Solution test header - */
while (!INPUT(MP3_DREQ));
SPIPutChar(0x70); /* - that starts a sine sound. It's good for - */
while (!INPUT(MP3_DREQ));
SPIPutChar(0xee); /* - testing your code, the chip and also for - */
while (!INPUT(MP3_DREQ));
SPIPutChar(0x48);//(0x00); /* - seeing if your MP3 decoder was manufactured - */
while (!INPUT(MP3_DREQ));
SPIPutChar(0x00); /* - by VLSI Solution oy. ------------------------ */
while (!INPUT(MP3_DREQ));
SPIPutChar(0x00);
while (!INPUT(MP3_DREQ));
SPIPutChar(0x00);
while (!INPUT(MP3_DREQ));
SPIPutChar(0x00);
while (!INPUT(MP3_DREQ));
// SPIWait();
Mp3DeselectData();
while (!INPUT(MP3_DREQ)) /* Wait for DREQ = 1 */
; /* Do nothing while waiting for DREQ = 1 */
mode_data=Mp3ReadRegister(SPI_HDAT0);
while (!INPUT(MP3_DREQ));
mode_data=Mp3ReadRegister(SPI_MODE);
while (!INPUT(MP3_DREQ));
mode_data=Mp3ReadRegister(SPI_STATUS);
while (!INPUT(MP3_DREQ));
mode_data=Mp3ReadRegister(SPI_CLOCKF);
while (!INPUT(MP3_DREQ));
mode_data=Mp3ReadRegister(SPI_VOL);
Delay_MS(500); /* 500 ms delay */
}
int8 spi_man_read(void)
{
signed int8 bit_cnt, data=0;
for(bit_cnt=7;bit_cnt>=0;bit_cnt--)
{
OUTPUT_LOW(MP3_XSCLK);
delay_cycles(2);
OUTPUT_HIGH(MP3_XSCLK);
OUTPUT_HIGH(MP3_XSI);
if(INPUT(MP3_XSO)) bit_set(data,bit_cnt);
delay_cycles(2);
OUTPUT_LOW(MP3_XSI);
}
return data;
} |
Hoping someone is there to help us out. |
|
|
giomm Guest
|
|
Posted: Mon Oct 13, 2008 8:41 am |
|
|
Hi rajshek_2010
I'm using a VS1053, slightly different of vs1003 but I think the sine wave test are similar mode.
I've found a lot of issue about the spi com with this chip, 1st of all the speed.
You need to initialize the pic spi baudrate not over 1Mbit, otherwise the chip cannot rx correct data, 1st op after boot you need to setup a CLOCKF (rise the chip clock to > 50Mhz) register and so you can rise the baudrate to 10Mbit or more.
Before any other test on chip try to read a status register, the only register that boot value is more than 0 (check the boot value on datasheet), if you read something different to 0 o ff your vs1003 probably understang you so try other commands or a sine test.
Also check the DREQ pin, if it's low one second after boot, probably you have an hardware problem.
Bye
Giomm |
|
|
rajshek_2010
Joined: 24 Nov 2005 Posts: 5
|
thanks |
Posted: Sat Oct 18, 2008 9:57 am |
|
|
thanks a lot giom. You are absolutely correct. We wrote our own spi instead of PIC h/w spi. The chip started working perfectly.
But now the issue is too slow for us. I need to use the H/W spi of PIC.
Will try setting the CLOCK>50Mhz and let you knw. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|