اطلاعیه

Collapse
No announcement yet.

ساخت mp3 player با vs1003

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ساخت mp3 player با vs1003

    با سلام

    بچه ها من پروژه کارشناسی خودم رو ساخت یک دستگاه mp3 player با آی سی vs1003 انتخاب کردم و تقریبا تموم شده ، زبان برنامه نویسی c رو واسه نوشتن این پروژه انتخاب کردم ، من از fat 32 استفاده نمی کنم و فقط می خوام سکتور ها رو پشت سر هم به vs1003 بفرستم و پخش کنم و بعدا خودم تکمیلش می کنم . حالا سوال من اینه که من اول یک برنامه برای تست سینوسی vs1003 نوشتم ولی هیچ اتفاقی تو خروجی هدفون ها نمی افته
    پایه های DREQ و XTEST , RX همیشه روی 2.8 ولت هستن و پایه dreq هیچ وقت صفر نمی شه
    تمام vcc های مدار هم به 2.8 ولت وصل کردم (هم کارت حافظه ، هم میکرو mega32 و هم vs1003 )
    حالا من چند تا سوال داشتم اگه لطف کنین جواب بدین خیلی خوشحال می شم .این برنامه تستی هستش که فعلا براساس datasheet نوشتم سوالام رو زیر برنامه نوشتم .
    کد:
    #include <mega32.h>
    #include <delay.h>
    #include <spi.h>
    #include<stdlib.h> 
    #include <lcd.h>
    #asm
      .equ __lcd_port=0x1B ;PORTA
    #endasm
    
    
    #define xRESET PORTB.2    // put vs in hardware reset (output pin)
    #define xDCS PORTB.0     //data chip select / byte sync (output pin)
    #define DREQ PINB.1     //data request (input pin)
    #define xCS PORTB.4      //chip select (output pin)
    
    
    
    
    #define VS_WRITE_COMMAND 0x02 
    #define VS_READ_COMMAND 0x03
    #define SPI_MODE    0x0  
    #define SPI_STATUS   0x1  
    #define SPI_BASS    0x2  
    #define SPI_CLOCKF   0x3  
    #define SPI_DECODE_TIME 0x4  
    #define SPI_AUDATA   0x5  
    #define SPI_WRAM    0x6  
    #define SPI_WRAMADDR  0x7  
    #define SPI_HDAT0    0x8  
    #define SPI_HDAT1    0x9  
    #define SPI_AIADDR   0xa  
    #define SPI_VOL     0xb  
    #define SPI_AICTRL0   0xc  
    #define SPI_AICTRL1   0xd  
    #define SPI_AICTRL2   0xe  
    #define SPI_AICTRL3   0xf  
    #define SM_DIFF     0x01  
    #define SM_JUMP     0x02  
    #define SM_RESET    0x04  
    #define SM_OUTOFWAV   0x08  
    #define SM_PDOWN    0x10  
    #define SM_TESTS    0x20  
    #define SM_STREAM    0x40  
    #define SM_PLUSV    0x80  
    #define SM_DACT     0x100  
    #define SM_SDIORD    0x200  
    #define SM_SDISHARE   0x400  
    #define SM_SDINEW    0x800  
    #define SM_ADPCM    0x1000  
    #define SM_ADPCM_HP   0x2000  
    
    unsigned int SPI_DATA=0;
    
    
    void SetReg(unsigned char REG,unsigned char LEFT,unsigned char RIGHT)
    {
        
         
        while(!DREQ);
        lcd_clear();
      lcd_putsf("DREQ IS LOW");
        xCS=0;
        spi(0x02);
        spi(REG);   // spi(addressbyte,highbyte,lowbyte )
        spi(LEFT);
        spi(RIGHT); 
        xCS =1;
           }
    
    void ReadReg(unsigned char REG)
    {    xCS=0;
        spi(0x03);
        spi(REG);   // spi(addressbyte) 
        spi(0xff);
        SPI_DATA=((unsigned int)SPDR)<<8 ;
        spi(0xff);
        SPI_DATA|=SPDR;
        xCS=1;
        
    } 
    
    void SineTest()
    {int i; 
        xRESET = 0 ;  
        delay_ms(150);
        spi(0xff);
        xCS =1;
        xDCS = 1;
        xRESET = 1;
        spi(0xff);
        delay_ms(1);
        xCS = 0;
        spi(0x02);   /* Send SPI Byte, then wait for byte to be sent. */ 
        spi(0x00);   /* 0x02 was WRITE command, 0x00 is register number */
        spi(0x08);   /* This byte goes to MSB              */
        spi(0x20);   /* ..and this is LSB. (0x20=Allow Test Mode)    */
        xCS = 1; 
         
        
        while (!DREQ);
        /* Send a Sine Test Header to Data port */ 
        
        xDCS=0;         /* Now SPI writes go to SDI port */
        for(i=0;i<100;i++)
    {    spi(0x53);   /* - This is a special VLSI Solution test header - */
        spi(0xef);   /* - that starts a sine sound. It's good for   - */
        spi(0x6e);   /* - testing your code, the chip and also for  - */
        spi(0x44);   /* - seeing if your MP3 decoder was manufactured - */
        spi(0x00);   /* - by VLSI Solution org. ------------------------ */
        spi(0x00);
        spi(0x00);
        spi(0x00);}
        xDCS=1; 
        lcd_clear();
      lcd_putsf("SINE TESTED");
      delay_ms(500);
        
        
        /* Stop the sine test sound */
        xDCS=0;
        spi(0x45);
        spi(0x78);
        spi(0x69);
        spi(0x74);
        spi(0x00);
        spi(0x00);
        spi(0x00);
        spi(0x00);
         xDCS=1;
        lcd_clear();
      lcd_putsf("sine FINISHEDD");
      delay_ms(500);   
        
    
        
    }
    
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B initialization
    // Func7=Out Func6=In Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=Out 
    // State7=0 State6=T State5=0 State4=0 State3=0 State2=0 State1=T State0=0 
    PORTB=0x00;
    DDRB=0xBD;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    delay_ms(1000);
    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 2*500.000 kHz
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First 
    lcd_init(16);
      lcd_clear();
      lcd_putsf("LCD TESTED");
      delay_ms(100);
      SPCR=0x51;
      SPSR=0x00;
      lcd_clear();
      lcd_putsf("SPI TESTED");
      delay_ms(100);
      xRESET = 0 ;  
        delay_ms(150);
        spi(0xff);
        xCS =1;
        xDCS = 1;
        xRESET = 1;
      
    while (1)
       {  
        
        SetReg(SPI_MODE,0x08,0x20);  
        lcd_clear(); 
        lcd_putsf("SPI MODE Were Wrote");
        delay_ms(500);
        ReadReg(SPI_MODE) ; 
        lcd_clear(); 
        lcd_putsf("SPI MODE Were READ");
        delay_ms(500);   
        SetReg(SPI_CLOCKF,0xB3,0xFE); 
        lcd_clear(); 
        lcd_putsf("SPI CLOCKF Were Wrote");
        delay_ms(500);
        ReadReg(SPI_CLOCKF) ; 
        lcd_clear(); 
        lcd_putsf("SPI CLOCKF Were READ");
        delay_ms(500); 
        SetReg(SPI_VOL,0x00,0x00); 
        lcd_clear(); 
        lcd_putsf("SPI VOL Were Wrote");
        delay_ms(500); 
        ReadReg(SPI_VOL); 
        lcd_clear(); 
        lcd_putsf("SPI VOL Were READ");
        delay_ms(500);  
         
         
        lcd_clear();
        lcd_putsf("sine starTED");
        delay_ms(100);     
       SineTest();   
        lcd_clear();
       lcd_putsf("sine STOPED");
      delay_ms(100);
          
        
       
    
       };
    }
    اگه دقت کرده باشین من اول برنامه xreset رو صفر کردم و دوباره یک کردم ، حالا سوال من اینه که کلا چند بار لازمه که xreset صفر بشه همون اول برنامه یه بار صفر بشه کافیه یا مثلا برای نوشتن و خواندن رجیسترهای vs1003 باید دوباره xreset رو صفر و یک کرد ؟
    اگه برنامه ساده ای که مراحل نوشتن یک برنامه تست سینوسی رو دارین و مراحل توی اون رعایت شده رو بتونین بهم بدین خیلی ممنون می شم چون من نمی دونم که ترتیب صفر و یک کردن پایه های vs1003 چطوریه ، مثلا xdcs , xcs , ....

    پس از نوشتن این برنامه من دقیقا از هدفون چه صدایی رو باید بشنوم آیا نیازی هست که قبلش کلاک و رجیسترهای vs1003 رو تنظیم کنم یا مستقیم می تونم شروع به تست سینوسی کنم
    در کل هر نکته مفیدی که قبلا خودتون باهاش مشکل داشتین و می دونین که می تونه کمکم کنه رو اگه بگین خیلی ممنون می شم
لطفا صبر کنید...
X