پروتکل TWI در AVR یک واحد سخت افزاری شبیه پروتکل I2C است و تفاوت هایی با I2C دارد. TWI مخفف Two Wire Interface و به معنی رابط دو سیمه است. در این پروتکل ارتباطی که یک پروتکل Master-slaveی است، بین Master و Slaveها، دو خط وجود دارد. که یکی از آنها خط کلاک و دیگری خط داده است. TWI عملکردی بسیار مشابه با I2C استاندارد دارد. I2C ساخت شرکت فیلیپس است و یک علامت تجاری ثبت شده به نام فیلیپس است. بنابراین شرکت Atmel، نام TWI را به پروتکل ارتباطی خود داده است تا از مشکلات قانونی با فیلیپس جلوگیری کند. چند تفاوت TWI و I2C استاندارد، عبارتند از:
- تعداد بیت های آدرس دهی Slave در TWI تنها 7 بیت است. اما در I2C استاندارد، آدرس دهی 10 بیتی نیز وجود دارد؛
- Start byte که در TWI وجود ندارد؛
- Slope control که در TWI وجود ندارد.
پروتکل TWI در میکروکنترلرهای AVR و پروتکل I2C در میکروکنترلرهای دیگر، از مهمترین پروتکل های ارتباطی محسوب می شوند. پروتکل TWI در AVR و پروتکل I2C در میکروکنترلرهای دیگر، مانند دیگر پروتکل ها، برای ارتباط میکروکنترلرها با یکدیگر و همچنین ارتباط میکروکنترلر با المان های جانبی به کار می روند. المان ها و ماژول های مهمی وجود دارند که ارتباط میکروکنترلر با آنها از طریق I2C و TWI است. در نوشتۀ پروتکل I2C در وبلاگ یوبرد به تاریخچۀ I2C، ویژگی ها، کاربردها، اتصالات، سیگنال ها و قالب بندی دادۀ I2C و مطالب دیگری دربارۀ آن پرداخته ایم. در این نوشته به معرفی TWI در AVR می پردازیم و ویژگی ها و مشخصات پروتکل TWI در AVR را به طور کلی بیان می کنیم.
فیلم آموزش میکروکنترلرهای AVR مقدماتی
تصویر 1 – بلوک دیاگرام پروتکل TWI در ATmega128A
پروتکل TWI چیست؟
TWI که مخفف عبارت Two Wire Interface است، یک پروتکل ارتباطی دو سیمه در میکروکنترلرهای AVR است. این ارتباط دو سیمه به صورت یک واحد سخت افزاری در AVR پیاده شده است. TWI بسیار مشابه I2C در مد استاندارد است. به طوری که گاهی به پروتکل TWI در AVR، پروتکل I2C نیز گفته می شود. در پروتکل ارتباطی TWI، بین Master و Slaveها دو خط وجود دارد که یکی از آنها خط کلاک و دیگری خط داده است. خط کلاک، SCL و خط داده، SDA نام دارد. در این پروتکل ارتباطی، یک میکروکنترلر، Master است و میکروکنترلرها و المان های دیگر، Slave هستند. Master کنترل تبادل داده را بر عهده دارد و ارتباط، تنها بین Mater و Slaveهاست. یعنی Slaveها نمی توانند با یکدیگر تبادل داده کنند. Master شرایط Start و کلاک روی SCL را ایجاد و آدرس Slave را روی SDA ارسال می کند. Slaveی که آدرس آن روی SDA قرار گرفته است، پاسخی تحت عنوان Acknowledge روی خط قرار می دهد. سپس Master با هر کلاکی که روی خط SCL ایجاد می کند، بیت های داده را برای Slave(ها) ارسال و یا داده های ارسالی Slave را دریافت می کند. در نهایت، Master ارتباط را متوقف می کند. در TWI مانند I2C، چهار مد ارتباطی وجود دارد:
- مد Master-transmitter: که Master داده ها را برای Slave(ها) ارسال می کند؛
- مد Master-receiver: که Master داده ها را از یک Slave دریافت می کند؛
- مد Slave-transmitter: که Slave داده ها را برای Master ارسال می کند؛
- مد Slave-receiver: که Slave داده ها را از Master دریافت می کند.
در یک ارتباط TWI، از مدهای مذکور تنها دو مد به صورت همزمان وجود دارند. هرگاه Master در مد Master-transmitter (فرستنده) است، Slave در مد Slave-receiver (گیرنده) است. هرگاه Master در مد Master-receiver (گیرنده) است، Slave در مد Slave-transmitter (فرستنده) است.
تصویر 2 – تبادل داده در پروتکل TWI در مدهای مختلف
اهمیت پروتکل ارتباطی TWI
همان اندازه که پروتکل ارتباطی I2C در دیگر میکروکنترلرها اهمیت دارد، پروتکل TWI در AVR نیز مهم است. اهمیت پروتکل های ارتباطی I2C و TWI از ویژگی ها و کاربردهای آنها نشأت می گیرد. در بسیاری از پروژه ها نیاز است المان های جانبی را راه اندازی و با آنها ارتباط برقرار کنیم. این امر مستلزم استفاده از پروتکل های ارتباطی بین میکروکنترلر و آن المان هاست. I2C و TWI از مهمترین پروتکل های ارتباطی برای راه اندازی انواع المان های دیجیتال هستند. المان هایی مثل ماژول های فرستنده و گیرنده، حافظه های جانبی، نمایشگرها، سنسورها، ADCها، DACها و … . همچنین ممکن است نیاز باشد بین دو میکروکنترلر، از ارتباط I2C و TWI استفاده شود. دو المان مهم نیز وجود دارند که در پروژه های مبتنی بر میکروکنترلرهای AVR بسیار پر استفاده هستند. در پروژه های مبتنی بر میکروکنترلرهای AVR که RTC ندارند، لازم است از RTC خارجی استفاده کنیم. اغلب اوقات نیز به کارگیری حافظۀ EEPROM خارجی در این پروژه ها امری ضروری است. از مشهورترین آی سی های RTC، آی سی DS1307 است که ارتباط با آن از طریق I2C یا TWI است. آی سی های EEPROMی نیز وجود دارند که ارتباط I2C و TWI را پشتیبانی می کنند. این دو المان می توانند در بسیاری از پروژه های مبتنی بر میکروکنترلرهای AVR استفاده شوند. همچنین در پروژه هایی لازم است از المان هایی استفاده کنیم که با TWI و I2C راه اندازی می شوند. که در این صورت راه اندازی و استفاده از پروتکل های ارتباطی TWI و I2C اهمیت پیدا می کنند.
تصویر 3 – آی سی های RTC و EEPROM روی برد توسعۀ AVR یوبرد
ویژگی های پروتکل TWI در AVR
در این بخش ویژگی ها و مشخصات کلی TWI را در میکروکنترلر ATmega128A از روی دیتاشیت بیان می کنیم. باقی مشخصات و ویژگی ها را به نوشتۀ پروتکل I2C ارجاع می دهیم. ویژگی های TWI در میکروکنترلرهای AVR به طور کلی عبارتند از:
- TWI در AVR دارای پنج بخش کلی است. بخش پین های SDA و SCL، بخش تولید کنندۀ Bit rate، بخش Bus interface، بخش تطابق آدرس و بخش کنترلی؛
- پروتکل ارتباطی TWI ساده و در عین حال قدرتمند و منعطف است؛
- پشتیبانی از مد Master و Slave که میکروکنترلر AVR هم می تواند Master باشد و هم Slave؛
- میکروکنترلر می تواند داده ها را هم ارسال کند و هم دریافت؛
- قابلیت آدرس دهی 7 بیتی و امکان آدرس دهی تا 128 تا Slave؛
- سرعت تبادل اطلاعات با فرکانس کلاک تا حداکثر 400 کیلوهرتز؛
- درایورهای خروجی با Slew-rate محدود شده؛
- مدار حذف نویز که Spikeهای روی خطوط باس را دفع می کند؛
- قابلیت تنظیم آدرس در میکروکنترلری که قرار است Slave باشد؛
- پشتیبانی از فراخوانی عمومی (General Call Address)؛
- بیرون آمدن میکروکنترلر AVR از تمامی مدهای Sleep، در زمانی که Slave است و آدرس خودش را دریافت می کند؛
- پشتیبانی از قابلیت Multi-master که در یک شبکه می توان چند Master داشت.
تصویر 4 – قابلیت Multi-master و وجود چند Master روی باس TWI
دیگر ویژگی های پروتکل TWI در AVR
TWI بسیار مشابه I2C استاندارد است. در این بخش برخی ویژگی ها و مشخصات دیگر TWI را بیان می کنیم. این ویژگی ها و مشخصات را می توانید با جزئیات بیشتر در نوشتۀ پروتکل I2C وبلاگ یوبرد مطالعه کنید.
- وجود مقاومت های Pull-up روی خطوط SDA و SCL؛
- TWI و I2C هر دو پروتکل های ارتباطی سنکرون هستند؛
- استفاده در فواصل کوتاه؛
- پشتیبانی از مد Multi-master و وجود حکمیت (Arbitration)؛
- انتقال داده 8 بیتی از Master به Slave و از Slave به Master با حداکثر سرعت 400 کیلوهرتز؛
- وابسته بودن تعداد آی سی های متصل به شبکه، به ظرفیت خازنی باس؛
- تطابق با آی سی های سازگار با I2C استاندارد؛
- یکسان بودن اغلب کاربردهای I2C استاندارد و TWI؛
- یکسان بودن سیگنال های TWI و I2C استاندارد و شرایط Start و Stopو Repeated start و Acknowledge و Not acknowledge یکسان با I2C استاندارد؛
- قابلیت گسترش شبکۀ TWI با Hubها، Repeaterها، Extenderها، سوییچ ها و مالتی پلکسرها؛
- قالب یکسان آدرس و داده در TWI و I2C استاندارد، به غیر از ویژگی آدرس دهی 10 بیتی. در TWI تنها آدرس دهی 7 بیتی وجود دارد؛
- مدهای ارتباطی یکسان در TWI و I2C؛
- نحوۀ یکسان تبادل داده در TWI و I2C؛
- قابلیت Clock stretching که در I2C و در TWI وجود دارد.
ویژگی ها و مشخصات دیگری مانند مشخصات الکتریکی و زمانی پروتکل TWI در AVR وجود دارد. این ویژگی ها و مشخصات در دیتاشیت میکروکنترلرهای AVR و در بخش های مشخصات الکتریکی آنها آمده است. همچنین در پروتکل TWI در AVR و پروتکل I2C، حین ارتباط، وضعیت های مختلفی به وجود می آیند. که این وضعیت ها در AVR از رجیستر TWSR قابل خواندن هستند. این وضعیت ها مشابه وضعیت های پروتکل I2C هستند. مثلاً این وضعیت ها در TWI میکروکنترلر ATmega128 مشابه وضعیت های I2C در میکروکنترلرهای LPC17xx است.
تصویر 5 – سیگنال های TWI در انتقال یک بایت داده
تنظیمات TWI در کدویژن
راه اندازی TWI در کدویژن به سادگی با تیک زدن گزینه هایی در کدویزارد قابل انجام است. کافی است از قسمت Two wire interface (شمارۀ 1)، تیک Two wire enable را بزنیم (2). در این صورت می توانیم میکروکنترلر را در یکی از مدهای Master یا Slave پیکربندی کنیم (3). هنگامی که مد Master انتخاب می شود، تنها لازم است فرکانس کلاک SCL را تعیین کنیم (4). زمانی که مد Slave را انتخاب می کنیم، می توانیم آدرسی به میکروکنترلر بدهیم (5). با تیک زدن گزینۀ Match any slave address، آدرس خاصی به میکروکنترلر تعلق نمی گیرد (6). و Master هر آدرسی را که روی باس TWI بفرستد، این Slave برای تبادل داده، Acknowledge می فرستد. دو بخش دیگر، اندازۀ بافرهایی هستند که داده های Slave در آنها قرار می گیرد (7). برای Slave هم بافر ارسال وجود دارد و هم بافر دریافت. پس از ایجاد کد با کدویزارد، در مد Master کتابخانۀ twi.h و توابع twi_master_init و twi_slave_init و twi_master_trans به برنامه اضافه می شود. برای مد Slave نیز علاوه بر موارد مذکور، توابع twi_rx_handler و twi_tx_handler به برنامه اضافه می شوند. در هر دو مد Master و Slave نیز پرچم کلی وقفه های میکروکنترلر فعال می شود. در کدویزارد بخشی با نام Bit-banged I2C bus interface وجود دارد که متفاوت از پروتکل TWI در AVR است (8). این بخش مربوط به پیاده سازی پروتکل I2C نرم افزاری روی پایه های پورت IO در AVR است. توجه داشته باشید که برای راه اندازی TWI در اتمل استودیو، لازم است به صورت رجیستری برنامه نویسی کنیم. که در این صورت می توان توابعی اختصاصی برای پروتکل TWI نوشت.
تصویر 6 – تنظیمات پروتکل TWI در AVR در کدویزارد
نتایج پروتکل TWI در AVR
- پروتکل ارتباطی TWI در AVR بسیار مشابه I2C استاندارد است. به طوری که گاهی به آن پروتکل I2C در AVR گفته می شود. اما در واقع TWI و I2C تفاوت هایی با هم دارند.
- در TWI که یک ارتباط دو سیمه در AVR است، یک خط کلاک (SCL) و یک خط داده (SDA) وجود دارد.
- Atmel برای جلوگیری از مشکلات قانونی با فیلیپس، نام پروتکل ارتباطی دو سیمۀ خود را TWI قرار داده است. چرا که I2C یک علامت تجاری ثبت شده به نام فیلیپس است.
- TWI مانند I2C یک پروتکل ارتباطی Master-slaveی است.
- در باس TWI، در هر لحظه تنها یک Master وجود دارد و باقی المان ها Slave هستند.
- کنترل باس توسط Master انجام می شود. تبادل داده نیز تنها بین Master و Slaveهاست و Slaveها نمی توانند با هم تبادل داده کنند.
- در TWI و I2C چهار مد ارتباطی وجود دارد: Master-transmit و Slave-receiver که Master فرستنده و Slave(ها) گیرنده است. Master-receiver و Slave-transmitter که Master گیرنده است و Slave فرستنده.
- پروتکل های ارتباطی TWI و I2C از مهمترین پروتکل های ارتباطی در میکروکنترلرهاهستند.
- دو المان کاربردی وجود دارد که در بسیاری از پروژه های مبتنی بر میکروکنترلرهای AVR استفاده می شوند. یکی حافظۀ EEPROM خارجی و دیگری آی سی های RTC خارجی است. بسیاری از این المان ها با TWI و I2C با میکروکنترلر ارتباط برقرار می کنند.
- بسیاری از ویژگی ها و مشخصات TWI در AVR مشابه I2C استاندارد است.
- راه اندازی TWI در AVR در نرم افزار کدویژن، به راحتی با تیک زدن و مقداردهی در کدویزارد انجام می شود.
سلام. توی متن فرمودید که یک I2C نرم افزاری و یک I2C سخت افزاری وجود داره. و همچنین گفتید که وقفه برای I2C وجود داره. برداشت من اینه که این وقفه فقط توی حالتی که از I2C سخت افزاری استفاده می کنیم وجود داره. در نگاه اول شاید همین باشه اما خواستم برای اطمینان از شما سوال کنم. تشکر
سلام. خواهش می کنم. بله این موضوع که می فرمایید درست هستش. در واقع I2C سخت افزاری (که توی AVR به اون TWI هم گفته میشه) دارای وقفه هستش. توی I2C نرم افزاری در واقع از پورت های I/O برای ایجاد پالس ها استفاده میشه، بنابراین وقفه و روتین وقفه ای هم نداریم.
عالی بود با تشکر
منتظر ادمه مطلب برای میکروهای arm خواهیم بود
خواهش میکنم. ان شاءالله
سلام. هر وقت چیزی سرچ میکنم و یوبرد بالا میاد سریع بازش میکنم. چون مطمئنم وبلاگتون مطالب جامعی داره که جایی دیگه نمیشه پیدا کرد. اول تشکر میکنم بابت زحماتی که برای جامعه الکترونیک می کشید. دوم پیشنهاد میکنم درباره مطالب ساده الکترونیک هم مطلب بذارید. سوم درخواست میکنم که این twi هم براش پروژه و نمونه کد بذارید. هر جایی می گردم کد قابل فهم پیدا نمیکنم. بازم ممنون
سلام دوست عزیز. ممنون از نظرتون.خیلی خیلی لطف دارید . اولاً خواهش میکنم. ثانیاً تا جایی که بتونیم مطالب زمینۀ الکترونیک رو به زبان ساده بیان می کنیم. ثالثاً twi هم ان شاءالله در آینده براش نمونه کد و پروژه میذاریم.
سلام خسته نباشید میکرو avr هست که فرکانس twi اون از 400 khz بالا تر باشه؟
سلام. خیلی ممنون. بنده AVRی با فرکانس TWI بیشتر از 400 کیلوهرتز ندیدم. سایت میکروچیپ هم یه مقدار جست و جو کردم ندیدم. ممکنه وجود داشته باشه.
سلام ممنون از توضیحاتتون
اگر از پایه مربوط به twi. به عنوان خروجی دیجیتال معمولی استفاده کنیم، مشکلی پیش میاد؟
سلام. خواهش می کنیم. اگه TWI رو فعال نکرده باشید میتونید از پایه های مربوط، به عنوان پایه های IO استفاده کنید. مشکلی نداره