PDA

View Full Version : نحوه كار با I2C در avr



ب- تات
سه شنبه 28 اردیبهشت 1389, 00:56 صبح
سوال در مورد كار با i2c در ارتباط چند مبكروكنترلر avr مي باشد.
ميشه لطفا راهنمائي كنيد منظور از آدرس دهي slave در i2c چي هست؟
واضح تر بگم master , slave به چه صورت بايد آدرس بگيرند تا بشه با دستورات I2csend , i2crecieve به اونها ديتا فرستاد؟

Mehran.GH
چهارشنبه 29 اردیبهشت 1389, 16:58 عصر
برای اینکه چند میکرو را با هم از طریق I2c ارتباط دهید نیاز دارید که از روش نرم افزاری یک آدرس برای slave تعریف کنید و این روش اصولا برای ارتباط بین میکروهای کوچک روش مناسبی نیست.

علت ؟

به دلایل اینکه در این روش از یک وقفه خارجی برای Wakeup کردن I2c در Slave استفاده می شود و نتیجه این است که :

1 - از اینتراپت های دیگر را نمی توانید استفاده کنید چون در صورت استفاده Bit اول دیتایی که از Master آمده یا همان Startbit را از دست می دهید.

2- اگر به هر دلیلی در باس I2C یک خطا اتفاق بیفتد در همان وقفه می مانید و میکرو هنگ می کند!

3- تا زمانی که I2C-Transver کامل نشده از وقفه خارج نمی شود و معنی آن این است که در این زمان برنامه اصلی شما معطل خروج ار وقفه می ماند

خلاصه اینکه این روش تمام منابع میکروهای فسقلی! را می بلعد و بهتر است فقط برای ارتباط میکرو با چیپ های دیگر مثل timer و eerom و.... که آدرس این چیپ ها به صورت ترکیب سخت افزار و نرم افزار تعریف می شود استفاده کرد

البته در پردازنده های جدید I2c به روش نرم افزاری استفاده می شود اما در این پردازنده ها می توان درایور را برای کرنل لینوکس کامپایل کرد و سیستم MultiTask است و یک پردازنده 400MHz Arm9 را با میکروهای کوچک نمی توان مقایسه کرد.

برگردیم به سوال

در صورتی که خواستید این روش نرم افزاری تعریف Slave را تجربه کنید , آدرس را 7 بیت و یا 10 بیت دلخواه برای Slave تعریف می کنید و Master که آدرس نمی خواهد. یک روش هم هست که Multi master نامیده می شود که پیچیده است و بعدا می توان راجع به آن صحبت کرد.

برای تعریف و استفاده از slave نرم افزاری هم یک کتابخانه به زبان اسمبلی سال 2003 فکر کنم شرکت atmel بیرون داد برای این منظور که اگر در نت بگردید حتما پیدا می کنید و یک Application Note هم در همان سایت atmel با شماره AN302 بود که درباره این موضوع software Slave Implementation توضیح کامل داده بود.

ب- تات
پنج شنبه 30 اردیبهشت 1389, 21:49 عصر
ممنون از پاسختون.
من اين كار را مطابق با مثال هاي موجود در منابع مختلف انجام دادم اما يك اتفاق جالب پيش اومده :
ميكرو مستر به يك آدرس مثل &H40 يك ديتا ميفرسته اما اسليو با وجوديكه فقط براش تعريف شده فقط به آدرس &H41 پاسخ بده باز هم ديتا رو دريافت ميكنه و كاري كه براش تعريف شده رو پشت سرش انجام ميده.
من اينك كار رو با فراهم كردن اسليو هاي ديگه هم تجربه كردم . اما حالا همه اونها هر چند كه آدرسشون با آدرسي كه مستر داره ديتا رو روش سوار ميكنه يكي نيست ، اما همه دريافت ميكنن و كار تعريف شده متناظر با اون ديتا رو انجام ميدن.
در اين زمينه ميشه راهنمائي كنيد. مگه هر اسليو نبايد فقط ديتا هايي رو كه از طرف مستر با آدرس خودش اومده دريافت كنه و به آدرسهاي ديگه كاري نداشته باشه؟؟؟؟؟!!!!!!

Mehran.GH
جمعه 31 اردیبهشت 1389, 01:26 صبح
slave ها باید با آدرس خودشون فعال بشوند چون در غیر اینصورت دیگر باس ندارید.

بیشتر از این نمی توانم مطلبی بگویم چون اطلاعاتی که نوشتین برای تشخیص مشکل کافی نیست!

به نظرم یک مشکلی با ACK باید باشد . مقاومت های Pull-Up را که فراموش نکردید؟
Timing سیگنال ها را کنترل کردید؟

بهترین راهنما در این موارد همان داکیومنتهای آتمل درباره I2C است

http://www.atmel.com/dyn/Products/app_notes.asp?family_id=607

ب- تات
جمعه 31 اردیبهشت 1389, 12:00 عصر
به نظرم یک مشکلی با ACK باید باشد . مقاومت های Pull-Up را که فراموش نکردید؟
Timing سیگنال ها را کنترل کردید؟



Pull-Up هم مشكلي نداره اما اين Timing كه ميگيد چي هست؟

ساده بگم : براي slave فرقي نمي كنه Master ديتا رو روي چه آدرسي ميفرسته . در واقع همه slave ها ديتايي رو كه master فرستاده دريافت ميكنن و ack مي فرستن . انگاري آدرس براشون مهم نيست !!!!!!!!