توابع انتقال داده با استفاده از spi. رابط سریال SPI. توپولوژی سیستم های ارتباطی مبتنی بر SPI

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

0. به جای معرفی

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

این مقاله برای چه کسانی است؟
اول از همه، برای مبتدیان، که من هستم. در انجمن‌های لینوکس جاسازی‌شده، اغلب می‌توانید با این سؤال مواجه شوید: «چگونه می‌توانم با SPI روی این برد کار کنم؟». این چیزی است که من سعی خواهم کرد به آن پاسخ دهم. به عنوان مثال، من کد نوشته شده برای کار با دستگاه SPI آزمایشی را ارائه می کنم.

ساختار مقاله
با توجه به اینکه اطلاعات زیادی وجود داشت، مقاله به چند بخش زیر تقسیم می شود:

  1. SPI چیست؟
  2. مروری بر زیرسیستم SPI در لینوکس
  3. توسعه درایور SPI پروتکل فضای کاربر با استفاده از spidev
  4. توسعه درایور سطح هسته پروتکل SPI
  5. مستندات
دو نکته اول در قسمت اول مقاله و بقیه در قسمت دوم درج خواهد شد.

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

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

اگر علاقه ای به ترجمه ها و اضافات من ندارید، می توانید با خیال راحت مستقیماً به قسمت پنجم بروید، جایی که می توانید اطلاعاتی را پیدا کنید که از کجا می توانید تمام اطلاعات لازم در مورد این موضوع را دریافت کنید.

اشتباهات
من شعبده باز نیستم فقط دارم یاد میگیرم. در صورت مشاهده هر گونه خطا یا نادرستی، لطفاً به من اطلاع دهید.

1. SPI چیست؟

مخفف SPI به معنای "رابط جانبی سریال" یا در نسخه روسی "سریال" است رابط جانبی". نام برای خودش صحبت می کند رابط داده شدهبرای کار با انواع مختلف استفاده می شود لوازم جانبی. به عنوان مثال، اینها می توانند DAC/ADC های مختلف، پتانسیومتر، حسگرها، بسط دهنده های ورودی/خروجی (GPIO)، حافظه های مختلف و حتی لوازم جانبی پیچیده تر مانند کدک های صوتی و کنترل کننده های اترنت باشند.

از نقطه نظر فنی، SPI یک گذرگاه چهار سیمه سنکرون است. این اتصال دو رجیستر شیفت سنکرون است که عنصر مرکزی هر دستگاه SPI است. اتصال از یک پیکربندی master/slave استفاده می کند. فقط استاد می تواند پالس ساعت تولید کند. همیشه فقط یک Master در مدار وجود دارد (برخلاف همان باس I2C، که در آن گزینه ای با بیش از یک Master امکان پذیر است)، تعداد Slave ها می تواند متفاوت باشد. که در مورد کلیخروجی master به ورودی slave و بالعکس خروجی slave به ورودی master متصل می شود. هنگامی که پالس های ساعت به خروجی SCK اعمال می شود، داده ها توسط master از خروجی MOSI تحت فشار قرار می گیرند و توسط Slave از طریق ورودی MISO ضبط می شوند. بنابراین، اگر تعداد پالس‌های همگام‌سازی مربوط به عرض بیت رجیستر شیفت را اعمال کنید، داده‌های موجود در ثبات‌ها مبادله می‌شوند. نتیجه این است که SPI همیشه در حالت تمام دوبلکس کار می کند. اما اینکه آیا هنگام ضبط پارامتر به داده های دریافتی از دستگاه نیاز داریم، این یک سوال دیگر است. اغلب اتفاق می افتد که داده های دریافتی از دستگاه هنگام نوشتن داده ها روی آن زباله است که در این صورت به سادگی نادیده گرفته می شوند، اما ما بدون توجه به میل خود آنها را دریافت خواهیم کرد.

کنترلر SPI معمولاً توسط یک دستگاه جانبی در MCU یا eMPU پیاده سازی می شود. در اکثر تراشه ها، می تواند در هر دو حالت master و slave کار کند. اما در این لحظهلینوکس فقط از حالت اصلی پشتیبانی می کند.

راه های مختلفی برای فعال کردن دستگاه های SPI وجود دارد.

می توانید ساده ترین آنها را در شکل بالا مشاهده کنید (با تشکر از ویکی پدیا برای طراحی های تحت مجوز رایگان GFDL). در این حالت، همه Slave ها به جز سیگنال Slave Select (~CS) به موازات master متصل می شوند. هر برده نیاز به یک سیگنال انتخاب برده جداگانه دارد (در شکل آنها با برچسب SSx هستند). برای سیگنال های Slave Select می توان از خروجی های اختصاصی کنترلر SPI و پورت های I/O استفاده کرد. همه منظورهمیکروکنترلر (GPIO).

دو سیم برای انتقال داده استفاده می شود، یکی برای ساعت و یک سیگنال Slave Select برای هر یک از بردها.
شرح سیگنال های مورد استفاده:

  • MOSI - خروجی اصلی، ورودی برده (خروجی اصلی، ورودی برده). این سیگنال برای انتقال اطلاعات سریال از Master به Slave در نظر گرفته شده است. ممکن است SDO، DO و غیره نیز نامیده شود.
  • MISO - ورودی Master، Slave Output (ورودی اصلی، خروجی برده). این سیگنال برای انتقال داده سریال از Slave به Master در نظر گرفته شده است. ممکن است SDI، DI و غیره نامیده شود.
  • SCK - ساعت سریال (سیگنال همگام سازی). برای همگام سازی هنگام انتقال داده استفاده می شود. همچنین ممکن است SCLK، CLK و غیره نامیده شود.
  • ~CS - انتخاب تراشه (انتخاب تراشه). این سیگنال دستگاه برده را فعال می کند. معمولاً معکوس است، یعنی سطح پایینفعال محسوب می شود. گاهی اوقات به آن ~SS (Slave Select) نیز گفته می شود.

یک مورد خاص از اتصال مستقل، گزینه با یک برده واحد است. در این حالت، ممکن است بخواهید سیگنال ~CS را به زمین بکشید تا دستگاه همیشه در حالت فعال باشد. اما انجام این کار به شدت منع می شود، زیرا دستگاه برده ممکن است از سیگنال CS برای مقداردهی اولیه یا برای اهداف خدمات دیگر استفاده کند.

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

همانطور که در شکل بالا می بینید، در اینجا ما از آن استفاده می کنیم سیگنال مشترکانتخاب برده برای همه بردگان خروجی هر برده به ورودی بعدی متصل می شود. خروجی آخرین slave به ورودی master متصل می شود و در نتیجه یک مدار بسته تشکیل می شود. با این اتصال، می‌توان فرض کرد که دستگاه‌های متصل به سری، یک شیفت رجیستر بزرگ را تشکیل می‌دهند. بر این اساس، داده ها را می توان در همه دستگاه ها "در یک جلسه" نوشت، پس از مونتاژ بسته لازم که داده ها را برای هر یک از دستگاه ها به ترتیب مطابق با نظم فیزیکی اتصال ترکیب می کند. اما یک نکته ظریف وجود دارد. اول، همه ریز مدارها باید از این نوع اتصال پشتیبانی کنند. ثانیاً، هسته لینوکس از این نوع اتصال پشتیبانی نمی کند، بنابراین اگر همچنان می خواهید از آن استفاده کنید، باید درایورهای موجود را تغییر دهید یا خودتان بنویسید.

چهار حالت کار برای دستگاه های SPI وجود دارد. به عنوان یک قاعده، آنها بیشترین سردرگمی را در بین مبتدیان ایجاد می کنند. این چهار حالت ترکیبی از دو بیت هستند:

  • CPOL (قطب ساعت) - تعریف می کند سطح اول(قطب) سیگنال همگام سازی.
    CPOL=0 نشان می دهد که سیگنال ساعت کم شروع می شود، به طوری که لبه افزایشی در حال افزایش است و لبه نزولی در حال سقوط است.
    CPOL=1، سیگنال ساعت از بالا شروع می شود، بنابراین لبه صعودی در حال سقوط و لبه نزولی در حال افزایش است.
  • CPHA (فاز ساعت) - فاز همگام سازی، تعیین می کند که در کدام یک از لبه های سیگنال ساعت به نمونه داده ها می پردازد.
    CPHA=0 نشان می دهد که نمونه برداری در لبه افزایشی ضروری است و
    CPHA=1 نشان می دهد که داده ها باید در لبه سقوط نمونه برداری شوند.
این دو بیت شماره حالت را تشکیل می دهند. CPOL بیت بالا و CPHA بیت پایین است. گاهی اوقات مستندات دستگاه به صراحت شماره حالت را نشان نمی دهد، اما همیشه می توان آن را به راحتی از نمودارهای زمان بندی تعیین کرد. همچنین درک این نکته مهم است که داده‌های واکشی و تنظیم همیشه در لبه‌های مخالف سیگنال ساعت رخ می‌دهند. به عنوان مثال، اجازه دهید دستگاه ما در حالت 0 (متداول ترین حالت) کار کند، در این صورت دستگاه Slave بیت داده را از ورودی MOSI در لبه صعودی سیگنال ساعت می خواند، و دستگاه اصلیداده ها را از Slave در ورودی MISO نیز در لبه افزایشی می خواند. برای وضوح بیشتر، من شکل موج را برای هر چهار حالت عملیاتی ارائه می دهم:

این شکل سیگنال های MOSI (خط آبی) و SCK (خط زرد) را نشان می دهد. در همه موارد، عدد 0x64 منتقل می شود. سبک خطوط عمودیلحظه نمونه گیری داده ها را نشان می دهد. حالت 2 را در نظر بگیرید که همانطور که به یاد داریم CPOL=1 و CPHA=0 برای آن در نظر می گیریم. بنابراین، می بینیم که سیگنال همگام سازی در ابتدا دارد سطح بالا، و نمونه برداری در لبه جلویی (در این حالت سقوط) انجام می شود. از آنجایی که اسیلوسکوپ من فقط دو کانال دارد، سیگنال های ~CS و MISO نشان داده نمی شوند. اما در این مورد، آنها چندان جالب نیستند، برای مثال، سیگنال ~CS فقط یک "شکست" در سراسر انتقال داده است.

2. مروری بر زیرسیستم SPI در لینوکس

درایورهای SPI لینوکس به دو قسمت تقسیم می شوند. اولی درایورهای کنترلر SPI هستند که مستقیماً با سخت افزار یک کنترلر خاص کار می کنند. چنین درایورهایی تعیین می کنند که چگونه کنترلر را پیکربندی کنند، چه اقداماتی را هنگام تغییر به حالت کم مصرف (تعلیق) و خروج از آن (رزومه) انجام دهند، انتقال بعدی (spi_transfer) را از صف انتقال در پیام (spi_message، در مورد صف های درست زیر) انتخاب کنند. ) و ارسال مستقیم آن به پورت، همچنین به عنوان فعال/غیرفعال تعریف می شود دستگاه خاصاز طریق CS (توابع cs_activate/cs_deactivate). در این مقاله، من توضیح نمی دهم نوع داده شدهرانندگان به عنوان یک قاعده، آنها قبلاً برای آن دسته از MCU / eMPU که یک پورت لینوکس روی آنها وجود دارد پیاده سازی شده اند و فقط در صورت نیاز به عملکرد خاصی مانند Chip Select Decoding، باید با دست خود وارد آنها شوید تا بتوانید آن را فعال کنید. دستگاه برده مورد نظر از طریق یک منطق خارجی. گاهی اوقات این مفید است، به عنوان مثال، در صورت عدم وجود GPIO.

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

اکثر درایورهای پروتکل ماژول های هسته هستند. به عنوان مثال، اگر دستگاه یک کدک صوتی متصل به SPI باشد، درایور از توابع ارائه شده توسط ALSA نیز استفاده می کند و برنامه ها (به عنوان مثال، madplay) می توانند از طریق دستگاه کاراکتر /dev/audio با آن کار کنند. بدون اینکه کوچکترین تصوری از نحوه چیدمان سخت افزاری آن داشته باشید و به کدام اتوبوس متصل است.

هسته همچنین یک درایور پروتکل هدف کلی به نام spidev را با یک رابط دستگاه کاراکتر ارائه می دهد. این امکان دسترسی نیمه دوبلکس به SPI Slave را با استفاده از استاندارد فراهم می کند تماس های سیستمی read() و write()، حالت عملیات را تنظیم کنید و ارتباط دوطرفه کامل را از طریق فراخوانی ioctl() انجام دهید.

بنابراین، درایورهای پروتکل برای دستگاه های SPI را می توان به دو نوع تقسیم کرد:

  • درایورهای userspace که در فضای کاربر کار می کنند و برنامه های معمولی به هر زبانی هستند که با خواندن / نوشتن دستگاه کاراکتر spidev مربوطه با دستگاه SPI کار می کنند.
  • درایورهایی که در فضای هسته اجرا می شوند و از طریق فایل های دستگاه در دایرکتوری dev / یا از طریق ویژگی های دایرکتوری دستگاه در sysfs، یک رابط برای فضای کاربران فراهم می کنند.
تمام تماس‌های دستگاه‌های SPI توسط لینوکس در صف قرار می‌گیرند. درایورهای پروتکل SPI به طور صریح یا ضمنی بر روی پیام هایی که توسط ساختار struct spi_message نمایش داده می شوند، کار می کنند، که یک تراکنش SPI چند بخش است.
struct spi_message ( struct list_head transfers; struct spi_device *spi; unsigned is_dma_mapped:1; void (*complete)(void *context); void *context; signed actual_length; int status; struct list_head queue; void *state; );
نقل و انتقالات - لیست پیوندی بخش های منتقل شده در معامله (انتقالات)؛
spi - یک اشاره گر به دستگاه spi که در آن پیام در صف قرار می گیرد.
is_dma_maped - اگر این پرچم درست باشد، هر دو آدرس مجازی dma و cpu برای هر بافر ارسال ارائه می‌شوند.
کامل - یک تماس پاسخ برای اطلاع از پایان تراکنش.
Context آرگومان کامل () callback است.
actual_length تعداد کل بایت هایی است که در همه ارسال های موفق ارسال شده است.
وضعیت - 0 در موفقیت، یا یک مقدار منفی با خطا در خطا.

برچسب ها:

  • لینوکس
  • spi
  • spidev
  • تعبیه شده است
  • ماژول هسته
افزودن برچسب

معرفی

SPI (3-wire) یک رابط محبوب برای تبادل اطلاعات سریال بین ریز مدارها است. رابط SPI به همراه I 2 C یکی از پرکاربردترین رابط ها برای اتصال ریز مدارها می باشد. در اصل توسط موتورولا اختراع شد و در حال حاضر در محصولات بسیاری از تولید کنندگان استفاده می شود. نام آن مخفف "Serial Peripheral Bus" است که هدف آن را نشان می دهد - گذرگاهی برای اتصال دستگاه های خارجی. اتوبوس SPI بر اساس master-slave سازماندهی شده است. باس اصلی معمولا یک میکروکنترلر است، اما می تواند یک منطق قابل برنامه ریزی، کنترل کننده DSP یا ASIC نیز باشد. اتوبوس متصل به استاد دستگاه های خارجییک اتوبوس برده تشکیل دهید. نقش آنها توسط انواع مختلفی از ریز مدارها، از جمله. دستگاه های ذخیره سازی (EEPROM، Flash-Memory، SRAM)، ساعت بلادرنگ (RTC)، ADC/DAC، پتانسیومترهای دیجیتال، کنترلرهای تخصصی و غیره.

جزء اصلی رابط SPI یک شیفت رجیستر معمولی است که سیگنال های ورودی/خروجی همزمان سازی و بیت استریم سیگنال های رابط را تشکیل می دهند. بنابراین، پروتکل SPI به درستی نه یک پروتکل انتقال داده، بلکه یک پروتکل تبادل داده بین دو ثبات ثبت نامیده می شود، که هر یک به طور همزمان هم عملکرد گیرنده و هم عملکرد یک فرستنده را انجام می دهند. یک شرط ضروری برای انتقال داده در گذرگاه SPI، تولید سیگنال ساعت اتوبوس است. این سیگنال حق تولید فقط گذرگاه اصلی را دارد و عملکرد باس slave کاملاً به این سیگنال بستگی دارد.

اتصال برق

سه نوع اتصال به گذرگاه SPI وجود دارد که هر کدام شامل چهار سیگنال است (جدول 1 را برای نامگذاری اصلی و جایگزین آنها ببینید). ساده ترین اتصال، که فقط شامل دو تراشه است، در شکل 1 نشان داده شده است. در اینجا، گذرگاه اصلی داده ها را روی خط MOSI در هماهنگی با سیگنال SCLK تولید شده توسط آن ارسال می کند و Slave بیت های داده ارسال شده را در لبه های خاصی از آن می گیرد. سیگنال ساعت دریافت کرد در همان زمان، Slave بسته داده خود را ارسال می کند. طرح ارائه شده را می توان با حذف خط MISO ساده کرد، اگر آی سی برده استفاده شده برای ارسال داده ها را فراهم نکند یا لازم نباشد. انتقال داده یک طرفه را می توان در ریزمدارهایی مانند DAC، پتانسیومترهای دیجیتال، تقویت کننده های قابل برنامه ریزی و درایورها یافت. بنابراین، گزینه در نظر گرفته شده برای اتصال یک آی سی برده نیاز به 3 یا 4 خط ارتباطی دارد. برای اینکه آی سی slave بتواند داده ها را دریافت و ارسال کند، علاوه بر وجود سیگنال ساعت، باید خط SS را نیز به سمت پایین هدایت کرد. در غیر این صورت آی سی slave غیر فعال خواهد بود. هنگامی که فقط از یک آی سی خارجی استفاده می شود، حذف خط SS نیز با تنظیم سخت ورودی انتخابی آی سی برده در پایین، می تواند وسوسه انگیز باشد. چنین راه حلی بسیار نامطلوب است و ممکن است منجر به خرابی یا حتی عدم امکان انتقال داده شود، زیرا. ورودی انتخاب چیپ برای انتقال آی سی به آن استفاده می شود حالت اولیهو گاهی اوقات خروجی اولین بیت داده را آغاز می کند.


برنج. 1. ساده ترین اتصال به گذرگاه SPI

در صورت نیاز به اتصال چندین میکرو مدار به گذرگاه SPI، از یک اتصال مستقل (موازی) (شکل 2) یا یک اتصال آبشاری (سریال) (شکل 3) استفاده می شود. اتصال مستقلرایج تر است، زیرا با استفاده از هر تراشه سازگار با SPI به دست آمد. در اینجا، همه سیگنال‌ها، به جز انتخاب تراشه‌ها، به صورت موازی به هم متصل می‌شوند و گذرگاه اصلی، با انتقال یک یا آن سیگنال SS به حالت پایین، تنظیم می‌کند که با کدام IC برد داده‌ها را مبادله کند. عیب اصلی چنین اتصالی نیاز به خطوط اضافیبرای آدرس دهی ریز مدارهای برده (تعداد کل خطوط ارتباطی 3+n است که n تعداد ریز مدارهای برده است). آبشاری عاری از این نقص است، زیرا در اینجا، یک شیفت رجیستر بزرگ از چندین ریزمدار تشکیل شده است. برای انجام این کار، همانطور که در شکل 3 نشان داده شده است، خروجی داده انتقال یک آی سی به ورودی داده دریافتی دیگری متصل می شود. ورودی های انتخاب تراشه در اینجا به صورت موازی متصل می شوند و بنابراین تعداد کل خطوط ارتباطی 4 خط نگه داشته می شود. با این حال، آبشاری تنها در صورتی امکان‌پذیر است که پشتیبانی آن در مستندات تراشه‌های مورد استفاده مشخص شده باشد. برای پی بردن به این موضوع، مهم است که بدانید به چنین ارتباطی در انگلیسی "daisy-chaining" گفته می شود.


برنج. 2. اتصال مستقل به اتوبوس SPI


برنج. 3. آبشاری به اتوبوس SPI

پروتکل انتقال

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

  • CPOL - سطح اولیه سیگنال همگام سازی (اگر CPOL=0، پس خط همگام سازی قبل از شروع چرخه انتقال و پس از پایان آن سطح پایینی دارد (یعنی لبه اول در حال افزایش است و آخرین لبه در حال سقوط است) در غیر این صورت، اگر CPOL=1، - بالا (یعنی اولین جبهه در حال سقوط است و آخرین در حال افزایش است)).
  • CPHA - مرحله همگام سازی؛ این پارامتر دنباله ای را تعیین می کند که در آن داده ها تنظیم و بازیابی می شوند (اگر CPHA = 0، سپس داده ها در لبه افزایشی در چرخه همگام سازی نمونه برداری می شوند، و سپس، در لبه سقوط، داده ها تنظیم می شوند؛ اگر CPHA = 1، سپس داده های تنظیم در لبه افزایشی در چرخه ساعت گرفته می شود و در لبه سقوط نمونه برداری می شود). اطلاعات مربوط به حالت های SPI در جدول 2 خلاصه شده است.

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

مقایسه با شینه I 2 C

همانطور که قبلاً ذکر شد ، گذرگاه سریال 2 سیم I 2 C برای اتصال ریز مدارها کمتر محبوب نیست. در زیر می توانید مزایای این یا آن اتوبوس سریال را مشاهده کنید.

مزایای اتوبوس SPI مزایای اتوبوس I2C
سادگی بسیار زیاد پروتکل انتقال در لایه فیزیکی، قابلیت اطمینان و سرعت بالای انتقال را تعیین می کند. محدودیت سرعت باس SPI در ده ها مگاهرتز اندازه گیری می شود و بنابراین برای جریان داده های بزرگ ایده آل است و به طور گسترده در DAC/ADC سرعت بالا، درایورهای نمایشگر LED و تراشه های حافظه استفاده می شود. گذرگاه I 2 C بدون توجه به تعداد تراشه های متصل به آن دو سیم باقی می ماند.
تمام خطوط اتوبوس SPI یک طرفه هستند، که کار تبدیل سطح و جداسازی گالوانیکی ریز مدارها را بسیار ساده می کند. امکان کارکرد مولتی مستر زمانی که چندین ریزمدار اصلی به باس متصل هستند.
سهولت اجرای نرم افزار پروتکل SPI. پروتکل I2C استانداردتر است، بنابراین، کاربر تراشه های I2C بیشتر از مسائل ناسازگاری اجزای انتخاب شده محافظت می شود.

پروتکل های مشتق شده و سازگار

  • مایکروایر.

    پروتکل MICROWIRE از National Semiconductor با پروتکل SPI در حالت 0 یکسان است (CPOL = 0، CPHA = 0).

  • رابط حداکثر 3 سیم

    تفاوت این رابط این است که به جای انتقال کامل دوطرفه روی دو خط یک طرفه، انتقال نیمه دوطرفه را روی یک خط DQ دو طرفه انجام می دهد.

  • QSPI

    یک پروتکل سطح بالاتر از SPI که امکان انتقال خودکار داده ها را بدون دخالت CPU فراهم می کند.

علاوه بر این، رابط SPI مبنایی برای ساخت تعدادی رابط تخصصی است، از جمله. رابط اشکال زدایی JTAG و رابط های کارت حافظه فلش، از جمله. SD و MMC.

Tab. 1. سیگنال های الکتریکی اتوبوس SPI

لاستیک های پیشرو اتوبوس برده
تعیین پایه نماد جایگزین شرح تعیین پایه نماد جایگزین شرح
MOSI DO، SDO، DOUT MOSI DI، SDI، DIN
میسو DI، SDI، DIN ورودی دریافت سریال میسو DO، SDO، DOUT خروجی سریال
SCLK DCLOCK، CLK، SCK خروجی همگام سازی انتقال داده SCLK DCLOCK، CLK، SCK ورودی همگام سازی را دریافت کنید
اس اس CS خروجی Slave Select (انتخاب تراشه) اس اس CS ورودی انتخاب برده (انتخاب تراشه)

SPI(گذرگاه جانبی سریال) - پروتکل مبادله محیطی سریال. این سوراخ توسط این شرکت ساخته شده است موتورولا، اما در حال حاضر توسط بسیاری از تولید کنندگان استفاده می شود. این برای ارتباط میکروکنترلرها با یکدیگر و همچنین با انواع لوازم جانبی طراحی شده است: سنسورها، ADCها، تراشه های حافظه، ساعت ها. با این حال، رایج ترین استفاده SPIبرنامه ای است که روی حافظه میکروکنترلر نوشته می شود. در میکروکنترلرها AVRبا کمک SPIمی توانید میکروکنترلر را بدون لحیم کاری از روی برد فلش کنید، به این روش فریمور گفته می شود ISP (در برنامه نویسی سیستم). اگرچه نام ها SPIو ISPبسیار همخوان، این یک چیز نیست، در AVR SPIبه عنوان لایه فیزیکی استفاده می شود ISP، یعنی از خطوط استفاده می شود SPIبرای انتقال داده، اما خود پروتکل (لایه نرم افزار) متفاوت است.

برای انتقال داده ها به SPI از سه خط استفاده می شود:

MISO (خروجی برده اصلی ورودی)- در این خط، Master (Master) داده ها را از Slave (slave) دریافت می کند.

MOSI (ورودی اصلی خروجی برده)- در این خط Master داده ها را به Slave ارسال می کند.

SCK (ساعت سریال)- برای انتقال یک سیگنال ساعت به دستگاه برده عمل می کند.

خط نیز استفاده می شود SS (Slave Select)، که دستگاهی را که با آن مشخص می کند استادداده ها را مبادله خواهد کرد.

با توجه به اینکه بسیاری از سازندگان از SPI در دستگاه های خود استفاده می کنند، ممکن است نام پین ها کمی متفاوت باشد. در زیر جدولی با نام های جایگزین آورده شده است.


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

اجرای فیزیکی SPI، دو رجیستر شیفت است که به هم متصل شده اند.


بسته به سطح منطقی سیگنال SCK، همگام سازی رخ می دهد استادو بردهو در کدام جبهه داده ها گرفته و جابجا می شوند، 4 حالت امکان پذیر است SPI.

  • CPOL = 0 - سیگنال همگام سازی از سطح پایین شروع می شود.
  • CPOL = 1 - سیگنال همگام سازی از سطح بالایی شروع می شود.
  • CPHA = 0 - داده ها در لبه افزایشی سیگنال همگام سازی نمونه برداری می شوند.
  • CPHA = 1 - داده ها در لبه سقوط سیگنال همگام سازی نمونه برداری می شوند.
اسیلوگرام های زیر نشان می دهد که بسته 0x17 در حالت های مختلف چگونه به نظر می رسد.
CPOL=0 CPHA=0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL=1 CPHA=1

SPI- رابط همزمان، یعنی به منظور دریافت برخی داده ها از برده, استادباید چیزی بفرستد به نظر می رسد همه چیز روشن است، اما اگر چه؟ استادیک بایت می فرستد و بردهباید دو تا بهش پس بده؟ در این صورت Master باید 2 بار چیزی مثلا 0x00 برایش بفرستد.
//فرمان را ارسال کنید، در پاسخ باید دو بایت بیاید Spi_Master_Transmit(chx); //ارسال چیزی برای دریافت اولین بایت Spi_Master_Transmit(0X00); touch_x = SPDR; touch_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
این همه است، در بالا نمونه کدی است که از یک پیش نویس کاری گرفته شده است.

رابط سریال همزمان SPI برای ورودی و خروجی داده ها در رابط های نقطه به نقطه با یک دستگاه Master (SPI-master) و یک Slave (SPI-slave) طراحی شده است (شکل 1.24). مدار کنترل SPI-master ساعت SCK را تولید می کند که به طور همزمان سیگنال ها را در خروجی MOSI ارسال می کند و سیگنال ها را در ورودی MISO دریافت می کند. همان پالس ساعت SCK با ورود به SPI Slave، دریافت سیگنال ها را در ورودی MOSI آن و تشکیل سیگنال ها را در خروجی MISO کنترل می کند. مدارهای سیگنال MOSI و MISO مجزا اجرای ارتباطات دوطرفه کامل را آسان می کند.

فرمت های داده، پارامترهای سیگنال، زمان بندی و غیره در رابط تنظیم نمی شوند، به عنوان مثال، نرخ تبادل داده تنها با فرکانس پالس های ساعت SCK تولید شده توسط SPI-master تعیین می شود. حداکثر فاصله به سطح اعوجاج سیگنال در خطوط ارتباطی بستگی دارد، فرض بر این است که تبادل اطلاعات قابل اعتماد در فواصل تا چند متر امکان پذیر است.

در اصل، این یک رابط تمام عیار حتی برای لایه فیزیکی نیست. در واقع SPI یک رویه استاندارد ورودی-خروجی داده را در رجیسترهای شیفت پیاده سازی می کند، هیچ الگوریتم کنترل عملیات، کنترل داده های ارسالی ارائه می شود. تمام مراحل کنترل لازم باید توسط SPI-master انجام شود. از یک طرف، این نیاز دارد وجوه اضافیکنترل، و از سوی دیگر، ابزار پیاده سازی خود رابط SPI را ساده می کند. SPI Slave یک رجیستر تغییر استاندارد با تعداد بیت داده مورد نیاز است.

به عنوان مثال، میکروکنترلرهای خانواده AVR از ATMEL از داده های ورودی / خروجی در هر دو حالت SPI-master و SPI-slave پشتیبانی می کنند. چرخه تبادل استاندارد شامل انتقال همزمان یک بایت داده در هر دو جهت است (شکل 1.24). هنگام ارسال پیام‌های چند بایتی، SPI-slave باید حاوی یک شیفت رجیستر با عمق بیت مناسب باشد و SPI-master باید تبادل توالی مورد نیاز بایت‌های داده را کنترل کند، هر بایت را پس از چرخه عملیات رابط استاندارد بعدی پردازش کند و اطمینان حاصل کند که راه اندازی چرخه مبادله استاندارد بعدی

نه تنها برای تبادل داده بین میکروکنترلرها، بلکه برای رابط میکروکنترلرها با ADC های خارجی (ADC) و DAC (DAC)، تراشه های حافظه - SRAM، FRAM، SEERAM و بسیاری از دستگاه های دیگر استفاده می شود. با توجه به فرمت داده های سریال و سازماندهی منطقی ساده رابط SPI، این ریز مدارها در بسته های فشرده 8 تا 16 پین تولید می شوند. روی میز. 1.6 نمونه هایی از ریز مدارها را برای اهداف عملکردی مختلف و از سازندگان مختلف با رابط SPI نشان می دهد. این مثال ها نشان می دهد که فرمت رابط سریال می تواند تعداد خطوط ورودی/خروجی مورد نیاز را به میزان قابل توجهی کاهش دهد.

جدول 1.6

نوع تراشه

تنظیمات اصلی

نوع پوسته

سازنده

24 بیت، دلتا سیگما، 15 هرتز

24 بیت، دلتا سیگما، 41 کیلوهرتز

16 بیتی، SAR، 100 کیلوهرتز

16 بیتی، PulSAR، 500 کیلوهرتز

12 بیت، U-out، 2.5 میکروثانیه

16 بیت، U-out، 10 میکرو ثانیه

14 بیت، I-out، 0.04 میکرو ثانیه

12 بیت، I-out، 0.6 میکرو ثانیه

16 بیت، U-out، 1 میکرو ثانیه

www.maximic.com

نوع تراشه

تنظیمات اصلی

نوع پوسته

سازنده

16 کیلوبیت بر ثانیه، 1 تریلیون

4 کیلو بیت، نامحدود

64 کیلوبیت بر ثانیه، نامحدود

256K، 32768×8، 0.1M چرخه

چرخه‌های 8K، 8×1024، 0.1M

چرخه‌های 16K، 8192×8، 0.1M

128K، 16384×8، 0.1M چرخه

256K، 32768×8، 0.1M چرخه

حسگر حرارتی

13 بیتی، -40 تا +150 درجه سانتیگراد (±0.5 درجه سانتیگراد)

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

برای مثال، رابط SPI ممکن است برای خواندن اطلاعات وضعیت تعداد زیادی حسگر روشن/خاموش یا برای وارد کردن داده‌های چند بیتی در قالب موازی مفید باشد. برای این منظور، استفاده از رجیسترهای جداگانه با نوشتن موازی و خواندن سریال (8 بیت موازی ورودی / سریال خروجی شیفت رجیستر)، به عنوان مثال CD74HCT166 (شکل 1.25) راحت است.

طرح اتصال شانزده سنسور روشن و خاموش (S1 - S16) از طریق رابط SPI میکروکنترلر در شکل نشان داده شده است. 1.26. لازم به ذکر است که قبل از شروع عملیات رابط SPI، لازم است سیگنالی برای نوشتن اطلاعات به رجیسترها از ورودی های موازی D0-D7 تولید شود. برای این کار می توانید از یکی از خروجی های میکروکنترلر، در این مثال PC0.

برنج. 1.25. نمودار عملکردی CD74HCT166 را ثبت کنید

برنج. 1.26. اتصال سنسورهای روشن/خاموش به رابط SPI

برنج. 1.27. اتصال یک نشانگر شش رقمی به رابط SPI

با استفاده از رجیسترهایی با ضبط سریال و خروجی موازی اطلاعات (8 بیت سریال ورودی، رجیستر شیفت موازی خروجی) - SN74HC595، رابط SPI همچنین می تواند برای خروجی موازی اطلاعات چند بایتی استفاده شود. به عنوان مثال، در شکل. شکل 1.27 نمودار اتصال یک نشانگر شش رقمی هفت بخش به میکروکنترلر را نشان می دهد. برخلاف طرح قبلی، سیگنال خروجی موازی (PB1) باید پس از پایان انتقال داده توسط رابط SPI با وسایلی فراتر از رابط تولید شود. به عنوان مثال، الگوریتم تعامل با رابط باید کنترل تعداد بایت های داده ارسال شده را فراهم کند و پس از اتمام انتقال آخرین بایت، لازم است سیگنال خروجی موازی نیز ارسال شود.