آموزش راه اندازی پروتکل های SPI و I2C توسط Raspberry Pi 3
راه اندازی SPI:
(SPI(serial peripheral interface یا پروتکل اتصال سریال بین قطعات جانبی یک گذرگاه رابط است که در بسیاری از مدارهای مجتمع از جمله سنسورها، بسیاری از حافظه ها و انواع گوناگونی از نمایشگرها پیاده سازی شده است. قطعاتی که spi را پشتیبانی می کنند تنها از دو پایه برای انتقال اطلاعات استفاده می نمایند.یکی با نام SDI یا MOSI برای دریافت داده و دیگری با نام SDO یا MISO برای ارسال داده. علاوه بر این دو پایه در spi دو پایه دیگر نیز در انتقال اطلاعات نقش دارند. یکی از این پایه ها برای همزمان کردن انتقال داده ها بین دو طرف استفاده می شود با نام SCK یا SCLK و پایه دیگر که (CE(chip enable یا SS که برای اعلام آغاز و پایان انتقال داده کاربرد دارد. رزبری پای دارای سه واحد SPI است که تنها SPI0 بروی هدر برد ها در دسترس است. همیشه این واحد در رزبری به صورت Master عمل میکند.
تنظیمات :
ابزار SPI به صورت پیش فرض بروی رزبری پای فعال نیست. برای فعال سازی این ابزار باید مراحل زیرا به ترتیب انجام دهید.
-1-در ترمینال دستور sudo raspi-config تایپ واجرا کنید ، یا نرم افزار raspi-config گرافیکی را اجرا کنید.
-2-در صفحه ی باز شده با فشردن کلید پایین گزینه ی 9 با نام Advanced Options را باز کنید.
-3-سپس گزینه ی A6 SPI را انتخاب کنید.
-4-در هنگام انتخاب A6 SPI رزبری از شما سوالی مبنی بر تایید فعال سازی میپرسد و شما باید گزینه ی yes را انتخاب کنید.
-5-سپس رزبری سوالی مبنی بر بارگزاری مجدد ماژول kernel می کند، در پاسخ این سوال گزینه ی yes را انتخاب کنید.
-6-حالا گزینه ی <Finish> را با فشاردادن کلید چپ انتخاب کنید.
-7-در نهایت سیستم را راه اندازی مجدد کنید.
قبل از اینکه از واحد SPI استفاده کنید باید با دستوراتی که برای SPI در ترمینال در نظر گرفته شده ات درایور SPI را در کرنل لینوکس با دستور زیر بارگذاری کنید.
gpio load spi
این دستور یک حافظه ی 4 کیلو بایتی را برای SPI در نظر میگیرد. اگر نیاز بیشتری به حافظه برای SPI داریدمی توانید از دستور زیر که یک حافظه ی 100 کیلوبایتی را برای این واحد رزو میکند استفاده کنید.
gpio load spi 100
بعد از اجرای دستور بالا در ترمینال دستور زیر را تایپ کنید.
>ls /dev/*spi*
در پاسخ سیستم می بایست در ترمینال عبارتی مثل عبارت پایین به شما نمایش داده شود.
/dev/spidev0.0 /dev/spidev0.1
عبارت های بالا تعداد و نام کانال های SPI را نمایش میدهد. در اینجا SPI دارای دو کانال است.
برای استفاده از کتابخانه ی SPI در wiringPi باید کتابخانه ی زیر را به ابتدادی پروژه اضافه کنید .
#include <wiringPiSPI.h>
حالا توابع زیر در دسترس هستند.
تابع تنظیم SPI:
از این تابع همانطور که از نامش مشخص است، وظیفه ی تنظیم SPI در کانال و فرکانس مشخص را دارد.
int wiringPiSPISetup (int channel, int speed) ;
پارامتر اول ورودی، برای تنظیم کانال می باشد( رزبری دارای دو کانال 0 و 1 است).
پارامتر دوم ورودی; این پارامتر برای تنظیم نرخ ارسال/دریافت اطلاعات در SPI بر حسب HZ است.و عددی بین 500.000 تا 32,000,000 است.
خروجی این تابع یک عدد صحیح مثبت است که به نام توصیفگر فایل میباشد(مانند UART) ودر تابع بعد مورد استفاده قرار میگیرد. اگر مقدار خروجی منقی باشد نشان دهنده ی بروز خطا میباشد.
تابع نوشتن/خواندن:
همانطور که میدانید در SPI عمل خواندن و نوشتن به صورت همزمان انجام میشود.
پس تابع زیر برای هردو عمل نوشتن وخواندن استفاده میشود.
Int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;
پارامتر اول شماره ی کانال را تعیین میکند. کانال میتواند 0 ویا 1 باشد. پارامتر دوم، در پروتکل SPI برای ارسال و دریافت اطلاعات از یک بافر استفاده میشود بطوری که با ارسال هر بیت اطلاعات یک بیت اطلاعات نیز در یافت میشود، پس باید طول ارسال و دریافت اطلاعات یکی باشد. پارمتر سوم، طول آرایه ای را که قرار است ارسال و دریافت شود را مشخص میکنیم. اگر مقدار خروجی این تابع منفی باشد نشان دهنده ی بروز خطا میباشد.
درشکل زیر پایه های مربروط به دو واحد SPI رزبری پای با دو رنگ مختلف بروی GPIO ها مشخص شده اند.
راه اندازی I2C :
I2C یک پروتکل ارتباطی سریال یک طرفه است که به صورت سنکرون اطلاعات را ارسال میکند(همراه کلاک).از این رابط سریال برای یک سیستم که برای یک یا چند پردازنده وتعدادی تراشه جانبی میباشد پیاده سازی میشود. I2C به صورت یک استاندارد و پروتکل بوده و کلیه ی پردازندها و تراشه هایی که از این پروتکل پشتیبانی میکنند، میتوانند به هم متصل شوند. این قطعات میتوانند حافظه، نمایشگر، سنسور، پردازنده و…باشند. این رابط شامل دو سیم یا خط انتقال میباشد.
1-خط SDA که مخصوص انتقال داده و آدرس است.
2-خط SCL که مخصوص کلاک مورد نیاز برای ارتباط است.
کلاک جهت هماهنگی بین قسمت های مختلف سیستم در نظر گرفته شده است. این کلاک توسط توسط پردازنده ای (رزبری پای ) که سیستم را کنترل میکند تولید میشود. هر دو خط SDA و SCL باید توسط یک مقاومت PUll UP به تغذیه مثبت متصل شوند، تا در حالت عادی هر دو پورت یک منطقی باشند. ساختار سیستم به این صورت است که خطوط SDA و SCL به تمامی قطعات متصل است. پردازنده(رزبری) وظیفه ی ایجاد ارتباط و نظارت بر این دو خط را دارد.
تنظیمات :
ابزار I2C همانند SPI به صورت پیش فرض بروی رزبری پای فعال نیست. برای فعال سازی این ابزار باید مراحل زیرا به ترتیب انجام دهید.
-1-در ترمینال دستور sudo raspi-config تایپ واجرا کنید.
-2-در صفحه ی باز شده با فشردن کلید پایین گزینه ی 9 با نام Advanced Options را باز کنید.
-3-سپس گزینه ی سطر هفتم که با نام I2C مشخص شده را انتخاب کنید.
-4-در هنگام انتخاب I2C رزبری از شما سوالی مبنی بر تایید فعال سازی میپرسد و شما می بایست گزینه ی yes را انتخاب کنید.
-5-سپس رزبری سوالی مبنی بر بار گزاری مجدد ماژول kernel خواهد پرسید ،در پاسخ این سوال گزینه ی yes را انتخاب کنید.
-6-حالا گزینه ی <Finish> را با فشاردادن کلید چپ انتخاب کنید.
-7-حالا سیستم را راه اندازی مجدد کنید.
بعد از اینکه سیستم راه اندازی مجدد شد در ترمینال دستور زیرا برای اطمینان از فعال شدن I2C وارد کنید.
رزبری باید درترمینال این عبارت را چاپ کند.
*ls /dev/*i2c< /dev/i2c- 1
قبل از شروع کار با I2C بد نیست با چند دستور در ترمینال که برای I2C میباشد آشنا شویم. برای شروع باید بسته نرم افزاری i2c-tools را رو رزبری نصب کنید.
برای نصب این بسته دستور زیرا در ترمینال اجرا کنید.
sudo apt-get install -y i2c-tools
در پروتکل I2C برای برقرار ارتباط رزبری با سایر قطعات جانبی ، باید آدرس هر قطعه را داشته باشیم با دستور زیر میتوان به آدرس قطعات متصل به رزبری را پیدا کنید.
i2cdetect -y 1
بعد از اجرای دستور فوق جدول روبرو نمایش داده میشود. در این مثال یک وسیله جانبی با آدرس48 (هگزا دسیمال)به رزبری از طریق I2C متصل شده است.
دستورات زیر میتوانید بروی رجیستر های مربوط به I2C عمل نوشتن و خواندن را انجام داد.
i2cget i2cset i2cdump
برای تنظیم I2c باودریت در ترمیتال از دستور زیر استفاده میشود.
gpio load i2c 1000
این دستور baud rate بخش I2C به 1000Kbps تنظیم میکند.
<include< wiringPiI2C.h #
کتابخانه ی wiringPi برای I2C:
برای استفاده از کتابخانه های I2C در پروژه ی خود کتابخانه ی زیر را به ابتدادی پروژه ی خود اضافه کنید تا توابع مربوط به I2C در دسترس باشد.
توابع:
تابع تنظیم I2C:
طبق روال گذشته اولین تابع برای تنظیم I2C مورد استفاده قرار میگیرد.
int wiringPiI2CSetup (int devId )
این تابع I2C را با آدرسی که به آن داده میشود تنظیم میکند. پس بنابراین ورودی این تابع آدرس دیوایس متصل به I2C رزبری است. برای پیدا کردن آدرس قطعه ی متصل شده به بخش I2C رزبری از دستور
i2cdetec استفاده کنید.
مقدار بازگشتی این تابع عدد استاندارد فایل راه انداز لینوکس است و اگر مقدارش عددی منفی باشد به معنی بروز اشکالی در راه اندازی بخش I2C رزبری است. در غیر اینصورت از عدد باز گشتی این تابع برای توابع بعدی مورد استفاده قرار میگیرد. اگر خروجی این تابع عددی منفی باشد نشان دهنده ی بروز خطایی در ارسال اطلاعات است.
توابع نوشتن:
int wiringPiI2CWrite (int fd, int data);
از این تابع برای ارسال اطلاعات 16 بیتی استفاده میشود. ورودی اول این تابع از خروجی تابع wiringPiI2CSetup گرفته میشود. ورودی دوم نیز اطلاعاتی ارسالی قرار میگیرد.
int wiringPiI2CWriteReg8 (int fd, int reg, int data) int wiringPiI2CWriteReg16 (int fd, int reg, int data)
از این توابع برای نوشتن اطلاعات به صورت 8 بیت و16بیت استفاده میشود .اگر خروجی این تابع عددی منفی باشد نشان دهنده ی بروز خطایی در ارسال اطلاعات است. ورودی های این تابع به ترتیب به شرح زیر است.
ورودی اول از سمت چپ:خروجی تابع wiringPiI2CSetup است .
ورودی دوم :بعضی از قطعاتی که از پروتکل I2C استفاده میکنند. اجازه ی دسترسی پردازنده اصلی I2C را به بعضی از رجیسترهای مخصوصی میدهند، در این ورودی آدرس رجیستری که میخواهید بروی آن اطلاعاتی را بار گذاری میکند،تعیین میشود
در ورودی سوم نیز اطلاعاتی که باید ارسال شود قرار میگیرد.
توابع خواندن:
int wiringPiI2CRead (int fd)
از این تابع برای دریافت اطلاعات 16یا 8 بیتی استفاده میشود. ورودی اول این تابع از خروجی تابع
wiringPiI2CSetup گرفته میشود اگر خروجی این تابع عددی منفی باشد نشان دهنده ی بروز خطایی در دریافت اطلاعات است.
int wiringPiI2CReadReg8 (int fd, int reg) int wiringPiI2CReadReg16 (int fd, int reg)
از این توابع برای خواندن اطلاعات به صورت 8 بیت و16بیت استفاده میشود. اگر خروجی این تابع عددی منفی باشد نشان دهنده ی بروز خطایی در دریافت اطلاعات است. ورودی های این تابع به ترتیب به شرح زیر است.
ورودی اول مانند تابع قبل از خروجی wiringPiI2CSetup گرفته میشود.
در ورودی دوم نیز آدرس رجیستری که میخواهید اطلاعات را از روی آن بخوانید قرار میگیرد.
حل مشکل در راه انداز I2C:
اگر اقدام به فعال سازی I2C توسط raspi-config در مسیر ‘Advanced Options’ نمودید و نتیجه ای در بر نداشت، برای فعال سازی I2C باید در دو فایل تغییراتی انجام دهید .
اولین فایلی که باید بررسی شود فایل modules بوده که باید تغییراتی روی این فایل با دستور زیر در ترمینال داد.
sudo nano /etc/modules
به انتهای فایل باز شده بروید و دو خط زیرا به فایل باز شده اضافه کنید.
i2c-dev i2c-bcm2708
سپس با فشردن همزمان دو کلید Ctrl+O تغییرات انجام شده را ذخیره کنید و با دو کلید Ctrl+x از فایل باز شده خارج شوید.
فایل دوم که با نام config.txt را نیز همانند فایل قبل باید تغییراتی را بروی آن انجام دهید. برای باز کردن این فایل از دستور زیر در ترمینال وارد کنید.
sudo nano /boot/config.txt
به انتهای فایل باز شده بروید و دو خط زیر را اضافه کنید.
dtparam=i2c_arm=on dtparam=i2c1=on
این فایل را همانند فایل قبل ذخیره کنید و ازآن خارج شوید.
برای اعمال تغییرات انجام شده یک بار رزبری را راه اندازی مجدد کنید.
بعد از بار گذاری مجدد سیستم دستور زیرا برای اطلاع از فعال سازی I2C در ترمینال وارد کنید.
i2cdetect -y 1
درشکل زیر پایه های مربروط به دو واحد I2C رزبری پای با دو رنگ مختلف بروی GPIO ها مشخص شده اند.
همانطور که در شکل زیر مشاهده میکنید رزبری داری دو واحد I2C میباشد که یکی از آنها را رزو شده برای حافظه ی
EEPROM میباشد.
نویسنده: میثم سعیدی msimeysamsaeedi @ gmail.com
سلام من میخواهم در رزبری spi را فعال کنم. قسمت cofiguration آنرا فعال کردم ولی دستوراتی که در این سایت گفته شده اجرا نمیشود.
سلام:خیلی خوب بود.متشکرم