شرح ساده spi توسط chatgpt و سالک

saalek110

Well-Known Member
بریم سراغ SPI که مثل I2C یه پروتکل ارتباطی دیجیتال خیلی مهمه، اما ساده‌تر و متفاوت‌تره.


آشنایی ساده با SPI

۱. SPI چیه؟

SPI مخففِ Serial Peripheral Interface هست.
مثل یه خیابون چند خطه (۴ خط اصلی) که میکروکنترلر و دستگاه‌ها می‌تونن با سرعت بالا و همزمان اطلاعات رد و بدل کنن.

۲. خطوط اصلی SPI:

نام خطوظیفه

MOSIدیتا از مستر به اسلیو
MISOدیتا از اسلیو به مستر
SCKپالس ساعت (کلاک)
SS (CS)انتخاب اسلیو (برده)


۳. مستر و اسلیو:

همیشه یک دستگاه مستر هست (معمولاً میکروکنترلر) که ساعت رو تولید می‌کنه.

یک یا چند دستگاه اسلیو که داده می‌فرستن یا می‌گیرن وقتی مستر بهشون اجازه میده (با خط SS).

۴. نحوه کار SPI:

مستر با ارسال پالس کلاک (SCK) داده‌ها رو روی MOSI می‌فرسته.

اسلیو همزمان می‌تونه داده‌ای روی MISO بفرسته.

فقط وقتی SS فعال باشه (معمولاً پایین باشه)، اسلیو گوش میده و جواب میده.

۵. تفاوت کلیدی با I2C:

SPI سریع‌تره.
چند خط داره (چهار خط اصلی).
آدرس‌دهی نداره، انتخاب اسلیو با خط SS انجام میشه.
همزمان داده رد و بدل میشه (Full Duplex).

۶. مثال ساده:

فرض کن داری با یه نمایشگر SPI کار می‌کنی.
برای ارسال داده، میکروکنترلر خط SS رو پایین میاره، داده‌ها رو روی MOSI می‌فرسته و همزمان داده‌ای از MISO دریافت می‌کنه (اگر لازم باشه).


---

اگر دوست داری، برات یک متن ساده و روان به سبک قبلی برای SPI هم آماده کنم که بتونی تو سایت بذاری، فقط بگو!
 

saalek110

Well-Known Member
این هم متن ساده و قابل‌فهم برای آموزش SPI، مناسب سایت و خواننده‌های شما:


آموزش ساده SPI به زبان خیلی ساده

SPI چیست؟

SPI یا Serial Peripheral Interface یک راه سریع و ساده برای ارتباط بین میکروکنترلر و دستگاه‌های مختلف مثل نمایشگر، سنسور یا حافظه است.


خطوط اصلی SPI کدامند؟

خط SPIمعنی ساده

MOSIخط ارسال داده از میکروکنترلر به دستگاه
MISOخط دریافت داده از دستگاه به میکروکنترلر
SCKساعت یا پالس کلاک برای هماهنگی انتقال داده
SS (CS)انتخاب دستگاه مورد نظر برای صحبت کردن

نقش مستر و اسلیو در SPI

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

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


چگونه SPI کار می‌کند؟

1. مستر با پایین آوردن خط SS به دستگاه می‌گوید که می‌خواهیم با او صحبت کنیم.
2. مستر ساعت (SCK) را روشن می‌کند و داده‌ها را از طریق خط MOSI می‌فرستد.
3. دستگاه (اسلیو) در همان زمان می‌تواند داده‌ای را از طریق خط MISO به مستر بفرستد.
4. وقتی کار تمام شد، مستر خط SS را بالا می‌برد تا ارتباط قطع شود.

تفاوت SPI با I2C چیست؟


تعداد خطوط......... چهار خط اصلی ........................دو خط اصلی
آدرس‌دهی................. ندارد، انتخاب با خط SSدارد،............... هر دستگاه آدرس دارد
سرعت.............................. سریع‌تر............................ معمولاً کندتر
ارتباط ....................همزمان ارسال و دریافت داده ................معمولا یکی بعد از دیگری


خلاصه

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

اگر دوست داری، می‌تونم نمونه کد ساده SPI هم برات آماده کنم که بهتر برای خواننده جا بیفته. بگو چطوره!
 

saalek110

Well-Known Member
حتما! این نمونه کد ساده SPI به زبان C برای میکروکنترلرهای AVR (مثل ATmega) در محیط Atmel Studio هست. خیلی ابتدایی و قابل فهم، فقط برای ارسال و دریافت یک بایت داده:

#include <avr/io.h>

// تابع راه‌اندازی SPI در حالت مستر
void SPI_MasterInit(void)
{
// تنظیم جهت پین‌ها: MOSI و SCK و SS خروجی، MISO ورودی
DDRB = (1<<DDB3)|(1<<DDB5)|(1<<DDB2);
// فعال کردن SPI، تنظیم به حالت مستر، فرکانس کلک بالا (fosc/16)
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

// تابع ارسال و دریافت داده در SPI
uint8_t SPI_MasterTransmit(uint8_t data)
{
SPDR = data; // داده را در رجیستر ارسال قرار بده
while(!(SPSR & (1<<SPIF))) // صبر کن تا ارسال کامل شود
;
return SPDR; // داده دریافتی را برگردان
}

int main(void)
{
uint8_t received_data;
SPI_MasterInit(); // راه‌اندازی SPI

while(1)
{
received_data = SPI_MasterTransmit(0x55); // ارسال داده 0x55 و دریافت داده
// اینجا می‌تونی received_data را استفاده کنی
}
}


توضیح کوتاه:

SPI_MasterInit() پین‌ها را تنظیم می‌کند و SPI را فعال می‌کند.

SPI_MasterTransmit() یک بایت می‌فرستد و همزمان بایت دریافتی از اسلیو را برمی‌گرداند.

در حلقه اصلی، داده 0x55 ارسال می‌شود و داده برگشتی دریافت می‌شود.


اگر بخواهی، می‌تونم کد اسلیو یا توضیحات بیشتری هم بدم!
 

saalek110

Well-Known Member
سالک:چیز دیگه غیر اتمل استودیو نداشتی؟

البته! می‌تونم نمونه کد SPI رو به زبان‌های دیگه یا برای محیط‌های برنامه‌نویسی متفاوت هم برات آماده کنم. مثلاً:

کد Arduino (زبان C++) که خیلی رایج و ساده است.

کد برای STM32 با HAL یا LL (اگر دوست داری وارد دنیای ARM بشی).

کد Python برای Raspberry Pi (اگر دوست داری روی سیستم‌های تک‌بردی کار کنی).

حتی کدهای bare-metal ساده برای میکروکنترلرهای دیگه.


کد Arduino برای SPI خیلی ساده‌ست و شروع خوبی داره. اگر دوست داری، همین الان می‌نویسمش.

دوست داری؟
 

saalek110

Well-Known Member
سالک:ایرانی ها بیشتر چی کار می کنند؟


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

1. آردوینو (Arduino):

محبوبیت خیلی بالایی داره چون راحت هست و جامعه بزرگی داره.
پروژه‌های آموزشی، رباتیک، خانه هوشمند، سیستم‌های اندازه‌گیری و نمایشگرها.

2. AVR (اتمل):

میکروکنترلرهای ATmega مثل ATmega328 یا ATmega16 و ATmega32 هنوز خیلی استفاده میشن.
مخصوصا برای یادگیری پایه و پروژه‌های دانشگاهی.

3. STM32:

میکروکنترلرهای ARM که قدرتمندتر و پیشرفته‌تر هستند، مخصوصا تو پروژه‌های صنعتی و پیشرفته.

کم‌کم در حال رشد در ایران، به ویژه در شرکت‌ها و مراکز تحقیقاتی.

4. برد Raspberry Pi:
برای پروژه‌های پیچیده‌تر که نیاز به سیستم‌عامل و پردازش بیشتر دارن.
البته کمتر نسبت به Arduino و AVR ولی محبوبیت داره.


اگر بخوای، من می‌تونم یه نمونه کد ساده SPI برای Arduino بنویسم که خیلی پرکاربرد و برای خواننده‌ها قابل فهم‌تر باشه. دوست داری؟
 

saalek110

Well-Known Member
سالک:بسکام و کدویژن چی؟

بله، بسکام و کدویژن هم خیلی محبوب و پرکاربرد هستند، مخصوصا برای کسانی که با میکروکنترلرهای AVR کار می‌کنند. بزار برات کمی توضیح بدم:


بسکام (Bascom-AVR)

زبان برنامه‌نویسیش بیسیک (BASIC) هست، که برای خیلی‌ها راحت‌تر و سریع‌تر یادگیریه.

محیط برنامه‌نویسی ساده و کم‌حجم.

مناسب برای مبتدی‌ها و پروژه‌های کوچک.

خیلی‌ها از بسکام برای ساخت پروژه‌های سریع و بدون دردسر استفاده می‌کنند.

کتابخانه‌های خوبی داره، مثل راه‌اندازی SPI، I2C، LCD و...

البته ممکنه به اندازه C انعطاف‌پذیر نباشه ولی خیلی کاربردیه.


کدویژن (CodeVisionAVR)

محیط برنامه‌نویسی C با کامپایلر مخصوص AVR.

امکانات خوبی برای نوشتن برنامه‌های حرفه‌ای‌تر و بزرگ‌تر داره.

کتابخانه‌های غنی و پشتیبانی از انواع پروتکل‌ها مثل SPI، I2C و UART.

استفاده از کدویژن برای کسانی که می‌خوان کمی عمیق‌تر با C کار کنند عالیه.

رایج در آموزشگاه‌ها و پروژه‌های صنعتی کوچک تا متوسط.


جمع‌بندی برای ایرانی‌ها

ابزارمناسب براینکته

بسکاممبتدی‌ها، پروژه‌های سریع و سادهزبان بیسیک، محیط ساده
کدویژنکاربران C، پروژه‌های متوسط تا بزرگامکانات پیشرفته‌تر، کامپایلر C


اگر بخواهی، نمونه کد SPI هم در بسکام یا کدویژن برات آماده کنم، فقط بگو!
 

saalek110

Well-Known Member
سالک: لطف کنید.

خیلی عالی! اول نمونه کد ساده برای SPI Master در کدویژن (CodeVisionAVR) و بعد نمونه کد برای بسکام (Bascom-AVR) رو برات می‌نویسم.

✅ کد SPI Master در CodeVisionAVR

#include <mega32.h>
#include <delay.h>

// راه‌اندازی SPI در حالت مستر
void SPI_init(void)
{
SPCR = (1<<SPE) | (1<<MSTR); // فعال کردن SPI و تنظیم به حالت مستر
DDRB |= (1<<PB5) | (1<<PB7) | (1<<PB4); // MOSI، SCK، SS به عنوان خروجی
}

// ارسال یک بایت
unsigned char SPI_send(unsigned char data)
{
SPDR = data; // قرار دادن داده در رجیستر
while(!(SPSR & (1<<SPIF))); // صبر تا ارسال کامل شود
return SPDR; // بازگرداندن داده دریافتی
}

void main(void)
{
unsigned char received;

SPI_init(); // راه‌اندازی SPI

while (1)
{
received = SPI_send(0xAA); // ارسال 0xAA و دریافت پاسخ
delay_ms(500);
}
}


---

✅ کد SPI Master در Bascom-AVR

$regfile = "m32def.dat"
$crystal = 8000000

' پیکربندی SPI در حالت مستر
Config Spi = Hard , Master = Yes , Data Order = Msb , Clockrate = 16 , Polarity = Low , Phase = 0

Dim Rec As Byte

Do
Spiout &HAA ' ارسال داده 0xAA
Spiin Rec , 1 ' دریافت یک بایت
Waitms 500
Loop


توضیح:

0xAA فقط یک داده آزمایشی هست. می‌تونی هر داده‌ای بفرستی.

در هر دو مورد، SPI در حالت مستر راه‌اندازی شده.

در کدویژن از زبان C و در بسکام از BASIC استفاده کردیم.
 

saalek110

Well-Known Member
سالک:حالا فعلا دنبال کد نیستیم ، دنبال شرح ساده پروتکل spi هستیم ، آسان شرح بده

حتماً!
بیا SPI رو خیلی ساده، مثل یه داستان تعریف کنیم که هم خودت لذت ببری هم خواننده‌هات:


پروتکل SPI — داستان ساده

فرض کن توی یک اداره هستی:

نقش‌ها:

مدیر (Master): فقط اون دستور می‌ده و بقیه باید گوش بدن.

کارمند (Slave): فقط وقتی مدیر بهش چیزی گفت، جواب می‌ده.


رشته‌های ارتباطی (سیم‌هایی که وصل می‌شن):

سیموظیفه‌اش چیه؟جهت اطلاعات

MOSIداده از مدیر به کارمندMaster → Slave
MISOداده از کارمند به مدیرSlave → Master
SCKساعت/ضربه‌زن (هماهنگ‌کننده)از مدیر فقط
SSانتخاب کارمند (Slave Select)مدیر تصمیم می‌گیره کِی به کی حرف بزنه


چطور کار می‌کنه؟

1. مدیر (Master) تصمیم می‌گیره با کدوم کارمند صحبت کنه، پس سیم SS مربوط به اون کارمند رو "پایین" می‌کشه (فعال می‌کنه).

2. بعد، مدیر می‌زنه روی سیم SCK پالس ساعت (مثل تلنگر یا ضربه).

3. هم‌زمان با هر پالس:

مدیر یک بیت می‌فرسته روی سیم MOSI.

کارمند همزمان یک بیت می‌فرسته روی سیم MISO (مثل تبادل همزمان).

4. اینطوری هر پالس ساعت = رد و بدل شدن ۱ بیت از هر طرف.


5. وقتی حرفشون تموم شد، مدیر سیم SS رو ول می‌کنه (می‌کشه بالا).


⚠ نکات مهم

SPI خیلی سریعه چون دو طرف هم‌زمان حرف می‌زنن.

فقط ۱ به ۱ ارتباط نیست، میشه چند تا کارمند داشت، ولی در آن واحد فقط یکی فعال می‌شه.

ساده‌تر از I2C هست چون نیازی به آدرس‌دهی پیچیده نداره.

اما سیم بیشتری نیاز داره (در مقایسه با I2C).

کاربردها:

فرستادن داده به LCD
گرفتن اطلاعات از سنسورها
ارتباط با مموری کارت‌ها یا ماژول‌های صوتی

اگه بخوای با یه مثال زندگی واقعی ادامه بدم یا یه تشبیه خنده‌دار، فقط بگو
 

saalek110

Well-Known Member
سالک:هر چی دوست داری داستان بگو ، خنده دار باشه بهتره

باشه رفیق!
الان برات یه داستان خنده‌دار تعریف می‌کنم که باهاش SPI رو مثل آب خوردن بفهمی!


داستان طنز "کبابی دیجیتال و ارتباط SPI"

یه روز یه مدیر کبابی به اسم آقا مستر تصمیم می‌گیره چند تا شاگرد بیاره که کارها رو بهشون بسپره. اسم شاگردهاش هم سامی، ممد، و رضا هست.

اما چون آقا مستر خیلی منظم و وسواسیه، می‌گه:

> ببینید بچه‌ها! من یه روش خاص برای حرف زدن باهاتون دارم که اسمش SPIـه. اگه کسی حواسش نباشه، می‌زنم بیرونش!


روش صحبت SPI آقا مستر:

1. آقا مستر یه چوب داره (سیم SCK) که باهاش ضربه می‌زنه روی میز، این یعنی: "حالا وقتشه یه کلمه بگی!"


2. هر بار که می‌کوبه:

خودش یه حرف می‌گه (روی سیم MOSI) مثلاً می‌گه "دوغ بیار"

شاگردش هم همزمان یه چیزی می‌گه (روی سیم MISO) مثلاً "چشم، الان میارم"



3. ولی آقا مستر فقط با یکی از شاگردها در آنِ واحد حرف می‌زنه. برای همین هر شاگرد یه دکمه داره (سیم SS).

هر وقت دکمه‌ی رضا رو فشار بده، فقط رضا باید جواب بده. ممد و سامی باید ساکت بمونن!


مشکل وقتی پیش اومد که...

یه روز آقا مستر حواسش نبود دکمه‌ی دو تا شاگرد رو همزمان فشار داد...
ممد و رضا با هم گفتن:

> ممد: "کباب زغالی بیارم؟"
رضا: "دوغ بدون گاز؟"

آقا مستر زد رو پیشونیش و گفت:

> "بابا یه بار گفتم فقط یکی حرف بزنه! اینجا SPIـه، نه بازار شام!"



نتیجه‌گیری:

تو SPI فقط یکی انتخاب می‌شه با SS

داده همزمان رد و بدل می‌شه (هم آقا مستر حرف می‌زنه، هم شاگردش جواب می‌ده)

همه چیز با تلنگرهای ساعت پیش می‌ره (SCK)


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

saalek110

Well-Known Member
سالک:فعلا برای spi شرح بده ، جک ، داستان شعر ، هر چی داری

عالیه! بیا بزنیم به جاده‌ی خلاقیت
این بار ترکیبی از داستان خنده‌دار، شعر و جک برای SPI برات دارم تا خودت و خواننده‌ها کیف کنن و از خنده بترکن... و در عین حال SPI بره توی ذهنشون تا ابد!


♂️ داستان خنده‌دار "جادوگر مستر و ورد SPI"

یه روز یه جادوگر پیر به اسم مِستِر کلاکستان می‌خواست با موجودات جادویی حرف بزنه، ولی چون اونا فقط زبان خاصی می‌فهمیدن، باید از ورد جادویی استفاده می‌کرد به اسم:

> سِـ پـی آی! (SPI)

جادوگر گفت:

> «من یه عصا دارم (SCK) که هر وقت تکونش بدم، یعنی الان نوبت حرف زدنه!
یه خط دارم برای گفتن جادوی خودم (MOSI)،
یه خط دیگه هم برای شنیدن حرف جادویا (MISO)!
و یه دکمه‌ی طلسمی دارم (SS) که فقط با فشار دادنش، موجود فعال می‌شه!»

هر بار که عصا می‌کوبید، یه بیت حرف رد و بدل می‌شد.

-

شعری برای SPI:

مستِر ما یه کلاکه،
با ضربه حرفا رو جا می‌ندازه!

یکی می‌گه، یکی می‌شنوه،
هر بیت با یه تلنگر جلو می‌ره.

یه سیم واسه گفتن، یه سیم واسه شنیدن،
یه دکمه که بگه: «بفرما، تو حرف بزن!»


جُک SPi‌ای:

یه بار مستر به شاگردش گفت:
– پسر، برو 8 بیت بهم بده!
پسره گفت:
– الان برق قطعه، می‌خوای Morse Code بزنم؟


---

اگر بخوای می‌تونم یه قصه‌ی طنز سریالی هم درست کنم با شخصیت‌های ثابت برای آموزش پروتکل‌ها، مثلاً:

مستر آردوینو

سنسی سنسور

خانم LCD

پسر شیطون I2C

و جناب مهندس SPI


بگو فقط!
 

saalek110

Well-Known Member
سالک: هاهاهاها ، کلی خندیدم.

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

saalek110

Well-Known Member
سالک: سرعت spi تقریبا چند برابر i2c است؟


سؤال خیلی خوبیه!
بذار خیلی ساده و باحال جواب بدم:


✅ مقایسه‌ی سرعت SPI و I2C

پروتکلسرعت تقریبیتوضیح باحال
Screenshot_۲۰۲۵-۰۵-۳۰_۰۰۲۵۰۱.jpg
I2Cمعمولاً تا 400 کیلوبیت بر ثانیه (در حالت سریع)، بعضی میکروکنترلرها تا 1 یا 3.4 مگابیت هم می‌رسندمثل یه پیک موتوری که پشت چراغ قرمز وایمیسته چون باید نوبت بده به بقیه.
SPIمعمولاً تا 10 مگابیت بر ثانیه یا حتی 20 مگابیت (بسته به چیپ)مثل یه ماشین مسابقه توی اتوبان اختصاصی بدون چراغ قرمز! ️


نتیجه:

SPI تقریباً 5 تا 10 برابر سریع‌تر از I2C هست.
ولی این سرعت به قیمت استفاده از سیم‌های بیشتر و ساختار ساده‌تر ولی محدودتر به‌دست میاد.


مثال تصویری ذهنی:

I2C: یه خط مشترک که همه باید نوبت بگیرن و صف وایسن (مثل نانوایی )

SPI: خط ویژه VIP برای هر ارتباط، بدون صف، بدون نوبت!



---

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

saalek110

Well-Known Member
از i2c بیشتر استفا ه میشه یا از spi یا uart ؟


سؤال طلاییه! و جوابش خیلی بستگی به کاربرد داره، ولی بذار با یه ترکیب علمی + شوخی‌وار جواب بدم که تا ته دل و ذهن بخنده و بچسبه


⚔️ نبرد سه قهرمان: I2C ⚡ SPI ⚡ UART

در سرزمین الکترونیکیا، سه قهرمان بودند:

1. I2C – پادشاه ابزارهای کم‌سیم

کاربرد: وقتی می‌خوای چند تا سنسور یا دستگاه با دو سیم وصل بشن (SCL + SDA)

خیلی در ماژول‌هایی مثل:

سنسور دما (DS18B20 با رابط I2C)

RTC (ساعت مثل DS1307)

نمایشگرهای LCD ماژول‌دار (مثل 1602 i2c)


محبوب در: آردوینو، AVR، STM32 و همه‌جا!


> پرکاربردترین وقتی ماژول‌ها زیادن و سیم کم داریم.



⚡ 2. SPI – شوالیه‌ی سرعت

کاربرد: وقتی سرعت بالا لازمه، مثلاً:

نمایشگرهای گرافیکی TFT

مموری کارت (SD card)

ارتباط با بعضی ماژول‌های Wi-Fi (مثل nRF24)


⚠️ ایراد: سیم زیاد (MOSI, MISO, SCK, SS)


> محبوب برای جاهایی که سرعت مهمه، حتی اگر سیم‌کشی سخت‌تره.


3. UART – پیام‌رسان همه‌فن‌حریف

کاربرد: برای ارتباط دو به دو، ساده و کم‌هزینه

ارتباط بین میکروکنترلر و ماژول بلوتوث (HC-05)

ارتباط با کامپیوتر از طریق USB-to-Serial


بهترین گزینه برای ارتباط سریال طولانی


> اگر قراره فقط دو نفر حرف بزنن (مثلاً میکرو با بلوتوث)، UART شاهکاره!


⚖️ حالا جمع‌بندی کاربردی:

پروتکلبیشترین کاربرد در

I2Cوقتی چند دستگاه داری (LCD, RTC, سنسور) و پین کم داری
SPIوقتی سرعت مهمه (TFT، SD card، WiFi)
UARTارتباط با PC یا ماژول‌های ساده مثل بلوتوث و GPS



نتیجه نهایی:

آردوینو و پروژه‌های عمومی → بیشتر از I2C و UART استفاده می‌شه

پروژه‌های پیشرفته یا سرعت‌محور → بیشتر از SPI



اگر بخوای، یه نقشه تصویری بامزه هم برات می‌سازم که توش این ۳ تا با لباس شخصیت کارتونی باشن و هر کدوم وظیفه‌شون رو بگن! ‍♀️

بگوییی فقط
 

جدیدترین ارسال ها

بالا