NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4059 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 4 از 4

موضوع: اشکال در ارتباط eeprom نوع at24c64 با at91sam7x256

  1. #1
    عضو جدید
    تاریخ عضویت
    Mar 2013
    نوشته ها
    17
    تشکر
    5
    تشکر شده 9 بار در 6 پست

    پیش فرض اشکال در ارتباط eeprom نوع at24c64 با at91sam7x256

    سلام دوستان

    من دارم از هدر بورد sam7x-eke v3 استفاده می کنم. قصد دارم با پروتکل I2c یا همون Two Wire Interface، ای2پیرام 24c64 رو به میکرو وصل کنم. هدفم ذخیره کردن تنظیمات هست که با قطع برق از بین نره. این آیسی 8 کیلوبایت ظرفیت داره که کار من رو راه میندازه.
    من سعی کردم مراحل کار رو بدون مشکل طی کنم. با مطالعه منابع زیر:
    http://www.atmel.com/images/doc0336.pdf
    http://www.atmel.com/Images/doc0507.pdf
    نحوه کار این آیسی و نحوه اتصال اون به میکرو رو متوجه شدم. از کد موجود در پوشه "[06] I2c EEPROM" که در cd همراه محصول بود استفاده کردم (با تشکر از کویر الکترونیک). اما مشکلی که دارم اینه که این کد هنوز کاری نمی کنه. نمونه خروجی کد:
    کد:
    IranMicro EKE V3 Board I2c Test MEM. Generate Random Table: 34 A2 D8 42 A1 44 A4 69 14 64 CF CF 7 EC 2D 9 98 D4 DE C3 36 4B 2F C0 C9 18 A2 B1 7 6F 84 37 51 E7 29 17 9E 92 66 99 E 1F 3B 6B DA 50 EE B4 9B 63 Write INTO I2c Mem: OK. Read From I2c Mem: OK. FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Compare Read & Write Buffer: Error IN Byte 0
    ملاحظه می کنید که فقط FF رو از ای2پیرام خونده. کد اصلی مثال، خروجیش رو توی LCD می نوشت که من تغییرش دادم تا توی Debug Unit (UART) بنویسه. تغییر کوچیکی در نحوه آدرس دهی آیسی هم لازم بود که اعمال کردم. کد جدید رو ضمیمه کردم. تغییری که دادم این هست:
    کد:
    char e2p_write_byte(unsigned short adr, char data){ char result; i2csw_start(); result=i2csw_write(0xA0); // SEND EEPROM ADR For Write result+=i2csw_write( (adr >> 8) & 0x00FF ); result+=i2csw_write( adr & 0x00FF ); result+=i2csw_write(data); // Send DATA TO Write i2csw_stop(); delay_ms(10); return (result==3) ? 0:1; } char e2p_read_byte(unsigned short adr){ char data; i2csw_start(); i2csw_write(0xA1); i2csw_write( (adr >> 8) & 0x00FF ); i2csw_write( adr & 0x00FF ); i2csw_start(); i2csw_write(0xA1); data=i2csw_read(NACK); i2csw_stop(); return data; }
    در مورد سخت افزار مدار باید بگم که، پایه های 24c64 رو به صورت زیر وصل کردم (مدل 8 پین PDIP رو دارم، طبق دیتاشیت، صفحه1):
    A0 ، A1 و A2 => زمین
    WP => زمین
    SCL و SDA به ترتیب به پایه های PA11 و PA10 وصلند. ضمناً هر کدام از این دو پایه، جداگانه به یک pullup resistor = 4.6KOhm وصل هستند و اون مقاومت هم به Vss وصله (طبق فایل doc0507).
    برای زمین از پورت 32 و برای Vss از پورت 64 (5ولت) استفاده کردم (طبق فایل HelpFa.pdf موجود در cd، صفحه آخر، که نمی دونم اجازه دارم ضمیمه کنم یا نه). فرکانس کاری رو با 400KHz و 100 و 30 هم تست کردم. اما مشکل پابرجاست. ضمناً با یه 24C64 دیگه هم تست کردم فرقی نکرد.
    علاوه بر این، پروژه basic-twi-eeprom-project-at91sam7x-ek موجود در پوشه atmel source (با تشکر مجدد از کویر الکترونیک) و قابل دانلود از SAM7X-EK (فایل دوم پایین صفحه، Software package، چهل مگابایت) رو هم تست کردم که در اون هم به ایراد خوردم و هیچ بایتی خونده یا نوشته نشد.
    مطمئنم کارم یه ایراد تابلو داره اما من چون تازه کارم نتونستم بفهمم.

    ممنون از توجهتون و ببخشین طولانی شد
    فايل هاي پيوست شده فايل هاي پيوست شده

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر فعال
    تاریخ عضویت
    Nov 2009
    نوشته ها
    115
    تشکر
    77
    تشکر شده 83 بار در 35 پست

    پیش فرض

    سلام
    اولين كتاب مرجع كامل ميكروكنترلرهاي arm(اتمل) با همكاري كويرالكترونيك - ایـــــــــران میـــــــکرو ™

    و پروژه هايي شامل:

    ارتباط با حافظه هاي EEPROM(به همراه سورس ارتباط با at24c64) و توضيح جز به جز اين اي سي و مراحل ارتباط
    تبادل اطلاعات بين ميكروكنترلر و كامپيوتر از طريق پورت سريال
    تبادل اطلاعات بين دو ميكرومنترلر از طريق امواج راديويي
    تبادل اطلاعات بين كامپيوتر و ميكرومنترلر از طريق امواج راديويي
    راه اندازي موتور DC توسط واحد PWM
    ویرایش توسط m_online3710 : 17-03-2013 در ساعت 09:36

  4. تشکرها از این نوشته :


  5. #3
    عضو جدید
    تاریخ عضویت
    Mar 2013
    نوشته ها
    17
    تشکر
    5
    تشکر شده 9 بار در 6 پست

    پیش فرض

    بله من فصل 6 این کتاب (Parallel IO) که به صورت رایگان قابل دانلوده رو مطالعه کردم و خیلی کمک کرد. کتاب خیلی خوبیه.
    اما در این مورد خاص، کار من ایرادی داره که متوجه نشدم و شک دارم مطالعه بیشتر کمک چندانی کنه؛ منظورم اینه که ظاهراً همه چیز درسته، ولی خب، نیست!

    یه نکته دیگه که در پست اول از قلم افتاد، نحوه آدرس دهی هست، که چون طبق دیتاشیت به 12 تا 13 خط آدرس نیاز هست، من آدرس رو به شکل 16 بیتی به تابع e2p_write_byte یا e2p_read_byte می دم، و این توابع 8 بیت با ارزش رو ابتدا و 8 بیت کم ارزش رو در ادامه اش می فرستن.

    به نظرتون، بیشتر احتمال می دین، ایراد کار سخت افزاریه یا نرم افزاری؟

  6. #4
    عضو جدید
    تاریخ عضویت
    Mar 2013
    نوشته ها
    17
    تشکر
    5
    تشکر شده 9 بار در 6 پست

    پیش فرض

    مشکل رو بالاخره تونستم حل کنم. الحمدلله.
    ایراد اینجاست که در تابع e2p_read_byte و همین طور تابع e2p_read_buf، موقعی که قصد داریم آدرس دیتا رو به eeprom بفرستیم، لازمه A0 رو بنویسیم و بعد موقع خوندن، A1 رو بنویسیم. یعنی:
    کد:
    char e2p_read_byte(unsigned short adr){
        char data;
        i2csw_start();
        i2csw_write(0xA0);
        i2csw_write( (adr >> 8) & 0x00FF );
        i2csw_write( adr & 0x00FF );
        i2csw_start();
        i2csw_write(0xA1);
        data=i2csw_read(NACK);
        i2csw_stop();
        return data;
    }
    
    
    void e2p_read_buf(char *buf,unsigned short adr,char cnut){
        char i;
        if(adr+cnut>256)
            cnut=256-adr;
        i2csw_start();
        i2csw_write(0xA0);
        i2csw_write( (adr >> 8) & 0x00FF );
        i2csw_write( adr & 0x00FF );
        i2csw_start();
        i2csw_write(0xA1);
        for(i=0;i<cnut;i++)
            buf[i]=i2csw_read(ACK);
        i2csw_read(NACK);
        i2csw_stop();
    }
    این کد الان برای من کار می کنه. نسخه جدید رو ضمیمه می کنم شاید به درد دوستان بخوره.
    علاوه بر منابعی که در پست اول اشاره کردم، این چند روزه از منابع زیر هم استفاده کردم:
    http://www.atmel.com/Images/doc6327.pdf
    I2C 101
    و فصل 6 کتاب آقایان شکری و سلطانیان (PIO)

    یه چند تا نکته هم حیفه نگم: کد این پروژه، یک شبیه سازی نرم افزاری از پروتکل TWI = I2c هست که با زحمت شما دوستان در همین فروم آماده شده. پروژه دیگه ای که در پست اول اشاره کردم (basic-twi-eeprom-project-at91sam7x-ek) از پیاده سازی سخت افزاری موجود در at91sam7x استفاده می کنه. در حالت نرم افزاری، می شه از هر دو پورت General I/O دیگه ای هم استفاده کرد، برای این کار کافیه خطوط 10 تا 13 فایل I2CSW.h رو تغییر بدید:
    کد:
    #define I2cSW_PORT        AT91C_BASE_PIOA       // or     AT91C_BASE_PIOB
    #define I2cSW_SDA        10
    #define I2cSW_SCL        11
    #define I2cSW_PMC_PORT    AT91C_ID_PIOA     // or      AT91C_ID_PIOB
    اما اگه از کنترلر TWI موجود در برد استفاده کنید، لازمه حتماً از دو پایه PA10 و PA11 استفاده کنید. ضمناً در پروژه (basic-twi-eeprom-project-at91sam7x-ek) لازمه آدرس آیسی رو به صورت 7 بیتی مشخص کنید، یعنی مثلاً 0xA0 رو یک بیت به راست شیفت بدید و به صورت 0x50 ذخیره کنید:
    کد:
    #define AT24C_ADDRESS   0x50
    بعداً کنترلر TWI یا درایور نرم افزاری اون، آدرس رو یک بیت به چپ شیفت می ده و بیت mode of operation رو در کم ارزش ترین بیتش قرار می ده که به 0xA0 یا 0xA1 تبدیل خواهد شد.

    و بالاخره علت این که آدرس این eeprom برابر 0xA0 هست اینه که:
    طبق دیتاشیت چهار بیت پرارزش آدرس به صورت hardcoded در خود آیسی عبارت اند از: 0b1010 که معادل A در مبنای شونزده هست. سه بیت بعدی عبارت اند از مقادیر پایه های A0 و A1 و A2 که من به زمین وصل کردم و لذا معادل صفر هستند. پس تا الان شد: 0b1010000. کم ارزش ترین بیت، بیت حالت عملیات هست که برای عملیات خواندن معادل 1 و برای نوشتن معادل صفر هست. یعنی میشه 0b1010000m که اگه m مساوی صفر یا 1 باشه، به ترتیب آدرس 0xA0 یا 0xA1 رو خواهیم داشت. البته دقت کنید مستقل از خوندن یا نوشتن دیتا -همون طور که در ابتدای این پست گفتم- موقع نوشتن آدرس باید حالت عملیات رو صفر قرار بدید. بعد اگر قصد خواندن دارید مجدداً با تحویل دادن آدرس آیسی (این بار با m=1)، حالت اصلی مد نظرتون که خوندن هست رو به آیسی بگید، مثل کد توابع e2p_write_byte و e2p_read_byte.

    امیدوارم در آینده مفید واقع بشه. یادآوری کنم که فایل جدید پروژه رو ضمیمه کردم.
    فايل هاي پيوست شده فايل هاي پيوست شده

  7. کاربران : 2 تشکر کرده اند از شما aref3006 برای ارسال این پست سودمند:


موضوعات مشابه

  1. خواندن یک داده از eeprom
    توسط Ma3ood در انجمن AVR
    پاسخ: 8
    آخرين نوشته: 21-04-2015, 01:08
  2. راه اندازی eeprom AT24C64 با 1768 و یا 2368
    توسط pswin در انجمن LPC series (NXP)
    پاسخ: 1
    آخرين نوشته: 15-05-2012, 16:30
  3. کمک در راه اندازی AT24C64 با xmega32a4
    توسط arm-mohsen-avr در انجمن ATXMEGA
    پاسخ: 13
    آخرين نوشته: 29-01-2012, 23:12
  4. Eeprom
    توسط safavism در انجمن AVR
    پاسخ: 2
    آخرين نوشته: 04-10-2011, 10:01
  5. ارتباط با eeprom
    توسط raminop در انجمن AVR
    پاسخ: 1
    آخرين نوشته: 06-07-2010, 19:46

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •