بخش هشتم مجموعه آموزش میکروپایتون با برد رزبری پای پیکو Pico با شناخت پروتکل SPI در پیکو، راه اندازی و روش فراخوانی آن ادامه میدهیم. پروتکل SPI در سنسورها، ماژولها و کالاهای مختلفی کاربرد دارد. پیش از این سنسورهای مختلفی را با این پروتکل راه اندازی کردهایم. در ادامه آموزش پروتکل SPI در پیکو با مرجع تخصصی رزبری پای به زبان فارسی، دیجی اسپارک همراه باشید.
پروتکل ارتباطی SPI
پروتکل ارتباطی SPI مخفف Serial Peripheral Interface در دهه ۱۹۸۰ میلادی معرفی شد! پروتکل ارتباطی SPI یک درگاه سریال ورودی و خروجی سنکرون (همزمان) با سرعت بالا است که اجازه میدهد داده ها به صورت سریال با طول قابل تنظیم (بین ۲ تا ۱۶ بیت) و همچنین سرعت انتقال قابل تنظیم به دستگاه وارد و خارج شود. در پروتکل SPI همانند پروتکل I2C، ارتباط بین دستگاه ها به صورت MASTER و SLAVE است. تفاوت عملکرد پروتکل ارتباطی در SPI این است که فقط یکی از دیوایس ها میتواند به عنوان MASTER با SLAVE ها ارتباط برقرار کند.
پروتکل ارتباطی SPI (Serial Peripheral Interface) یک پروتکل ارتباطی سریال برای ارتباط بین دستگاهها (devices) الکترونیکی است. این پروتکل اغلب برای اتصال میکروکنترلرها (Microcontrollers)، میکروپروسسورها (Microprocessors)، حافظهها (Memory devices)، حسگرها (Sensors)، تراشههای تخصصی و دستگاههای مختلف دیگر در سیستمهای الکترونیکی مورد استفاده قرار میگیرد. در پروتکل SPI، دو دستگاه به صورت تمامدو طرفه با یکدیگر ارتباط برقرار میکنند. یک دستگاه به عنوان “مستر” عمل میکند و دستورات و دادهها را ارسال میکند، و دستگاه دیگر به عنوان “اسلیو” پاسخ میدهد.
تعداد خطوط: پروتکل SPI شامل چهار خط اصلی میشود:
- MOSI (Master Out Slave In): این خط برای ارسال داده از master به slave استفاده میشود.
- MISO (Master In Slave Out): این خط برای ارسال داده از slave به master استفاده میشود.
- SCK (Serial Clock): این خط برای همگامسازی تبادل دادهها بین master و slave استفاده میشود.
- SS/CS (Slave Select/Chip Select): این خط برای انتخاب دستگاه slave مورد نظر برای ارتباط با master استفاده میشود. این خط معمولاً برای هر دستگاه slave موجود در شبکه SPI وجود دارد.
یک دستگاه مستر کنترل تبادل دادهها و تعیین زمانبندی آن را برعهده دارد. اسلیوها در انتظار دستورات و دادههایی هستند که از مستر دریافت میکنند. ارتباط SPI بر اساس سیگنال کلاک (SCK) صورت میگیرد و همگامسازی میان دستگاهها توسط کلاک انجام میشود.در SPI، دادهها بیت به بیت ارسال میشوند و میتوان در حالتهای مختلف (مثلاً ۸ بیت، ۱۶ بیت و غیره) ارسال و دریافت کرد.SPI از سرعت بالا، سادگی پیادهسازی، و انعطافپذیری بالا برخوردار است و به عنوان یکی از پروتکلهای ارتباطی محبوب در سیستمهای الکترونیکی و اختصاصی استفاده میشود. بسیاری از میکروکنترلرها و تراشههای الکترونیکی از پشتیبانی از SPI بهره میبرند.
پایه های مورد نیاز برای ارتباط SPI به صورت زیر است:
- SCLK: سیگنالی تحت عنوان کلاک باعث همزمانی انتقال داده بین Master و Slave میشود. به ازای هر کلاک یک بیت داده منتقل میشود. این سیگنال بر روی خط SCLK تولید میشود. پس سرعت انتقال داده در SPI به فرکانس سیگنال کلاک تولید شده بر روی این پایه بستگی دارد. سیگنال کلاک از سمت Master تولید میشود.
- MOSI: در پروتکل SPI برای نوشتن داده روی Slave و خواندن داده از آن دو خط مجزا تعریف شده است. کلمه MOSI مخفف Master Output Slave Input است. Master با استفاده از این خط داده مورد نظر را به Slave انتقال میدهد.
- MISO: کلمه MISO مخفف Master Input Slave Output است. این خط برای برای انتقال داده از سمت Slave یه سمت Master از خط MOSI استفاده میشود.
- SS/CS: در حالت عادی زمانی که تنها یک Slave موجود است این خط بایستی داراری سطح ولتاژ پایین باشد. اما زمانی که تعداد Slave ها از یک عدد بیشتر شود. این خط برای انتخاب Slave مورد نظر مورد استفاده قرار میگیرد. به تعداد Slave ها های موجود بایستی از هر کدام از Slave ها یک خط SS به Master متصل شود. برای انتخاب Slave مورد نظر بایستی سطح ولتاژ خط مربوط به Slave مورد نظر را پایین و سطح ولتاژ باقی خطوط SS بالا باشد.
ماژول SPI در رزبری پای پیکو به شما امکان ارتباط با دیوایس های SPI را فراهم میکند. پروتکل ارتباطی SPI از معماری MASTER و SLAVE بهره برده و برای ارتباط به سه سیگنال و همان ارتباط سه سیمه نیاز داریم.
- SCLK : Serial Clock (output from master)
- MOSI : Master Output, Slave Input (output from master)
- MISO : Master Input, Slave Output (output from slave)
پایه های پروتکل SPI در پیکو
در پین اوت بالا پایه هایی که با رنگ سبز و فلش سبز مشخص شده است، پایه های پروتکل SPI در پیکو هستند که مجاز به استفاده از آن ها هستیم.
میکروپایتون رزبری پای پیکو Software SPI bus
Software SPI بر روی تمامی پین ها کار میکند و از کلاس machine.SoftSPI در دسترس و قابل استفاده است. روش فراخوانی به صورت زیر است.
محدودیت در دسترسی کامل به این مجموعه آموزش
دسترسی کامل به آموزش برای اعضای دیجی اسپارک امکان پذیر است. بخش اصلی آموزش شامل سورس کدهای توسعه داده شده توسط مهندسهای دیجی اسپارک است. به همین دلیل این آموزش خاص و یکتاست. برای استفاده از آن بایستی عضویت تهیه کنید. تبادل نظر با کاربران و پرسش سوال رایگان است و میتوانید از بخش نظرات همین آموزش اقدام کنید. |
Hardware SPI bus میکروپایتون رزبری پای پیکو
تراشه RP2040 دارای دو باس سخت افزاری SPI است که از کلاس machine.SPI قابل دسترس است.
from machine import Pin, SPI spi = SPI(1, 10_000_000) # Default assignment: sck=Pin(10), mosi=Pin(11), miso=Pin(8) spi = SPI(1, 10_000_000, sck=Pin(14), mosi=Pin(15), miso=Pin(12)) spi = SPI(0, baudrate=80_000_000, polarity=0, phase=0, bits=8, sck=Pin(6), mosi=Pin(7), miso=Pin(4))
تست SPI با رزبری پای پیکو
برای تست پروتکل SPI در پیکو نیاز به یک سنسور با پشتیبانی از پروتکل SPI داریم. در این مثال از سنسور ADXL345 استفاده شده است که سنسور شتاب سنج سه محوره در محورهای x,y,z است. پایه های سنسور به صورت زیر است.
- GND
- VCC
- CS
- INT1
- INT2
- SDO
- SDA
- SCL
در آموزش راه اندازی پروتکل SPI در پیکو اتصال سنسور به رزبری پای پیکو به صورت زیر است:
کد میکروپایتون تست پروتکل SPI با رزبری پای پیکو و سنسور ADXL345 به صورت زیر است. از نرم افزار THONNY PYTHON برای تست استفاده کنید.
import machine import utime import ustruct import sys ############################################################################### # Constants # Registers REG_DEVID = 0x00 REG_POWER_CTL = 0x2D REG_DATAX0 = 0x32 # Other constants DEVID = 0xE5 SENSITIVITY_2G = 1.0 / 256 # (g/LSB) EARTH_GRAVITY = 9.80665 # Earth's gravity in [m/s^2] ############################################################################### # Settings # Assign chip select (CS) pin (and start it high) cs = machine.Pin(17, machine.Pin.OUT) # Initialize SPI spi = machine.SPI(0, baudrate=1000000, polarity=1, phase=1, bits=8, firstbit=machine.SPI.MSB, sck=machine.Pin(18), mosi=machine.Pin(19), miso=machine.Pin(16)) ############################################################################### # Functions def reg_write(spi, cs, reg, data): """ Write 1 byte to the specified register. """ # Construct message (set ~W bit low, MB bit low) msg = bytearray() msg.append(0x00 | reg) msg.append(data) # Send out SPI message cs.value(0) spi.write(msg) cs.value(1) def reg_read(spi, cs, reg, nbytes=1): """ Read byte(s) from specified register. If nbytes > 1, read from consecutive registers. """ # Determine if multiple byte (MB) bit should be set if nbytes < 1: return bytearray() elif nbytes == 1: mb = 0 else: mb = 1 # Construct message (set ~W bit high) msg = bytearray() msg.append(0x80 | (mb << 6) | reg) # Send out SPI message and read cs.value(0) spi.write(msg) data = spi.read(nbytes) cs.value(1) return data ############################################################################### # Main # Start CS pin high cs.value(1) # Workaround: perform throw-away read to make SCK idle high reg_read(spi, cs, REG_DEVID) # Read device ID to make sure that we can communicate with the ADXL343 data = reg_read(spi, cs, REG_DEVID) if (data != bytearray((DEVID,))): print("ERROR: Could not communicate with ADXL343") sys.exit() # Read Power Control register data = reg_read(spi, cs, REG_POWER_CTL) print(data) # Tell ADXL343 to start taking measurements by setting Measure bit to high data = int.from_bytes(data, "big") | (1 << 3) reg_write(spi, cs, REG_POWER_CTL, data) # Test: read Power Control register back to make sure Measure bit was set data = reg_read(spi, cs, REG_POWER_CTL) print(data) # Wait before taking measurements utime.sleep(2.0) # Run forever while True: # Read X, Y, and Z values from registers (16 bits each) data = reg_read(spi, cs, REG_DATAX0, 6) # Convert 2 bytes (little-endian) into 16-bit integer (signed) acc_x = ustruct.unpack_from("<h", data, 0)[0] acc_y = ustruct.unpack_from("<h", data, 2)[0] acc_z = ustruct.unpack_from("<h", data, 4)[0] # Convert measurements to [m/s^2] acc_x = acc_x * SENSITIVITY_2G * EARTH_GRAVITY acc_y = acc_y * SENSITIVITY_2G * EARTH_GRAVITY acc_z = acc_z * SENSITIVITY_2G * EARTH_GRAVITY # Print results print("X:", "{:.2f}".format(acc_x), \ "| Y:", "{:.2f}".format(acc_y), \ "| Z:", "{:.2f}".format(acc_z)) utime.sleep(0.1)
برنامه را RUN کنید.
وسایل مورد نیاز
رزبری پای پیکو RASPBERRY PI PICO
جمع بندی لیدی پای
انتخاب های محدودی برای تست پروتکل SPI داریم. سنسورهایی که از این پروتکل SPI برای ارسال و دریافت دیتا استفاده میکنند مانند سنسورهای قطب نما، شتاب سنج از سری قطعات دیگر کاربردی تر هستند که در این آموزش فقط یک مثال برای نحوه ی تست و اجرا نوشته شده است. میکروپایتون از پروتکل ارتباطی SPI به صورت نرم افزاری و سخت افزاری استفاده میکند که در این آموزش تمامی کلاس ها آموزش داده شده است. در صورت نیاز به اجرای پروژه هایی با رزبری پای پیکو و استفاده از SPI میبایست از این دستورات و توابع و کلاس ها استفاده کنید.
چنانچه در مراحل راه اندازی برد رزبری پای پیکو Picro و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
با سلام
آیا امکان اتصال ماژول کارت خوان rfid به پیکو امکان پذیر است؟
با سلام
کاربر گرامی بله با توجه به همین آموزش میتوانید از کلاس spi برای راه اندازی Rfid بهره ببرید.
سلام و خسته نباشید
میتوان همزمان یک نمایشگر با رابط spi به پیکو وصل کرد؟
با سلام
سوال شما بسیار کلی است اما اگر کتابخانه ای چه در آردوینو و چه برای میکروپایتون توسعه داده شده باشد،بایستی بررسی و تست کنید.
کار با میکروپایتون جدید و سخته اما دیجی اسپارک همیشه به روز بوده
ممنونم و امیدوارم ادامه داشته باشه
با سلام
کاربر گرامی سپاس از همراهی شما
امیدوارم آموزش ها مفید واقع شده باشد.
با سلام
لطفا آموزش rfid با pico را منتشر کنید
با سلام
کاربر گرامی
سپاس از همراهی شما بررسی و در صورت امکان آموزش داده خواهد شد.
سلام
ممنونم از شما برای نوشتن این آموزش
با سلام
سپاس از همراهی شما کاربر گرامی
انتظار داشتم به جای اینکه صرفا داکیومنت میکروپایتون رو ترجمه میکنید، مسائلی مثل بافر ها هم اشاره کنید. به طور مثال من اصلا متوجه نمیشم اینها چی هستن که توی کد نوشته شدن!
# Constants
# Registers
REG_DEVID = 0x00
REG_POWER_CTL = 0x2D
REG_DATAX0 = 0x32
# Other constants
DEVID = 0xE5
با سلام
کاربر گرامی مباحث تخصصی برنامه نویسی میکروپایتون ترجمه ای نیست. کلاس SPI در RP2040 ثابت است و فقط بایستی روش استفاده از آن را یاد بگیرید. این مورد نیاز به تمرین و اجرای پروژه دارد.
در متن کدها مشخص شده است که هر رجیستری برای چه بخشی تعریف شده است.