اطلاعیه

Collapse
No announcement yet.

مشکل نه چندان کوچولو با MMC

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

    مشکل نه چندان کوچولو با MMC

    سلام بر همگی
    من micro sd را با تبدیلش به میکرو وصل کردم به شمایل زیر



    سورس برنامه را هم به شکل زیر نوشتم
    کد:
    #include <mega16.h>
    #include <stdio.h>
    
    #include <delay.h>
    #include <lcd.h>
    
    #asm
      .equ __lcd_port = 0x1B; PORTA
    #endasm
    
    #define xtal 1000000
    
    #include "pff.c"
    #include "mmc.c"
    
    void main(void)
    {
      FATFS fs;
      BYTE buff[];
      CHAR A;
      CHAR buffer[]; 
      UINT br;
      FRESULT res;  
      
      //LCD ON
      lcd_init(16);
      lcd_putsf("hello!");
            
            do
                {
                res = disk_initialize();
                delay_ms(200);
                }while(res != FR_OK); 
    
      // Mount the volume
            do
                {
                res = pf_mount(&fs);
                delay_ms(200);
                }while(res != FR_OK);
      
      
      
      // Open a file
      res = pf_open("test.wav"); 
      if (res == FR_OK)
      {
        lcd_clear();
        lcd_putsf("OK"); 
        delay_ms(1000);
      }
      
      // Moving directly to data chunk :-P 
      //res = pf_lseek(44);
      res = pf_read(buff, 4, &br);  // ChunkID
            
      lcd_clear();
               
        A = buff[0];
        sprintf(buffer,"%x",A);
       
      lcd_puts(buffer);
      
      pf_mount(NULL);
    }


    ولی نتیجه ای نگرفتم و میکرو توی حلقه do اول گیر میکنه یعنی اصلا رم را نمیشناسه
    اتصالات و برق را هم چک کردم
    و حتی کلمه hello که قبل از شناسایی رم است را نشون میده ولی خود رم را نه
    از نحوه ی اتصالات و برق 5 و 3.3 اطمینان کافی دارم

    مشکل از کجاست ؟؟؟ مسیله این است



    ؟

    #2
    پاسخ : مشکل نه چندان کوچولو با MMC

    نوشته اصلی توسط ShahiMV
    سلام بر همگی
    من micro sd را با تبدیلش به میکرو وصل کردم به شمایل زیر



    سورس برنامه را هم به شکل زیر نوشتم
    کد:
    #include <mega16.h>
    #include <stdio.h>
    
    #include <delay.h>
    #include <lcd.h>
    
    #asm
      .equ __lcd_port = 0x1B; PORTA
    #endasm
    
    #define xtal 1000000
    
    #include "pff.c"
    #include "mmc.c"
    
    void main(void)
    {
      FATFS fs;
      BYTE buff[];
      CHAR A;
      CHAR buffer[]; 
      UINT br;
      FRESULT res;  
      
      //LCD ON
      lcd_init(16);
      lcd_putsf("hello!");
            
            do
                {
                res = disk_initialize();
                delay_ms(200);
                }while(res != FR_OK); 
    
      // Mount the volume
            do
                {
                res = pf_mount(&fs);
                delay_ms(200);
                }while(res != FR_OK);
      
      
      
      // Open a file
      res = pf_open("test.wav"); 
      if (res == FR_OK)
      {
        lcd_clear();
        lcd_putsf("OK"); 
        delay_ms(1000);
      }
      
      // Moving directly to data chunk :-P 
      //res = pf_lseek(44);
      res = pf_read(buff, 4, &br);  // ChunkID
            
      lcd_clear();
               
        A = buff[0];
        sprintf(buffer,"%x",A);
       
      lcd_puts(buffer);
      
      pf_mount(NULL);
    }


    ولی نتیجه ای نگرفتم و میکرو توی حلقه do اول گیر میکنه یعنی اصلا رم را نمیشناسه
    اتصالات و برق را هم چک کردم
    و حتی کلمه hello که قبل از شناسایی رم است را نشون میده ولی خود رم را نه
    از نحوه ی اتصالات و برق 5 و 3.3 اطمینان کافی دارم

    مشکل از کجاست ؟؟؟ مسیله این است



    ؟
    سلام دوست من. خوب توی برنامت باید یه سری دستور اضافه کنی که مال راه اندازی تایمر 1 برای فرستادن پالس به مموری کارت هستش
    اینارو به این شکل اضافه کن
    #define T1_OVF_FREQ 100
    #define T1_PRESC 1024L
    #define T1_INIT (0x10000L-(_MCU_CLOCK_FREQUENCY_/(T1_PRESC*T1_OVF_FREQ)))

    interrupt [TIM1_OVF] void timer_comp_isr(void)
    {
    /* re-initialize Timer1 */
    TCNT1H=T1_INIT>>8;
    TCNT1L=T1_INIT&0xFF;
    /* card access low level timing function */
    disk_timerproc();
    }
    اینا قبل از تابع Main برنامه
    و بدش اینارو تو تابع Main اضافه کن:
    TCCR1A=0x00;
    TCCR1B=(1<<CS12)|(1<<CS10);
    TCNT1H=T1_INIT>>8;
    TCNT1L=T1_INIT&0xFF;
    TIMSK=1<<TOIE1;
    امیدوارم نتیجه بگیری :smile:
    هر سری یه فکری داره! :read:
    ///////////////////////////////////////////////////////////

    دیدگاه


      #3
      پاسخ : مشکل نه چندان کوچولو با MMC

      تشکر ولی
      کامپایلر تابع disk_timerproc(); رو نمیشناسه

      از این بگذریم فکر کنم باید وقفه سراسری را فعال کنیم چون از interrupt استفاده کردیم #asm("sei&quot
      حالا از همه ی این ها گذشته ما در mod spi هستیم صحیح
      چرا باید از اینراپت تایمر یک برای پالس به مموری استفاده کنیم مگر خود spi پایه sck نداره ؟؟؟

      ولی به هر حال همه ی حالات موجود را امتحان کردم ولی نشد که نشد

      به قول آقای اسدی
      به همین سادگی

      دیدگاه


        #4
        پاسخ : مشکل نه چندان کوچولو با MMC

        نوشته اصلی توسط ShahiMV
        تشکر ولی
        کامپایلر تابع disk_timerproc(); رو نمیشناسه

        از این بگذریم فکر کنم باید وقفه سراسری را فعال کنیم چون از interrupt استفاده کردیم #asm("sei&quot
        حالا از همه ی این ها گذشته ما در mod spi هستیم صحیح
        چرا باید از اینراپت تایمر یک برای پالس به مموری استفاده کنیم مگر خود spi پایه sck نداره ؟؟؟

        ولی به هر حال همه ی حالات موجود را امتحان کردم ولی نشد که نشد

        به قول آقای اسدی
        به همین سادگی
        دلیل اینکه کامپایلر تابع disk_timerproc(); رو نمیشناسه اینه که شما از تابع pff.h استفاده کردی. اگه از ff.h استفاده کنی درست می شه
        هر سری یه فکری داره! :read:
        ///////////////////////////////////////////////////////////

        دیدگاه


          #5
          پاسخ : مشکل نه چندان کوچولو با MMC

          بعد از کمی دست و پنجه نرم کردن با میکرو و رم راه حل پیدا شد

          که به صورت زیر به سمع و بصر ببیندگان میرسانم(مثلا با کلاس شدم)

          کد:
             PORTB.7=1;  // set SCK high
            DDRB.7=1;  // set SCK as output
             DDRB.6=0;  // set MISO as input
            DDRB.5=1;  // set MOSI as output
            DDRB.4=1;  // SS must be output for Master mode to work
            
            // SPI initialization
            // SPI Type: Master
            // SPI Clock Rate: 250.000 kHz
            // SPI Clock Phase: Cycle Half
            // SPI Clock Polarity: Low
            // SPI Data Order: MSB First
            SPCR=0x52;
            SPSR=0x00;

          ابتدا باید پایه ها رو به صورت صحیح ورودی و خروجی میکردم
          و ثانیا باید spi را در مد صحیح قرار میدادم
          وقتی این چند خط را اضافه کردم میکرو مثل بلبل اطلاعات رو از رم خوند
          پیروز و سربلند
          و به قول آقای اسدی
          به همین سادگی

          دیدگاه


            #6
            پاسخ : مشکل نه چندان کوچولو با MMC

            نوشته اصلی توسط ShahiMV
            بعد از کمی دست و پنجه نرم کردن با میکرو و رم راه حل پیدا شد

            که به صورت زیر به سمع و بصر ببیندگان میرسانم(مثلا با کلاس شدم)

            کد:
               PORTB.7=1;  // set SCK high
              DDRB.7=1;  // set SCK as output
               DDRB.6=0;  // set MISO as input
              DDRB.5=1;  // set MOSI as output
              DDRB.4=1;  // SS must be output for Master mode to work
              
              // SPI initialization
              // SPI Type: Master
              // SPI Clock Rate: 250.000 kHz
              // SPI Clock Phase: Cycle Half
              // SPI Clock Polarity: Low
              // SPI Data Order: MSB First
              SPCR=0x52;
              SPSR=0x00;

            ابتدا باید پایه ها رو به صورت صحیح ورودی و خروجی میکردم
            و ثانیا باید spi را در مد صحیح قرار میدادم
            وقتی این چند خط را اضافه کردم میکرو مثل بلبل اطلاعات رو از رم خوند
            پیروز و سربلند
            و به قول آقای اسدی
            به همین سادگی
            سلام
            اگه لطف کنید نقشه کامل شماتیک راه اندازی و اتصالات به مموری رو بگید خیلی عالی میشه من با اتصال به میکرو مشکل دارم.
            ممنونم

            دیدگاه

            لطفا صبر کنید...
            X