اطلاعیه

Collapse
No announcement yet.

درخواست توضیح خط های برنامه

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

    درخواست توضیح خط های برنامه

    سلام به همگی
    این یه برنامه برای برقراری ارتباط با sd هست . در این برنامه توابعی برای خوندن و نوشتن در SD کارت وجود دارده. من توی خط های 69و70و76و77و123و129و132و134 مشکل دارم کسی میتونه توضیح کامل بده ؟ که اولا این خط ها یعنی چی ودر ضمن چه کاری می کنن ؟
    کد:
    #include <mega32.h>
    #include <delay.h>
    #define MMC_CS_PORT      PORTB
    #define MMC_CS_DDR       DDRB
    #define MMC_CS_PIN       4
    // MMC commands (taken from sandisk MMC reference)
    #define MMC_GO_IDLE_STATE      0     // initialize card to spi-type access
    #define MMC_SEND_OP_COND      1     // set card operational mode
    #define MMC_SEND_CSD        9     // get card"s CSD
    #define MMC_SEND_CID        10    // get card's CID
    #define MMC_SEND_STATE       13
    #define MMC_SET_BLOCKLEN      16    //set number of byte to transferblock
    #define MMC_READ_SINGLE_BLOCK    17    //read a block
    #define MMC_WRITE_BLOCK       24    //write a block
    #define MMC_PROGRAM_CSD       27
    #define MMC_SET_WRITE_PROT     28
    #define MMC_CLR_WRITE_PROT     29
    #define MMC_SEND_WRITE_PORT     30
    #define MMC_TAG_SECTOR_START    32
    #define MMC_TAG_SECTOR_END     33
    #define MMC_UNTAG_SECTOR      34
    #define MMC_TAG_ERASE_GROUP_START  35    // sets beginning of erase group(mass erase)
    #define MMC_TAG_ERASE_GROUP_END   36    //sets end of erase group (mass erase)
    #define MMC_UNTAG_ERASE_GROUP    37
    #define MMC_ERASE          38
    #define MMC_CRC_ON_OFF       59
    #define MMC_R1_BUSY         0X80
    #define MMC_R1_PARAMETER      0X40
    #define MMC_R1_ADDRESS       0X20
    #define MMC_R1_ERASE_SEQ      0X10
    #define MMC_R1_COM_CRC       0X08
    #define MMC_R1_ILLEGAL_COM     0X04
    #define MMC_R1_ERASE_RESET     0X02
    #define MMC_R1_IDLE_STATE      0X01
    
    #define MMC_STARTBLOCK_READ     0XFE
    #define MMC_STARTBLOCK_WRITE    0XFE
    #define MMC_STARTBLOCK_MWRITE    0XFC
    #define MMC_STOPTRAN_WRITE     0XFD
    #define MMC_DE_MASK         0X1F
    #define MMC_DE_ERROR         0X01
    #define MMC_DE_CC_ERROR       0X02
    #define MMC_DE_ECC_FAIL       0X04
    
    #define MMC_DE_OUT_OF_RANGE     0X04
    #define MMC_DE_CARD_LOCKED      0X04
    
    #define MMC_DR_MASK          0X1F
    #define MMC_DR_ACCEPT         0X05
    #define MMC_DR_REJECT_CRC       0X0B
    #define MMC_DR_REJECT_WRITE_ERROR   0X0D
    
    
    
    void mmclint(void);
    unsigned char mmcreset(void);
    unsigned char mmcsendcommand(unsigned char cmd, unsigned long int argument);
    unsigned char mmcread(unsigned long int sector, unsigned char* buffer);
    unsigned char mmcwrite(unsigned long int sector, unsigned char* buffer);
    unsigned char mmccommand(unsigned char cmd, unsigned long int argument);
    //----------------------------------
    void spilnit()
    {
    PORT.7=1;
    DDRB.7=1;
    DDRB.6=0;
    DDRB.5=1;
    DDRB.4=1;
    69) SPCR=0X52;
    70) SPCR=0X00;
    }
    
    unsigned char spitransferbyte(unsigned char data)
    {
    unsigned char received =0;
    76) SPDR = data;
    77) while(!(SPSR&(1<<7)));
    received = SPDR;
    return (received);
    }
    //////////////////////////////////////
    void mmclnit(void)
    {
    spilint();
    MMC_CS_DDR.MMC_CS_PIN=1;
    MMC_CS_PORT.MMC_CS_PIN=1;
    }
    /////////////////////////////////
    
    unsigned char mmcreset(void){
    unsigned char i;
    unsigned char retry;
    unsigned char r1=0;
    retry=0;
    
    do{
    for(i=0;i<10;i++)  spitransferbyte(0xff);    // send dummy byte with CS high before accessing
    r1= mmcsendcommand(MMC_GO_IDEL_STATE,0);          //resetting card go to spi mode
    retry++;
    98) if(retry>10) return-1;
    }while(r1 != 0X01);
    retry=0;
    do
    {
    r1= mmcsendcommand(MMC_SEND_OP_COND,0);        // initializing card for operation
    retry++;
    if(retry>100)return-1;
    }while(r1);
    r1= mmcsendcommand(MMC_CRC_ON,0);       //turn off CRC checking to simplify communication
    
    r1=mmcsendcommand(MMC_SET_BLOCKLEN,512);
    return 0;
    
    }
    //-------------------------------------------------
    unsigned char mmcsendcommand(unsigned char cmd, unsigned long argument){
    unsigned char r1;
    MMC_CS_DDR.MMC_CS_PIN=0;                //assert chip select
    r1= mmccommand(cmd,argument);       //issue the command
    MMC_CS_PORT.MMC_CS_PIN=1;
    return r1;
    
    }
    //-----------------------------------------------
    123) char mmcread(unsigned long int sector,unsigned char* buffer )
    {
    unsigned char r1;
    unsigned i;
    portd.f1=0;
    MMC_CS_DDR.MMC_CS_PIN=0;
    129) r1= mmccommand(MMC_READ_SINGLE_BLOCK,sector<<9);
    if (r1!=0X00)
    return r1;
    132) while(spitransferbyte(0xff)!=MMC_STARTBLOCK_READ);
    for (i=0;i<0X200;i++)
    134) *buffer++ = spitransferbyte(0xff);
    spitransferbyte(0xff);
    spitransferbyte(0xff);
    MMC_CS_PORT.MMC_CS_PIN=1;
    return 0;
    
    
    }
    ///-------------------------------------------------------
    unsigned char mmcwrite(unsigned long int sector,unsigned char* buffer ){
    unsigned char r1;
    unsigned int i;
    MMC_CS_PORT.MMC_CS_PIN=1;
    //issue command
    r1=mmccommand(MMC_WRITE_BLOCK,sector<<9);
    if(r1 != 0X00)
    return r1;
    
    spitransferbyte(0xff)             // send dummy
    
    spitransferbyte(MMC_STARTBLOCK_WRITE);           //send data start token
    for (i=0; i<512; i++)
    156) spitransferbyte(*buffer++);
    spitransferbyte(0xff);
    spitransferbyte(0xff);
    r1=spitransferbyte(0xff);            // write 16-bit crc (dummy values)
    
                             // read data response token
    if((r1&MMC_DR_MASK)!= MMC_DR_ACCEPT)
    return r1;
    164) while(!spitransferbyte(0xff));
    
    MMC_CS_PORT.MMC_CS_PIN=1;              //CS
    return 0;                // return succes
    }
    unsigned char mmccommand(unsigned char cmd,unsigned long int argument){
    char r1;
    char retry=0;
    //send command
    spi_write(cmd |0x40);
    spi_write(argument>>24);
    spi_write(argument>>16);
    spi_write(argument>>8);
    spi_write(argument);
    spi_write(0x95);              //crc valid only for mmc_go_idle_state
    
    175) while((r1 = spitransferbyte(0xff))==0xff)
    176) if(retry++ > 8) break;
    177) return r1;
    }
    ///-------------------------------------------------
    
    char write_buf[512], read_buf[512];
    void main(void) {
    unsigned int i;
    unsigned long int sector;
     mmclnit();
     mmcreset();
    for (i=0;i<512;i++)
    write_buf[i]=i;
    sector=5;
    
    mmcwrite(sector,write_buf);   // write to sector 5
    
    delay_ms(1);
    mmcread(sector,read_buf);    // read of sector 5
    while(1)
    }

    #2
    پاسخ : درخواست توضیح خط های برنامه

    دوست من ، من برای کار کردن با mmc از این دستورا استفاده نمیکنم اما امیدوارم توضیحاتی که برات مینویسم کمکت کنه .
    دوستان اگه جاییشو اشتباه گفتم اصلاح کنن ممنون.

    خط 69 و 70 مربوط به مقدار دهی اولیه رجیستر کنترل رابط spi هست که به صورت زیر راه اندازی شده:

    // SPI initialization
    // SPI Type: Master
    // SPI Clock Rate: 187.500 kHz این فرکانس در صورتیه که کلاک میکرو 12 مگا باشه در واقع نسبت تقسیمه spi
    // SPI Clock Phase: Cycle Half
    // SPI Clock Polarity: Low
    // SPI Data Order: MSB First

    خط 76 مربوط به رجیستر داده spi هست که میتونی تو اون بنویسی و ازش بخونی.

    خط 77 : این دستور برای انتظار جهت به پایان رسیدن ارسال داده هست

    خط 98 :دستور شرط جهت اجرای 10 باره دستور reset جهت وارد شدن به مد spi

    خط123: اجرای دستور mmcread از این دستور جهت خواندن سکتوری از کلاستر mmc استفاده میکنم دیتای خونده شده در بافر مورد نظر که خودمون مشخص میکنم ریخته میشه.

    خط 129: هر موقع از دستور mmccommand استفاده شد بدون که میخوایم به mmc یه فرمانی بدیم

    خط132:این خط با استفاده از دستور while(spitransferbyte(0xff)!=MMC_STARTBLOCK_READ); ابتدای داده در سکتور رو جستوجو میکنه.

    خط134: توسط دستور spitransferbyte دیتا یک بایت یک بایت خونده میشه و درون آرایه که بااسم buffer هست ریخته میشه.

    خط156: ارسال بایت در سکتور مورد نظر که در ابتدای تابع مشخص شده با استفاده از دستور spitransferbyte

    خط 164:انتظار جهت دریافت پاسخ crc و در نهایت باز گرداندن مقدار صفر که موفقیت آمیز بودن ارسال دیتا رو مشخص میکنه.
    [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
    [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

    دیدگاه


      #3
      پاسخ : درخواست توضیح خط های برنامه

      دوست عزیز اگه میبینید توضیحات آقا حمید براتون کامل نبود . بگین تا کلا نحوه ی خوندن از mmc را بگم. :job: :nerd:
      چيزي را بگو که بتواني بنويسي
      چيزي را بنويس که بتواني امضا کني
      چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)

      دیدگاه


        #4
        پاسخ : درخواست توضیح خط های برنامه

        نوشته اصلی توسط حمیدجان
        دوست من ، من برای کار کردن با mmc از این دستورا استفاده نمیکنم اما امیدوارم توضیحاتی که برات مینویسم کمکت کنه .
        دوستان اگه جاییشو اشتباه گفتم اصلاح کنن ممنون.

        خط 69 و 70 مربوط به مقدار دهی اولیه رجیستر کنترل رابط spi هست که به صورت زیر راه اندازی شده:

        // SPI initialization
        // SPI Type: Master
        // SPI Clock Rate: 187.500 kHz این فرکانس در صورتیه که کلاک میکرو 12 مگا باشه در واقع نسبت تقسیمه spi
        // SPI Clock Phase: Cycle Half
        // SPI Clock Polarity: Low
        l
        // SPI Data Order: MSB First

        خط 76 مربوط به رجیستر داده spi هست که میتونی تو اون بنویسی و ازش بخونی.

        خط 77 : این دستور برای انتظار جهت به پایان رسیدن ارسال داده هست

        خط 98 :دستور شرط جهت اجرای 10 باره دستور reset جهت وارد شدن به مد spi

        خط123: اجرای دستور mmcread از این دستور جهت خواندن سکتوری از کلاستر mmc استفاده میکنم دیتای خونده شده در بافر مورد نظر که خودمون مشخص میکنم ریخته میشه.

        خط 129: هر موقع از دستور mmccommand استفاده شد بدون که میخوایم به mmc یه فرمانی بدیم

        خط132:این خط با استفاده از دستور while(spitransferbyte(0xff)!=MMC_STARTBLOCK_READ); ابتدای داده در سکتور رو جستوجو میکنه.

        خط134: توسط دستور spitransferbyte دیتا یک بایت یک بایت خونده میشه و درون آرایه که بااسم buffer هست ریخته میشه.

        خط156: ارسال بایت در سکتور مورد نظر که در ابتدای تابع مشخص شده با استفاده از دستور spitransferbyte

        خط 164:انتظار جهت دریافت پاسخ crc و در نهایت باز گرداندن مقدار صفر که موفقیت آمیز بودن ارسال دیتا رو مشخص میکنه.
        ممنون ولی تاثیر * بر روی *char چیه ؟ و اصلا چرا char تنها استفاده نشده است ؟
        و 9>>sector چرا انتخاب شده ببین من میدونم که این دستور میگه بیت های sector به اندازه ی 9 بیت به سمت چپ شیفت پیدا کنه ولی نمیفهم چرا ؟

        دیدگاه


          #5
          پاسخ : درخواست توضیح خط های برنامه

          نوشته اصلی توسط lordsoroosh
          دوست عزیز اگه میبینید توضیحات آقا حمید براتون کامل نبود . بگین تا کلا نحوه ی خوندن از mmc را بگم. :job: :nerd:
          دوست عزیز نیکی و پرسش ! ولی بزار من یک توضیحی قبلش بدم کلا هدفم اینه که توی حافظه SD بتونم بنویسم و ازش بخونم . اما بدون استفاده از توابع آماده در ضمن من با PIC کار می کنم و کامپایلرم هم میکرو سی هستش . خلاصه یه هفته بیشتر که با دیتا شیت این SD درگیرم و لی متاسفانه نتونستم جواب بگیرم تا اینکه به یه مثال توی کتاب آقای پرتوی فر برخوردم که خیلی پیچوندش . اومدم از روی این یه مشابه سازی کنم و یه برنامه برای میکروسی بنویسم . همون طور که متوجه اید توی اینم گیر کردم . حالا اومدم برای ساده سازی اول یه کامند برای SD بفرستم یه جواب دریافت کنم اگه ارتباط برقرار شد برم سراغ نوشتن و خوندن . حالا یه سئوال : از اونجایی که توی این برنامه اومده ُSPI رو خودش فعال کرده و از SS استفاده کرده آیا حتما من باید SPI رو تویPIC خودم پیکره بندی کنم و نمیشه از تابع SPI توی میکروسی استفاده کنم و یکی از پین ها رو بعنوان CS انتخاب کنم ؟

          دیدگاه


            #6
            پاسخ : درخواست توضیح خط های برنامه

            راستش من چیزی از pic نمیدونم . اما فکر کنم باید پیکر بندی کنید .
            چون اینا برای avr هستش و قطعا با رجیستر های pic فرق داره.
            چيزي را بگو که بتواني بنويسي
            چيزي را بنويس که بتواني امضا کني
            چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)

            دیدگاه


              #7
              پاسخ : درخواست توضیح خط های برنامه

              نوشته اصلی توسط lordsoroosh
              راستش من چیزی از pic نمیدونم . اما فکر کنم باید پیکر بندی کنید .
              چون اینا برای avr هستش و قطعا با رجیستر های pic فرق داره.
              نگفتید آیا من حتما باید از SS به عنوان پایه ی chip select استفاده کنم ؟ یعنی نمیشه از یه پین دیگه استفاده کرد ؟ در ضمن در خط های 175, 176,177 ایا دیتا توسط میکرو داره خونده میشه یا داره نوشته میشه ؟ یا هر دوش داره اتفاق میفته ؟
              while((r1 = spitransferbyte(0xff))==0xff)
              if(retry++ > 8) break;
              return r1;

              دیدگاه


                #8
                پاسخ : درخواست توضیح خط های برنامه

                دوست عزیز شما اگه یه کارت حافظه بیشتر ندارین میتونید اصلا برای همیشه پایه ی ss را به زمین وصل کنید.
                چيزي را بگو که بتواني بنويسي
                چيزي را بنويس که بتواني امضا کني
                چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)

                دیدگاه


                  #9
                  پاسخ : درخواست توضیح خط های برنامه

                  نوشته اصلی توسط lordsoroosh
                  دوست عزیز شما اگه یه کارت حافظه بیشتر ندارین میتونید اصلا برای همیشه پایه ی ss را به زمین وصل کنید.
                  یعنی چی ؟ تا جایی که من میدونم فقط لحظه ای که میخوای دیتا ارسال کنی باید چیپ سلکت رو فعال کنی

                  دیدگاه


                    #10
                    پاسخ : درخواست توضیح خط های برنامه

                    درسته. در واقع اگه بخواهید دیتا ارسال کنید باید اون را فعال کنید . اما کارش این نیست.
                    فرض کنید سه تا کارت حافظه دارید و باید روی یکی از اونها تاریخ و روی یکی دیگه زمان و روی اون یکی دما را ذخیره کنید. وقتی همه ی این کارت ها به spi وصل هستند و شما اطلاعات را روی spi ارسال میکنید در واقع همه ی کارت ها اون دیتا ها را میگیرند اما کارتی نسبت به اونها واکنش نشون میده که ss اش فعال باشه. :nerd:
                    چيزي را بگو که بتواني بنويسي
                    چيزي را بنويس که بتواني امضا کني
                    چيزي را امضا کن که بتواني به آن عمل کني (ناپلئون)

                    دیدگاه

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