در این مقاله به بیان مبانی ارتباط سریال همزمان خواهیم پرداخت. ارتباط سریال پرکاربردترین رابط برای انتقال دادهها بین دستگاههای جانبی است.
پروتکل نوعی ارتباط امن و قابل اطمینان و دارای مجموعهای از قانونها است که توسط دستگاه مبدأ (فرستنده) و دستگاه مقصد (گیرنده) فراخوانی میشود. برای درک آسان، ابتدا با حالتهای انتقال دادهها آشنا میشویم.
برای برقراری ارتباط سریال، سه حالت مختلف وجود دارد که امکان ارسال و دریافت دادهها را فراهم میکند. این حالتها به صورت زیر هستند:
در این حالت تنها یکی از دستگاهها میتواند دادهها را ارسال کند، در حالی که دستگاه دیگر تنها در حالت دریافت قرار میگیرد.
این نوع ارتباط یک طرفه است و بیشتر در تلویزیون و رادیو کاربرد دارد.
انتقال دادهها در حالت Simplex یک طرفه است. اما در نیمه دوبلکس، انتقال در دو طرف انجام میشود اما نه در یک زمان. همچنین اگر فرستندهای در حال ارسال دادهها است، گیرنده میتواند دادهها را دریافت کند اما نمیتواند در همان لحظه دادهها را ارسال کند.
مثالهای شناخته شدهی نیمه دوبلکس، واکی-تاکی و اینترنت هستند که کاربر در آنها دادههایی را ارسال میکند و باید منتظر دریافت دادهها توسط گیرنده یا سرور باشد.
گیرنده و فرستنده میتوانند همزمان دادهها را به یکدیگر ارسال کنند. این حالت برای ارتباط دو طرفهی پیچیده مانند گوشی همراه مناسب است.
علاوه بر حالتهای انتقال دادهها، سیگنال ساعت نقش مهمی را بر عهده دارد. اختلال عملکرد در این سیگنال، منجر به انتقال غیرمنتظرهی دادهها و حتی از دست رفتن دادهها میشود.
سیگنال ساعت برای دستگاههای مختلف، متفاوت است و به دو نوع “همزمان” و “ناهمزمان” تقسیم میشود. سیگنال ساعت در ارتباط سریال ناهمزمان وجود ندارد. اما در ارتباط سریال همزمان این سیگنال برای همگام سازی استفاده میشود.
ساختار این ارتباط دارای یک Master (مانند میکروکنترلر) است که سیگنال ساعت را به یک یا چند Slave (مانند دستگاههای جانبی) ارسال میکنند. هر بار با تغییر سیگنال ساعت، دستگاهها دادهها را ارسال یا دریافت میکنند.
بنابراین ارتباط سریال همزمان به صورت نقطه به نقطهای است. دو شکل رایج از ارتباط سریال همزمان وجود دارد: I2C (مدار یکپارچه) و SPI (رابط جانبی سریال).
از آن جایی که بیتهای شروع و توقف وجود ندارند، امکان استفادهی بهینه از پهنای باند انتقال داده را برای بیتهای بیشتر وجود دارد و منجر به آسان و سادهتر شدن فرایند انتقال میشود.
با فعال شدن هر سیگنال ساعت، دادهها به اندازهی یک بیت در رجیستر به سمت پایین جابجا (shift) میشوند. همه دستگاههای موجود در یک ارتباط سریال همزمان، دادهها و سیگنال ساعت مشترک را به اشتراک میگذارند. دستگاههای جانبی توسط کنترل کننده هدایت میشوند که چه زمانی بیتهای جابجا شده را دریافت کنند و چه زمانی آنها را رد کنند.
همان طور که در شکل زیر نشان داده شده است، دستگاههای SPI با چهار سیم به هم وصل میشوند:
این نمودار، ارتباط سریال همزمان SPI بین میکروکنترلر و سه دستگاه جانبی را نشان میدهد. سه سیم SDI، SDO و CLK به طور مشترک به دستگاههای جانبی متصل هستند. سه خط CS وجود دارد که به هر دستگاه جانبی وصل میشود.
هنگامی که کنترل کننده میخواهد با یکی از دستگاههای جانبی ارتباط برقرار کند، باید پایهی CS دستگاه جانبی مورد نظر فعال باشد. در طی هر چرخهی سیگنال ساعت، انتقال دادهها دو طرفه انجام میشود.
کنترل کننده (Master) با تغییر وضعیت سیگنال ساعت، یک بیت را روی خط SDI به دستگاه جانبی (Slave) ارسال میکند. همچنین دستگاه جانبی با تغییر وضعیت سیگنال ساعت، یک بیت را روی خط SDO به کنترل کننده میفرستد.
عمل انتقال دادهها ممکن است در چند چرخه ادامه پیدا کند. با غیرفعال شدن پایهی CS، عمل انتقال دادهها متوقف میشود و دستگاه جانبی از حالت انتخاب خارج میشود. شکل زیر عملکرد SPI را نشان میدهد.
مزیت سیستم ارتباطی SPI در سادگی و آسانی تراکنش دادهها نهفته است. یعنی کافی است دادهها را به دستگاه جانبی مورد نظرتان، ارسال کنید. اما مشکل این است که با افزایش تعداد دستگاههای جانبی، تعداد سیمهای موردنیاز نیز افزایش خواهد یافت.
توجه کنید که در صنعت الکترونیک، استانداردی برای نامگذاری سیمهای رابط SPI وجود ندارد. ممکن است به هنگام طراحی با چند نوع نامگذاری مواجه شوید. برخی از نامگذاریهای متداول با رعایت ترتیب در زیر آورده شدهاند:
به عنوان مثال، شتاب سنج ADXL345 میتواند از طریق SPI ارتباط برقرار کند. پروتکل آن به صورت زیر عمل میکند: ابتدا کنترل کننده، پایهی CS را در سطح Low قرار میدهد.
سپس دستوری بر روی خط SDI به حسگر ارسال میشود تا شروع به اندازه گیری کند. ADXL345 به طور مداوم از شتاب نمونه برداری میکند و آخرین دادهها را در سه رجیستر حافظه ذخیره میکند.
هنگامی که کنترل کننده میخواهد دادههای ثبت شده توسط حسگر را بخواند، مقدار CS در Low قرار میگیرد و درخواستی برای خواندن رجیسترهای حافظه را ارسال میکند. حسگر شتاب، دادهها را بر خط SDO به کنترل کننده میفرستد و به هنگام دریافت دادهها توسط کنترل کننده، مقدار CS در High قرار میگیرد.
I2C یکی دیگر از پرکاربردترین پروتکلهای ارتباط سریال همزمان است و ساختار آن مشابه SPI است. با این تفاوت، I2C تنها به دو اتصال بین کنترل کننده و دستگاههای جانبی نیاز دارد.
این نمودار، ارتباط سریال همزمان I2C بین میکروکنترلر و سه دستگاه جانبی را نشان میدهد. دو سیم SDA و SCL به طور مشترک به دستگاههای جانبی متصل هستند.
برخلاف رابط SPI، رابط I2C دارای خط انتخاب دستگاه جانبی نیست. بنابراین روش دیگری وجود دارد تا کنترل کننده بداند دادهها برای کدام دستگاه ارسال میشود. این کار با آدرس دهی بر خط SDA انجام میشود. یعنی هر دستگاه جانبی دارای یک آدرس منحصر به فرد است.
با همگام سازی سیگنال ساعت همانند عملکرد SPI، کنترل کننده آدرس دستگاه مورد نظر را دریافت میکند و دادهها را بر خط SDA مینویسد یا میخواند. از این رو، دستگاههای جانبی فقط در صورت درخواست کنترل کننده، از طریق آدرس خود پاسخ میدهند و هرگز انتقال دادهها را شروع نمیکنند.
مزیت I2C این است که برای برقراری ارتباط با دستگاهها تنها به دو سیم نیاز دارید. اما نحوهی آدرس دهی پیش از ارسال هر دستوری ممکن است کمی پیچیده باشد.
ACS37800 حسگر جریان محصول شرکت Allegro است. آدرس پیش فرض که توسط شرکت سازنده تنظیم شده است، بر حسب دسیمال برابر 127 است. این آدرس توسط کاربران با توجه به نیاز پروژهها قابل تغییر است.
ابتدا کنترل کننده یک بایت با آدرس 127 و یک بیت “0” ارسال میکند که نشان میدهد قصد برقراری ارتباط با حسگر را دارد. همهی دادهها با تغییر وضعیت سیگنال ساعت ارسال میشوند.
سپس کنترل کننده برای خواندن دادهها، دوباره یک بایت با همان آدرس و یک بیت “1” ارسال میکند. دستگاه جانبی یک یا چند بایت داده را به کنترل کننده میفرستد و دادهها را پردازش میکند تا جریان مورد نظر به دست آید. برای کسب اطلاعات بیشتر میتوانید برگهی اطلاعات ACS37800 موجود در سایت فروشگاه اسکایتک را مطالعه کنید.
SPI و I2C پروتکلهای پرکاربردی هستند زیرا به شما اجازه میدهند با طیف گستردهای از تراشههای حسگر و بدون نیاز به استفاده از پروتکل خروجی / ورودی کنترل کننده (IO)، ارتباط برقرار کنید.
از آن جایی که هر دو رابط به صورت گذرگاه (Bus) هستند، میتوانید بسیاری از دستگاهها را در یک گذرگاه قرار دهید و فقط در صورت نیاز از طریق ارسال سیگنال CS در SPI یا آدرس دهی در I2C، دستگاهها را فراخوانی کنید.