اطلاعیه

Collapse
No announcement yet.

مشکل در خواندن و نوشتن سکتور به سکتور در mmc

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

    مشکل در خواندن و نوشتن سکتور به سکتور در mmc

    سلام.
    من دارم روی یک مداری کار میکنم که از طریق پورت سریال کامپیوتر یک سری داده به مدار بفرسته و مدار اون هارو روی mmc ذخیره کنه. و مدار این قابلیت رو داره که همون داده هارو از روی mmc میخونه و به کامپیوتر ارسال میکنه . برنامه کامپیوترشم نوشتم که قابلیت دریافت و ارسال رو هم داشته باشه.
    مدار هم شامل atmega8 با کریستال داخلی 8 , و قسمت mmc رو هم از lf33 استفاده کردم واسه تغذیه و از پورتکل spi استفاده میکنم. مدار کاملا درست کار میکنه فقط چندتا مشکل به وجود میاد در اجرای برنامه.

    1.وقتی میخوام در سکتورهای بالا مثلا 500,000 به بالا داده ای بنویسم دو حالت پیش میاد.
    1-1 : عملیات موفقیت آمیزه >> ولی mmc در خواندن همون سکتور به مشکل میخوره و اررور میده ، و باید مدارو ریست کنیم چون دگ نه چیزی میشه نوشت نه خوند ، ولی مدار ریست میشه میتونیم بنویسیم.
    1-2 : mmc نمیتونه بنویسه.

    2.وقتی با کامپیوتر داده هارو از طریق یک حلقه به مدار ارسال میکنم (40 خط داده : از سکتور 0 تا 39)، فقط تا سکتور 10 مینویسه و بقیه سکتور ها رو نا دیده میگیره.. و داده های 10 تا 20 حلقه رو مینویسه... یعنی سکتور 0تا10 داده های 10 تا 20 حلقه....

    در ارسال ها و دریافت داده در سکتور های پایین مثلا سکتور های 10000 به پایین هیچ مشکلی نیست.
    گاهی پیش میاد وقتی مدار ارور میده دادهایی که قبلا نوسته شده تغییر میکنه مثلا میشه : acxsij23oi4?@#$?# یه همچین چیزی......

    از رم sd و 1 گیگ ،
    از کتاب خونه mmc.h با کمی تغییرات استفده میکنم :

    #include <spi.h>
    #include <delay.h>
    #define CS_0 PORTB.4 = 0
    #define CS_1 PORTB.4 = 1
    #define OK PORTB.0 = 0
    #define WR PORTB.1 = 1
    #define ER PORTB.0 = 1
    #define RD PORTB.1 = 0
    //char str[5];
    int res;
    unsigned long int MMC_ADR;
    unsigned char MMC_Buffer[512];

    char Command(char befF, unsigned int AdrH, unsigned int AdrL, char befH )
    {

    CS_0;
    spi(0xFF);
    spi(befF);
    spi((char)(AdrH >> 8));
    spi((char)AdrH);
    spi((char)(AdrL >> 8));
    spi((char)AdrL);
    spi(befH);
    spi(0xFF);
    return spi(0xFF);

    }

    char MMC_Init(void) {

    char i;
    DDRB = 0x2F;
    PORTB = 0xFF;
    delay_us(10);
    PORTB = 0x00;
    SPCR=0x50;
    SPSR=0x01;
    RD ;
    OK;

    CS_1;
    for(i=0; i < 100; i++)
    spi(0xFF);
    CS_0;
    if( Command(0x40,0,0,0x95) != 1)
    {
    ER;
    printf("#init fail"
    return 0;
    }

    do
    {
    res = Command(0x41,0,0,0xFF);
    spi(0xFF);
    ER;
    }while(res != 0);
    OK;
    return 1;
    }


    char Write_MMC(unsigned long int N)
    {
    unsigned int i;
    char c;
    MMC_ADR = N;
    MMC_ADR *= 512;
    WR;
    OK;
    res = Command(0x58,(unsigned int)(MMC_ADR >> 16),(unsigned int)(MMC_ADR),0xFF);
    if (res !=0)
    {
    printf("#512 mode"
    ER;
    return 0;
    }
    spi(0xFF);
    spi(0xFF);
    spi(0xFE);

    for (i=0;i<512;i++)
    spi(MMC_Buffer[i]);

    spi(0xFF);
    spi(0xFF);
    c = spi(0xFF);
    c &= 0x1F;
    if (c != 0x05)
    {
    ER;
    printf("#Write faild"
    return 0;
    }
    i=0;
    while(spi(0xFF) != (char)0xFF);
    {
    if(++i>5000)
    {
    ER;
    printf("#busy"
    return 0;
    }
    }
    OK;
    return 1;
    }

    char Read_MMC(unsigned long int N)
    {
    unsigned int i;
    MMC_ADR = N;
    MMC_ADR *= 512;
    RD;
    res = Command(0x51,(unsigned int)(MMC_ADR >> 16),(unsigned int)(MMC_ADR),0xFF);
    if (res != 0)
    {
    printf("#read faild"
    ER;
    return 0;
    }
    i = 0;
    while(spi(0xFF) != (char)0xFE)
    {
    if(++i==10000){
    ER;
    printf("#time out"
    return 0;
    }
    delay_us(100);
    }
    for(i=0; i < 512; i++)
    MMC_Buffer[i] = spi(0xFF);

    OK;
    return 1;
    }


    اگه کمک کنین ممنون میشم. و خیلی دوس دارم بدونم چطور میشه حجم رم رو با کد بدست آورد و چطور همه سکتور هارو پاک کرد.

    مرسی.

    #2
    پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

    سلام :sad:
    یعنی کسی نیس یک راهنمایی کنه که مشکل از کجاس؟ دیشب از یک کتابخانه mmc.h که در یکی از تاپیک ها بود(به نام جمع آوری کتابخانه های avr اگه اشتباه نکنم) استفاده کردم که اصلا به من جواب نداد.حتی کار عادیشو....

    من هیچ مشکلی در حالت کار عادی با mmc ندارم. داده هارو خودم دونه دونه وقتی به سریال بورد میفرستم اون هم دونه دونه توی سکتورها ذخیره میکنه ولی اینکار و توی سکتورهای 500000 به پایین به خوبی انجام میده .
    به این طریق که : برنامه ای جدا با c#.net نوشتم که مثلا دستور زیر رو با سریال به میکرو میفرسته :
    >0:salam;
    بورد هم تشخیص میده باید در سکتور 0 کلمه salam رو بنویسه... و همین حالت برای خواندن از سکنور های مموری وجود داره .با دستوری شماره سکتورو واسه برد میفرستم و اون هم داده هارو به کمپیوتر ارسال میکنه....

    مشکل دوم اینه که داده هارو در یک حلقه به صورت خودکار واسه مدارم بفرسته مدارم درس کاریو که باید انجام بده نمیده...مثلا میگم از سکتور 0 تا 40 یک سری داده بفرست(حتی یک تاخیر هم گذاشتم واسه هر ارسال میزارم 1000 ms و حتی منتظر جواب موفقیت آمیز بودن Write_MMC هم میمونم) نمیدونم چرا از داده 10 ام شروع به نوشتن میکنه ... :angry: از اون بد تر فقط داده های 10 تا 20 حلقه رو از سکتور 0 تا 10 مینویسه... بعنی سکتور های 11 تا 39 هیچ و داده هایی که در 0 تا 9 حلقه و 21 تا 39 حلقه هم هیچ...:cry:

    من پروگرم stk500 نوآوران الکترونیک دارم.فیوز بیک کلاک رو روی 8m داخلی تنظیم کردم(در avr studio)،دلم میخواد ار کریستال خارجی استفاده کنم ولی هر کار که کردم نتونسم،فک میکردم اگه کریستال بزارم مدار بهتر جواب بده....وسط پروگرم کردن ارور میده...کاملا مثل دستور عمل پروگرامر مراحل و انجام میدم ولی نمیشه که نمیشه...

    ممکنه واسه کریستال داخلی باشه ؟ مثلا نتونه یک سری عملیاتو به صورت مدام انجام بده...؟ چون هم داره با spi کار میکنه و هم usart ؟
    آخه دقیقا 40 تا ok میده موقع نوشتن یعنی 40 تا سکتورو موفقیت آمیز اعلام میکنه ولی وقتی اون رکوردهارو میخونم میبینم ، نه اینجوریا هم نیس سکتورهای 0 تا 10 رو فقط مینویسه بقیه سکتور ها دست نخوردس یا اگه هم نوشته باشه اونی نیس که من داده باشم...
    چه فرقی داره من دونه دونه بگم بنویس یا با یک سیکله پشت هم ... :cry:

    آقا اکه کسی یه راهنمایی یا تجربه ای مشابه داره مطرح کنه ممنون میشم.... :sad:

    دیدگاه


      #3
      پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

      یعنی بعد این چند روز هیچکی یک نظر کوچیکم نداشت؟! oo:
      خودم خیلی از مشکلات بالارو حل کردم.واقعا ممنونم که با عدم پاسخ به سوالم باعث شدین خودم مشکلمو حل کنم(با یک تاخیر 50ms تو برنامه ارسال دادها؛البته موقتا)....چطور تاپیکای دگ پرجوابه نکنه چون من تازه واردم اینجوریه.... :agree:

      حداقل یک مرد پیدا بشه بگه چرا تو بعضی از سکتورا نمیشه داده هارو ذخیره کرد !!! مجبور میشم منبع تغذیه رو جدا کنم تا به کارم ادامه بدم چون وقتی ننویسه کلا دگ توی سکتورای دگ هم نمینویسه با init کردن هم درس نمیشه فقط باید روشن خاموش کرد. تو سکتورای پایین اینجوری نیست.هیچ مشکلی نداره.
      به همین سوال جواب بدین لااقل....مرسی


      دیدگاه


        #4
        پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

        سلام.
        در صورت امکان با یه mmc دیگه هم امتحان کنید.
        اگه باز هم مشکل وجود داشت خوب احتمال زیاد مال کدی هست که از اون استفاده میکنید.
        اگه زبان بیسیک بلدید به مجله نویز 3 مراجعه کنید.
        تو این مجله یه برنامه بسکام به روش سکتوری وجود داره که کار میکنه.
        البته یه مشکل کوچیک داره این که حتما mmc رو باید یک بار با ویندوز xp فرمت کرد.
        چراش به عهده اساتید.
        تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

        دیدگاه


          #5
          پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

          سلام دوست عزیز.من از sd یگ گیگ استفاده میکنم که با تبدیل کار میکنم ، آخه mmc گیر نمیاد با حجم یگ گیگ، 4 گیگ هم امتحان کردم init نمیشه. برنامه توی سکتورهای پایین مثل 100000 و 500000 خوب کار میکنه ولی عجیبه که سکتورها بالا میره مشکل پیدا میکنه...و جالبتر اینه وقتی مثلا روی سکتور یک میلیون میخوام یک داده بنویسم وقتی ناموفق میشه دگ نمیشه کاری کرد.باید برق مدار رو قطع کنیم و دوباره وصل کنیم.حتی با ریست میکرو درس نمیشه.فک کنم در اصل ولتاژ مموری باید قطع بشه تا درس بشه یا یک بار مموریو از مدار خارج کنیم .دلیلش چی میتونه باشه؟ نمیتونم بدونم قطع کردن برق کل مدار به صورت اتوماتیک برق مموریو قطع و وصل کنم؟تو مواقعی که به اررو بر میخورم؟
          یک سوال دگ که هس اینه نمیتونم تعداد سکتورهارو دقیق توی برنامه محاسبه کنم؟
          و امکانش هس به جای 512 بایت سکتور 1024 تایی استفاده کنم؟یکبار فایل mmc.h رو واسه 1024 تنظیم کردم ولی پیکر بندی نکرد.

          اگه باز هم کمکم کنین ممنون میشم

          دیدگاه


            #6
            پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

            من تا حالا با این مشکلاتی که شما گفتید بر نخوردم.
            اما با فرض سالم بودن کارت حافظه،مشکل از کدی که با اون کار میکنید.
            از کتاب خونه mmc.h با کمی تغییرات استفده میکنم
            پیشنهاد میکنم از کتابخونه استاندارد اسفاده کنید.بدون تغییرات.
            نمیتونم بدونم قطع کردن برق کل مدار به صورت اتوماتیک برق مموریو قطع و وصل کنم؟تو مواقعی که به اررو بر میخورم؟
            اگه اصرار به استفاده از همین کد دارید و قطع تغذیه مشکلتون رو حل میکنه:
            چون کارت حافظه جریان زیادی نمیکشه میشه ولتاژ تغذیه ش رو از یک پین میکرو گرفت.البته با رگولاتور.
            باز هم میگم:
            با فرض سالم بودن کارت حافظه،مشکل از کدی که با اون کار میکنید.
            تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

            دیدگاه


              #7
              پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

              مهدی جان از راهنمایی مفیدت ممنونم.
              کد mcc.h رو گذاشتم اگه توجه کنی تغغیراته خاصی نداره فقط در مواقع ارور دادن یک ال ای دیو روشن میکنه.البته خروجی ارور هارو قبلا با ارسال سریال چک کردم.مشکلی نبوده.واقعا واسه خودم هم جای تعجب داره
              فقط یک سوال کوچیک دگ.تعداد سکتور هارو چطور میتونم دقیق محاسبه کنم؟ و میتونم فرمت 512 بایتی سکتورهارو به 1024 تغییر بدم؟

              راستشو بخوای دارم واسه خودم تابلوی روان درست میکنم.دارم سعی میکنم داده هارو از توی mmc بخونم.برنامه اسکن کردن نوشتهارو نوشتم و با سریال به میکرو میفرستم.بنظرت مشکلی که نداره؟

              دیدگاه


                #8
                پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

                خواهش میکنم :smile:
                برنامه اسکن کردن نوشتهارو نوشتم و با سریال به میکرو میفرستم
                چرا خودتو به زحمت انداختی قبلا آقای تفرشی این کار رو انجام دادن. اینجا رو نگاه کن.
                تعداد سکتور هارو چطور میتونم دقیق محاسبه کنم؟
                نرم افزار winhex رو دانلود کن و مموری رو باهاش باز کن.
                اطلاعات خوبی بهت میده و میتونی محتویات سکتور ها رو ببینی و تغییر بدی.تعداد سکتور ها رو هم بهت میده.
                میتونم فرمت 512 بایتی سکتورهارو به 1024 تغییر بدم؟
                این ذات microSD هست که سکتور هاش 512 بایتیه.فکر نکنم بشه تغییر داد.
                خوب هر وقت خواستی ازش بخونی دوتا سکتور بخون.

                باز هم سوالی بود در خدمتم.
                تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

                دیدگاه


                  #9
                  پاسخ : مشکل در خواندن و نوشتن سکتور به سکتور در mmc

                  سلام دوست عزیز یکی از دوستان یه مثال در مورد خوندن و نوشتن در سکتور مورد نظر گذاشته شاید به دردتون بخوره

                  لینک زیر
                  http://www.eca.ir/forum2/index.php?topic=59702.30

                  دیدگاه

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