ارتباط SPI – معرفی پروتکل ارتباطی سریال SPI

ارتباط SPI  یک باس رابط است که معمولا برای ارسال داده بین میکروکنترلرها و لوازم جانبی کوچک مانند شیفت رجیسترها، سنسورها و SDکارت ها استفاده می شود. ارتباط سریال SPI از خطوط داده و کلاک های جداگانه و یک خط انتخاب برای گزینش دستگاهی که می خواهید با آن صحبت کنید، استفاده می کند. در این آموزش قصد داریم معرفی پروتکل ارتباطی سریال SPI را باهم برسی کنیم. آشنا شدن با این پروتکل SPI بصورت عمیق باعث میشه یک درک دقیقتری از عملکرد این پروتکل داشته باشید و در عیب یابی وتوسعه کاربردهای دیگر خیلی کمکتون میکنه.

مشکل پورت سریال چیست؟

یک پورت معمولی سریال، با خطوط TX و RX، <<آسنکرون>> (غیرهمزمان) نامیده می شود، زیرا کنترلی بر ارسال داده ها یا تضمینی برای اینکه دو طرف دقیقاََ با یک سرعت اجرا شوند وجود ندارد. کامپیوترها به طور کلی به هر چیزی که هماهنگ با یک سیگنال کلاک (کریستال اصلی متصل به رایانه ایست که همه چیز را فعال می کند) باشند وابسته اند و این، زمانی که دو سیستم با کلاک های متفاوت(حتی به مقدار کم ) به هم متصل می شوند، می تواند مشکل ایجاد کند.

برای کنار آمدن با این مشکل، اتصالات سریال آسنکرون بیت های شروع و توقف دیگری به هر بایت اضافه کردند که به گیرنده کمک می کند تا به محض رسیدن اطلاعات، همگام سازی را انجام دهد. در ضمن هر دو طرف باید از قبل در مورد سرعت انتقال (مثلا 9600 بیت در ثانیه) توافق کنند. تفاوت های جزئی در سرعت انتقال مشکل ایجاد نمی کنند زیرا گیرنده در ابتدای هر بایت دوباره همگام سازی می کند.

پورت_آسنکرون_تصویراول_SPIارتباط

(به هر حال، اگر متوجه شدید که در نمودار فوق  “11001010” برابر با 0×53  را متوجه نمی شوید، باید به شما به خاطر توجه تان به جزییات تبریک گفت. پروتکل های سری معمولا اول بیت های کم ارزش تر را می فرستد ، بنابراین کوچکترین بیت در سمت چپ است.  Nybble (نیم بایت 8 بیتی ) پایین در واقع 0011 = 0×3 است،  Nybble  بالا 0101 =x50 است).

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

 یک راه حل سنکرون

ارتباط SPI به شیوه ای متفاوت عمل می کند.  SPI یک باس داده همگام (سنکرون) است که از خطوط جداگانه برای داده ها استفاده می کند و نیز یک «ساعت» که هر دو طرف را در هماهنگی کامل نگه می دارد. ساعت یک سیگنال نوسانی است که به گیرنده زمان دقیق نمونه برداری از بیت های روی خط داده را می گوید. این فعالسازی می تواند در لبه بالارونده (پایین به بالا) و یا لبه پایین رونده (بالا به پایین) سیگنال ساعت باشد ؛ دیتا شیت مشخص خواهند کرد که کدام یک از آنها استفاده شده است. هنگامی که گیرنده آن لبه را تشخیص می دهد، بلافاصله خط داده را نمونه برداری می کند تا بیت بعدی را بخواند (به فلش ها در نمودار زیر نگاه کنید). از آنجا که ساعت همراه با داده ها ارسال می شود، مشخص کردن سرعت مهم نیست، هرچند دستگاه ها دارای بالاترین سرعت ممکن که در آن کار کنند،  هستند(ما در مورد انتخاب لبه های ساعت مناسب و سرعت در یک بیت بحث خواهیم کرد).

مطلب پیشنهادی:  سطح منطقی یا صفر و یک منطقی

سنکرون_تصویردوم_SPIارتباط

یکی از دلایل محبوب بودن SPI  این است که سخت افزار گیرنده می تواند یک شیفت ریجستر ساده باشد . SPI یک قطعه سخت افزاری بسیار ساده تر( و ارزان تر !) است نسبت به UART کامل (گیرنده / فرستنده ی آسنکرون جهانی) که سریال آسنکرون به آن نیاز دارد .

دریافت اطلاعات

ممکن است با خودتان فکر کنید، خود SPI، برای ارتباطات یک طرفه عالی است، اما چگونه می توان اطلاعات را در جهت مخالف ارسال کرد؟ در اینجا مطالب کمی پیچیده تر می شوند.

در ارتباط SPI تنها یک طرف ، سیگنال ساعت را تولید می کند (معمولا از CLK یا SCK برای نامگذاری ClocK سریال استفاده می شود). طرفی که ساعت را تولید می کند، “master” نامیده می شود، و طرف دیگر “slave” نامیده می شود. همیشه فقط یک master (که تقریبا همیشه میکروکنترلر شماست) وجود دارد، اماممکن است چندین slave وجود داشته باشد (بیشتراز این در یک بیت).

هنگامی که داده ها از master به یک slave ارسال می شوند، آنها به یک خط داده به نام MOSI، “master out  / slave in ” فرستاده میشنود. اگر slave نیاز به ارسال پاسخ به master داشته باشد،  master به تولید چند دوره تناوب از پیش تعیین شده ساعت ادامه می دهد و slave داده ها را بر روی یک خط داده سوم به نام MISO “Master In / Slave Out” قرار می دهد.

مستر_میکروکنترلر-تصویرسوم_SPIارتباط

توجه داشته باشید که ما در توضیح بالا گفتیم “از پیش تعیین شده”. از آنجا که همیشه سیگنال ساعت را master تولید می کند، باید از قبل نیاز یک slave به برگرداندن داده و میزان داده بازگردانده شده را بداند. این نوع ارتباط سریال تفاوت زیادی با سریال آسنکرون دارد که در هر زمان می تواند یک مقدار تصادفی از داده ها را در هر جهت ارسال کند. در عمل این مشکلی ندارد ، زیرا SPI عموما برای ارتباط با سنسورهایی که  ساختار فرماندهی بسیار خاصی دارند استفاده می شود. به عنوان مثال، اگر دستور “خواندن داده ها” را به یک دستگاه ارسال می کنید، می دانید که دستگاه همیشه به عنوان مثال، دو بایت به شما ارسال می کند. (در مواردی که بخواهید مقادیر متغیری از داده را برگردانید، همیشه می توانید یک یا دو بایت را که طول داده را مشخص می کنند برگردانید و سپس master  تمام آن را بازیابی می کند.)

توجه داشته باشید که SPI “کاملا دو طرفه” است (دارای خطوط ارسال و دریافت جداگانه) و بنابراین در شرایط خاص می توانید داده ها را همزمان منتقل و دریافت کنید (برای مثال، درخواست خواندن از سنسور جدید وقتی که سنسور قبلی درحال بازیابی داده ها است). دیتا شیت دستگاه این امکان را در صورت وجود اطلاع میدهد .

انتخاب (slave (SS

یکی از آخرین خط هایی که باید از آن آگاه باشید، SS ) slave select) نامیده می شود. که به slave می گوید چه موقع باید فعال شود و داده ها را دریافت یا ارسال کند و همچنین هنگامی که چندین slave وجود داشته باشد برای انتخاب یکی از آنها استفاده می شود.

ارسال داده ها_تصویرچهارم_SPIارتباط

خط SS معمولا در1 (بالا) باقی می ماند ، که slave را از باس SPI جدا کند. (این نوع منطق به عنوان “فعال-پایین” شناخته می شود) و اغلب می توان آن را برای فعال کردن و تنظیم مجدد خط استفاده کرد). درست قبل از ارسال داده به slave، خط پایین آورده می شود، که  slave را فعال می کند. هنگامی که کار با slave تمام شد، خط دوباره بالا می رود. در یک shift register، این موضوع درباره ی ورودی “latch” صادق است که اطلاعات دریافت شده را به خطوط خروجی منتقل می کند.

مطلب پیشنهادی:  مقدمه‌‌ای بر طراحی و توسعه‌ی سیستم‌های نهفته

چندین  Slave

دو راه برای اتصال  slave های متعدد به یک باس SPI وجود دارد:

1- به طور کلی هر slave نیاز به یک خط SS جداگانه دارد. برای ایجاد ارتباط با یک slave خاص، شما باید خط SS آن slave را پایین آورده و بقیه آنها را بالا ببرید ( اگردو slave در یک زمان فعال شوند، یا هر دو تلاش کنند توسط یک خط MISO ارتباط برقرار کنند در این صورت داده ها گم می شوند). slave های زیاد به خطوط SS زیادی نیاز دارند؛ اگر خروجی شما افت می کند، تراشه های باینری دیکودری وجود دارد که می تواند خروجی های SS شما را چند برابر کند.

تراشه های باینری دیکوردی_تصویرپنجم_SPIارتباط

2- از سوی دیگر، بعضی از قسمت ها ترجیح می دهند که به یکدیگر متصل شوند، به این صورت که MISO (خروجی) یکی از آنها به MOSI (ورودی) بعدی متصل شود. در این صورت، یک خط SS واحد به تمام slave ها می رود. هنگامی که تمام داده ها ارسال  شوند، خط SS بالا می رود که باعث می شود تمام تراشه ها به طور همزمان فعال شوند. این راه اغلب برای شیفت رجیستر های زنجیره ای و درایورهای LED قابل آدرس دهی، مورد استفاده قرار می گیرد.

شیفت رجیسترهای زنجیره ای_تصویرششم_SPIارتباط

توجه داشته باشید که در این روش، داده ها از یک slave به بعدی منتقل می شوند، بنابراین برای ارسال داده ها به هر slave، باید مقدار کافی داده انتقال دهید تا به همه آنها دسترسی پیدا کنید. همچنین در نظر داشته باشید که اولین بخش از داده ای که شما ارسال می کنید در آخرین slave به پایان خواهد رسید.

این  طرح معمولا در حالتهای تک_خروجی استفاده می شود، مانند چراغ های رانندگی که در آن نیازی به دریافت اطلاعات ندارید. در این موارد می توانید خط MISO، master  را قطع کنید. با این حال، اگر لازم باشد که داده ها به Master  بازگردانده شوند، می توانید این کار را با بستن حلقه زنجیره ای (سیم آبی در نمودار بالا) انجام دهید. توجه داشته باشید که اگر این کار را انجام دهید، داده های برگردانده شده از slave 1 باید قبل از بازگشت به master، از همه slave ها عبور کنند، بنابراین مطمئن شوید که دستورات دریافتی کافی برای دریافت اطلاعات مورد نیازتان ارسال کرده باشید.

برنامه نویسی ارتباط SPI

بسیاری از میکروکنترلرها  ارتباط SPI دارند که تمام جزئیات داده های ارسالی و دریافتی را مدیریت می کنند و می توانند این کار را  با سرعت بسیار بالا انجام دهند. همچنین پروتکل SPI به قدری ساده است که شما (بله، شما!) می توانید برنامه خود را برای اداره خطوط I / O دریک توالی مناسب برای انتقال داده ها  بنویسید.

اگر از آردوینو استفاده می کنید، دو راه برای برقراری ارتباط با دستگاه های SPI وجود دارد:

  1.  شما می توانید از دستورات ()shiftIn  و ()shiftOut  استفاده کنید. اینها دستورات مبتنی بر نرم افزار اند که با هر گروه از پین ها کار می کنند ، اما تا حدودی کند هستند.
  2.  یا می توانید از کتابخانه SPI استفاده کنید که از مزایای سخت افزار SPI ساخته شده در میکروکنترلر استفاده می کند. این راه بسیار سریعتر از دستورات بالا است، اما فقط روی پین های خاصی کار می کند.
مطلب پیشنهادی:  مقاومت های پول آپ Pull-up ، کاربرد و محاسبه

هنگام تنظیم رابط باید برخی از گزینه ها را انتخاب کنید. این گزینه ها باید با دستگاهی که با آن ارتباط برقرار می کنید مطابقت داشته باشد; برای مشاهده آنچه که نیاز دارد، دیتا شیت دستگاه را بررسی کنید.

رابط می تواند اول داده ها ی پرارزش ترین بیت (MSB) را بفرستد یا اول داده های کم ارزش ترین بیت (LSB) . در کتابخانه آردوینو SPI، با استفاده از تابع ()setBitOrder  کنترل می شود.

slave داده ها را بر روی لبه بالارونده یا لبه پایین رونده پالس ساعت می خواند. علاوه بر این، زمانی که بالا یا پایین است، ساعت را می توان “idle” در نظر گرفت. در کتابخانه ی آردوینو SPI هر دو گزینه با استفاده از تابع ()setDataMode  کنترل می شوند.

SPI می تواند با سرعت بسیار بالا (میلیون ها بایت در ثانیه) کار کند که برای برخی از دستگاه ها خیلی سریع است. برای تطبیق چنین دستگاه هایی، می توانید نرخ داده را تنظیم کنید. در کتابخانه آردوینو SPI، سرعت توسط تابع ()setClockDivider  تنظیم می شود که ساعت اصلی (MHz16 در بیشتر آردوینو ها) را به فرکانس هایی بین MHz8 (/ 2) و kHz125 (/ 128) تقسیم می کند.

اگر شما از کتابخانه SPI استفاده می کنید، باید از پین های ارائه شده SCK، MOSI و MISO استفاده کنید، بطوری که این پین ها به صورت  سخت افزاری متصل شده اند. یک پین اختصاصی SS نیز وجود دارد که می توانید آن را استفاده کنید (که حداقل باید با یک خروجی تنظیم شود تا سخت افزار SPI عمل کند)، اما توجه داشته باشید که می توانید از هر پین خروجی برای SS کردن slave  دستگاهتان به خوبی استفاده کنید.

درآردوینوهای قدیمی تر، باید خودتان پین (های)SS را کنترل می کردید، قبل از انتقال داده ها یکی از آنها را کاهش و بعد از آن افزایش می دادید. آردوینوهای جدیدتر مانند Due می تواند هر پین SS را به طور خودکار برای انتقال بخشی از داده کنترل کند؛ برای اطلاعات بیشتر به صفحه مستندات Due SPI مراجعه کنید.

نکات و ترفندها در ارتباط SPI

به دلیل سیگنال های سرعت بالا، SPI فقط باید برای ارسال داده ها در فاصله های کوتاه (تا چند پا) استفاده شود. اگر لازم است که داده را به مسافت های بیشتر از آن ارسال کنید، سرعت ساعت را کاهش دهید و از تراشه های درایور اختصاصی استفاده کنید. اگر همه چیزها مثل چیزی که فکر می کردید کار نمی کند، یک تحلیلگر منطقی ابزار بسیار مفیدی می تواند باشد. تحلیلگر هوشمند مانند تحلیلگر منطقیSaleale USBحتی می تواند بایت داده ها را برای نمایش یا ورود به سیستم رمزگشایی کند.

تراشه های درایوراختصاصی_تصویرهفتم_SPIارتباط

مزایای ارتباط سریال SPI

  • سریعتر از سریال آسنکرون است.
  • سخت افزار دریافت می تواند یک شیفت رجیستر ساده باشد.
  • از چندین slave پشتیبانی می کند.

معایب ارتباط SPI

  • – به خطوط سیگنال بیشتری (سیم ها) نسبت به سایر روش های ارتباطی نیاز دارد.
  • -ارتباطات باید از قبل به طور دقیق معرفی شوند (شما نمی توانید مقادیر تصادفی داده را هر زمان که بخواهید ارسال کنید).
  • -master باید تمام ارتباطات را کنترل کند (slave ها نمی توانند به طور مستقیم با یکدیگر ارتباط برقرار کنند).
  • -معمولا به خطوط SS جداگانه برای هر slave نیاز دارد، که اگر slave های متعددی مورد نیاز باشد، میتواند مشکل ساز باشد.

منابع : ویکی‌پدیا ، اسپارک‌فان

مطالب مرتبط :  ابزار SPI DEBUGGER در نرم افزار PROTEUS و پروتکل رابطه وسایل جانبی در آردوینو (SPI)

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

4 دیدگاه

  1. با سلام
    از آموزش راحت و گویش ساده و در عین حال مهم و مفید تشکر می کنم.

  2. سپاس فرااااااوان

  3. بدون استفاده از AVR و آردوینو
    اگه مستقیم بخوام مثلا از یک ماژول میکروفن استفاده کنم
    پایه های میکروفن رو به کجای اسلایو بزنم؟
    پایه های بلندگو رو به کجای مستر بزنم؟
    چه طور تعیین کنم کدوم همیشه مستر باشه؟
    ایا فقط با یک جامپر شدنی هست یا پیچیده تره؟
    کلا چه طور یک واکی تاکی فقط با سر هم بندی درست کنم

  4. سپاسگزارم از لطف شما ،عالی