پروژه الکترونیکپروژه های آردوینو

ارتباط سریال SPI بین میکروکنترلر نوتوون nuvoton و آردوینو

SPI یک پروتکل ارتباطی مهم است که به طور گسترده برای برقراری ارتباط بین میکروکنترلرها ، کارت های SD و حسگر های مختلف استفاده می شود. SPI مخفف Serial Peripheral Interface است ، این یک پروتکل انتقال داده همگام است که در آن دستگاه اصلی می تواند با چندین دستگاه برده ارتباط برقرار کند و همچنین داده ها را از آنها دریافت کند. SPI یک پروتکل انتقال داده همگام است زیرا master یک ساعت را در یک خط ورودی و خروجی جداگانه تولید می کند که تضمین می کند هر دو دستگاه ، master و slave با همان سرعت ساعت کار می کنند. پیشنهاد میکنم قبل از این مطلب، مقاله انواع ارتباط سریال را بخوانید.

فعال کردن عملکرد SPI در N76E003

هدف این پروژه یادگیری ارتباطات SPI با استفاده از N76E003 است و بهترین راه این است که یک مثال SPI تنظیم کنید که در آن پیامی را بین دو واحد میکروکنترلر منتقل کنیم ، برای این کار از Arduino به عنوان دستگاه برده استفاده خواهیم کرد که متصل به N76E003 SPI است. ما داده ها را به Arduino ارسال می کنیم ، اعتبار سنجی می کنیم و با استفاده از Arduinos UART چاپ می کنیم. سپس، ما یک داده را از Arduino به N76E003 می فرستیم ، اعتبار سنجی می کنیم و با استفاده از N76E003 UART چاپ می کنیم ، به همین دلیل یک مبدل USB به UART برای N76E003 و یک Arduino برای برنامه کاربردی ما ضروری است ، ما از مبدل CP2102 UART به USB و یک آردوینو نانو برای برآورده کردن نیازهایمان استفاده خواهیم کرد.

ناگفته نماند ، به غیر از موارد فوق ، برای برنامه نویسی به N76E003 مبتنی بر میکروکنترلر و همچنین Nu-Link Programmer نیاز داریم.

شماتیک اتصال N76E003 به آردوینو از طریق SPI

همانطور که در شماتیک می بینیم ، برد آردوینو نانو با SPI N76E003 متصل است. در سمت چپ ، اتصال رابط برنامه نویسی نشان داده شده است.

اتصال N76E003 به آردوینو از طریق SPI

پین های SPI در میکروکنترلر Nuvoton N76E003

شماتیک پین های N76E003 را می توانید در تصویر زیر مشاهده کنید:

پین های SPI در میکروکنترلر Nuvoton N76E003

همانطور که در شماتیک پین فوق مشاهده می کنیم ، هر پین دارای مشخصات عملکردی چندگانه است و بسته به نوع کاربرد ، هر کدام می توانند برنامه ریزی شوند. با این حال ، پایه های 0.1 ، 0.0 ، 1.0 و 1.5 به ترتیب به عنوان پایه های MISO ، MOSI ، SPCLK و SS استفاده می شوند. اگر SPI را فعال کنیم ، PWM و سایر قابلیت های آن از بین می رود. اما ، این مشکلی نیست زیرا عملکرد دیگری برای این پروژه لازم نیست. این تراشه تمام پین های SPI را به عنوان GPIO در نظر می گیرد ، به همین دلیل آن ها باید پیکربندی شوند. روش پیکربندی در زیر توضیح داده شده است.

پیکربندی پین های میکروکنترلر نوتوون برای SPI

طبق دیتاشیت ، PxM1.n و PxM2.n دو رجیستری هستند که برای تعیین عملکرد پورت I / O استفاده می شوند. در دیتاشیت N76E003 بیان شده است که برای استفاده از قابلیت SPI ، از حالت Quasi استفاده شود.

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

اطلاعات SPI میکروکنترلر N76E003

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

دانستن چند نکته در مورد ارتباط SPI در N7E003 مهم است.

پین SS در N76E003

این یک پین مهم در ارتباطات SPI است. پین Slave Select در حالت چند برده (Slave)، برده مورد نظر را انتخاب خواهد کرد.

تصویر زیر اتصالات چندگانه برده ها را نشان می دهد:

همچنین اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید

اطلاعات SPI میکروکنترلر N76E003

انتخاب بیت MSB First یا LSB First در N76E003

N76E003 از دو نوع ارتباط داده پشتیبانی می کند، MSB و LSB. به طور پیش فرض ، MSB انتخاب می شود. با این حال ، اولین داده های LSB نیز می توانند در N76E003 انتخاب شوند.

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

اتصال ساده SPI با یک ارباب و یک برده

رجیستر کنترل محیطی SPI (SPCR) N76E003

رجیستر کنترل SPI از SPCR برای کنترل عملیات SPI استفاده می کند.

رجیستر کنترل محیطی SPI (SPCR) N76E003

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

رجیستر پیکربندی سرعت SPI میکروکنترلر نووتون

بیت CPHA بیت انتخاب فاز ساعت است. اگر پرچم CPHA تنظیم شده باشد ، داده ها در لبه دوم ساعت SPI نمونه برداری می شوند. اگر پاک شود ، از داده ها در لبه اول نمونه برداری می شود. بیت بعدی CPOLI است که سطح حالت بیکار (idle) ساعت SPI است. اگر روی 0 تنظیم شود ، ساعت در حالت بیکار LOWخواهد بود ، اگر روی 1 تنظیم شود ، در حالت بیکار HIGH خواهد بود. MSTR بیت فعال حالت Master است ، که برای پیکربندی N76E003 به عنوان یک حالت اصلی استفاده می شود ، پاک کردن این بیت آن را به حالت برده تبدیل می کند. LSBFE برای جهت انتقال داده استفاده می شود. با پاک کردن این بیت ، ابتدا انتقال داده به عنوان MSB انجام می شود ، در حالی که با تنظیم 1 ، جهت اول LSB فعال می شود. SPIEN برای فعال کردن SPI استفاده می شود. با تنظیم 1 ، SPI محیطی فعال خواهد شد. SSOE بیت فعال کردن خروجی انتخاب برده SPI است و برای پیکربندی پین SS به صورت عمومی یا در حالت خودکار استفاده می شود.

غیر از موارد فوق ، رجیستر های دیگری وجود دارد به نام Serial Peripheral Status Register.

انواع رجیستر های ارتباط SPI در میکروکنترلر نووتون

رجیستر فوق برای بدست آوردن وضعیت های مختلف SPI استفاده می شود.

برنامه نویسی SPI در میکروکنترلر N76E003 (ارباب)

کد کامل پروژه در انتهای صفحه در فایل دانلودی قرار داده شده است. در اینجا بعضی از قسمت های کد را بررسی میکنیم.

عملکرد اصلی SPI و UART را شروع می کند ، همچنین Start_Sending_SPI () را فراخوانی می کند.

void main(void){                
                Set_All_GPIO_Quasi_Mode;
                InitialUART0_Timer1(115200); /* 115200 تنظیم سرعت*/
                SPI_Initial();
                printf ("\nSPI Start Transmit...\n");
                while(1)  // پایان ارسال اطلاعات
                {
                Start_Sending_SPI();
                }
}

بیایید نگاهی به SPI_Initial () بیندازیم.

void SPI_Initial(void){                
                 P15_Quasi_Mode;    // P15 (SS) Quasi mode
                 P10_Quasi_Mode;   // P10(SPCLK) Quasi mode
                 P00_Quasi_Mode;  // P00 (MOSI) Quasi mode
                P01_Quasi_Mode;  // P22 (MISO) Quasi mode
                set_DISMODF;    // SS General purpose I/O ( No Mode Fault )
                clr_SSOE;
                clr_LSBFE;   // MSB first             
                clr_CPOL;   // The SPI clock is low in idle mode
                set_CPHA;  // The data is

نمونه در لبه دوم ساعت SPI :

                set_MSTR;  // SPI in
Master mode               
                SPICLK_DIV2;   // Select SPI clock
                Enable_SPI_Interrupt;   // Enable SPI interrupt
                set_SPIEN;   // Enable SPI function
}

همانطور که قبلاً توضیح داده شد ، پین های پورت SPI باید پیکربندی و به عنوان Quasi تنظیم شوند ، چهار خط اول داخل تابع SPI_Initial () دقیقاً این کار را انجام می دهد ، پیکربندی SPI به عنوان پین SS با کاربرد عمومی انتخاب می شود ، داده ها ابتدا به عنوان MSB منتقل می شوند ، ساعت SPI در حالت بیکار با نمونه برداری از داده های لبه دوم LOW است. از آنجا که N76E003 به عنوان حالت Master عمل خواهد کرد ، به عنوان Master تنظیم می شود. وقفه SPI با SPI بیتی فعال شده SPIEN تنظیم می شود. همه این توابع در پرونده هدر SFR_Macro.h موجود است.

در تابع Start_Sending_SPI () ، ابتدا پین SS پایین کشیده می شود ، داده ها از طریق SPI به آردوینو ارسال می شوند. رجیستر SPDR مقداری را که برای برده SPI ارسال می شود نگه می دارد و همچنین مقداری را از Slave دریافت می کند.

void Start_Sending_SPI()
{
                SS = 0;
                SPDR = 0x90;    // Send 0x90 to Slave
                PCON |= SET_BIT0;   // Enter idle mode
                if(SPDR != 0x4E)   // Receive slave 1st DATA
                SPI_Error();
                printf ("\nSlave Return %x\n",SPDR & 0xFF);
                SS = 1;   
}

با این وجود ، شرایط اعتبارسنجی وجود دارد که در آن مقدار SPRD با (0x4E) که از آردوینو دریافت می شود ، مطابقت داده می شود. اگر داده ها 0x4E نباشند ، با رفتن به حلقه while ، ارتباط SPI متوقف میشود.

void SPI_Error(void)
{
                printf ("\nSlave stoped the Data sending.\n");
                while(1)  // SPI error and P0.7 flash/
                {
                }
    }

به عنوان SPI مورد استفاده در وقفه تایمر ، از یک عملکرد ISR استفاده می شود.

void SPI_ISR(void) interrupt 9    // Vecotr @  0x4B
{
            clr_SPIF;
            Timer3_Delay10us(1);
}

و با یک فاصله زمانی 1 میکرو ثانیه ای SPIF را پاک می کند.

برنامه نویسی آردوینو به عنوان برده برای SPI

برد آردوینو نانو نیز دارای پین های SPI زیر است :

پین های SPI برد آردوینو نانو

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

ابتدا باید کتابخانه های مورد نیاز را فراخوانی کنیم و متغیر های مورد نیاز را تعریف کنیم.

#include<SPI.h>
volatile boolean received;
volatile byte Slavereceived,Slavesend;

سپس، در بخش void setup ، باید UART را مقدار دهی کنیم ، پین MISO از پیش تعریف شده را به عنوان خروجی تنظیم می کنیم ، SPI را در حالت slave فعال می کنیم ، متغیر دریافت شده از پیش تعریف شده خود را false تنظیم می کنیم و در آخر ، وقفه خود را فعال می کنیم.

void setup ()
{
  Serial.begin(115200);
  pinMode(MISO,OUTPUT);    //تنظیم پین MISO  به عنوان خروجی
  SPCR |= _BV(SPE);    //تنظیم ارتباط در حالت برده
  received = false;
  SPI.attachInterrupt();   //فعال سازی وقفه
}

ما روال سرویس وقفه خود را تعریف کرده ایم ، در روال سرویس وقفه ، ما داده ها را از رجیستر SPDR به متغیر از پیش تعریف شده Slavereceived خود می ریزیم ، ما داده ها را با استفاده از توابع Serial.print چاپ می کنیم و متغیر دریافت شده را True می کنیم.

در بخش void loop، ما یک مقدار از پیش تعریف شده را به رجیستر SPDR ارسال می کنیم.

فیلم آزمایش ارتباط SPI روی Nuvoton با آردوینو

کد کامل در انتهای این صفحه آورده شده است. کد هنگام بارگذاری 0 اخطار و 0 خطا را برمی گرداند و با استفاده از روش پیش فرض چشمک زن توسط Keil چشمک می زند.

Build target 'SPI_INT_M'
linking...
Program Size: data=58.2 xdata=0 code=2402
creating hex file from ".\Output\Master_P"...
".\Output\Master_P" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:01
Batch-Build summary: 1 succeeded, 0 failed, 0 skipped - Time Elapsed: 00:00:01

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

اتصال میکروکنترلر نووتون به آردوینو

خروجی UART در سمت آردوینو را میتوان با باز کردن سریال مانیتور مشاهده کرد. مقادیر نمایش داده شده در سریال مانیتور از سمت برد nuvoton و از طریق ارتباط SPI منتقل شده اند.

به همین ترتیب ، در سمت nuvoton ، ما از اصطلاح terra برای نظارت بر دریافت اطلاعات از برده (در اینجا آردوینو) استفاده کرده ایم. در واقع ، ما 90 را از nuvoton به Arduino و 4e00 را از Arduino به nuvoton می فرستیم.

آزمایش ارتباط SPI روی Nuvoton با آردوینو

فیلم زیر به طور کامل شما را با نحوه کار این پروژه آشنا میکند.

دانلود فیلم آزمایش ارتباط SPI روی Nuvoton با آردوینو

موارد موجود در فایل : سورس کامل ، شماتیک کامل

پروژه ها رایگان هستند. برای دانلود فایل های پروژه باید در سایت عضو باشید. ثبت نام / ورود

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید
امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
محمد رحیمی

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. مالکیتی بر مطالب ارائه شده ندارم. اکثر فعالیت بنده در زمینه ترجمه است. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *