راه‌اندازی ماژول RC522 با STM32

راه‌اندازی ماژول RC522 با STM32

راه‌اندازی ماژول RC522 با STM32
راه‌اندازی ماژول RC522 با STM32

قبلا در سیسوگ ماژول RC522 را در مقاله ای تحت عنوان “راه‌اندازی پروژه RFID RC522 با آردوینو” راه‌اندازی کردیم. اکنون در این مقاله قصد داریم به راه‌اندازی ماژول RC522 با STM32  بپردازیم. ابتدا در رابطه با خود RFID توضیحاتی خواهیم داد و در ادامه به راه‌اندازی آن با STM32 می‌پردازیم.

RFID (Radio Frequency Identification)

همانطور که از اسم RFID پیداست، می‌تواند با استفاده از فرکانس‌های رادیویی عمل شناسایی را انجام دهد.

به طور ساده می‌توان گفت که RFID با استفاده از امواج مغناطیس و بدون تماس مستقیم عمل شناسایی را انجام می‌دهد.

نحوه‌ی عملکرد RFID

راه‌اندازی ماژول RC522 با STM32

نحوه‌ی عملکرد به این گونه است که وقتی کارت دارای UID در مجاورت ماژول RC522 قرار می‌گیرد، میدان مغناطیسی تولید شده توسط ماژول باعث فعال شدن تگ RFID می‌گردد. در ادامه تگ پیوسته اقدام به ارسال داده می‌کند و این داده‌ها توسط کارت‌خوانی که در قسمت ماژول است خوانده می‌شود.

بررسی انواع تگ‌های RFID

راه‌اندازی ماژول RC522 با STM32

تگ‌های RFID دارای انواع متفاوتی هستند و امکانات آن‌ها تا حدودی متفاوت است، اما همگی آن‌ها حداقل دارای یک تراشه و یک آنتن هستند.

بعضی از این تگ‌ها دارای حافظه‌هایی نیز هستند که این حافظه می‌تواند فقط خواندنی و یا خواندنی/نوشتنی باشد.

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

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

ماژول RC522

ماژول RC522

ماژول کارت‌خوان با قابلیت خواندن و نوشتن RC522 به منظور خواندن کارت‌های RFID مورد استفاده قرار می‌گیرد. همچنین این ماژول با فرکانس کاری 13.56 مگاهرتز قابلیت خواندن و نوشتن بر روی تگ‌ها را دارد.

این ماژول قابلیت‌هایی دارد که مختصرا به شرح زیر می‌باشند:

  • پشتیبانی از پروتوکل‌های I2C ,SPI و UART 
  • دارای یک بافر 64 بیتی
  • ولتاژ کاری 2.5 تا 3.5 ولت DC
  • جریان مصرفی 13 تا26 میلی آمپر
  • دارای اسیلاتور خارجی 27.12 مگاهرتز
  • قابلیت خواندن و نوشتن بدون تماس در فاصله 8 تا 10 سانتی متر

همانطور که در قابیلت‌های این ماژول ذکر شد، از سه پروتکل برای انتقال دیتا پشتیبانی می‌کند. اما پروتکلی که ما قصد داریم از آن برای راه‌اندازی این ماژول استفاده کنیم، پروتکل SPI است. در ادامه به شرح این پروتکل می‌پردازیم.

پروتکل SPI

این پروتکل، یک پروتکل سریال می‌باشد که توسط شرکت موتورولا طراحی شده است و به صورت Master و Slave کار می‌کند، بدین صورت که فقط می‌تواند یک Master و چندین Slave داشته باشد.

در حالت تئوری تعداد Slaveها هیچ محدودیتی ندارد اما در عمل به دلیل یک سری نکات فنی تعداد Slaveها محدود است.

به تصویر زیر دقت کنید:

پروتکل SPI

در حالت کلی پروتکل SPI شامل چهار سیم زیر می‌باشد:

  • SCLK: Serial Clock (output from master)
  • MOSI: Master Output Slave Input, or Master Out Slave In (data output from master)
  • MISO: Master Input Slave Output, or Master In Slave Out (data output from slave)
  • SS: Slave Select (often active low, output from master)

توضیحات بالا به خوبی عملکرد هر پایه را نشان می‌دهد و نیازی به توضیحات اضافی نیست. پس همان‌طور که گفتیم در این پروتکل چهار سیم وجود دارد اما این تا زمانی است که تنها یک Master و یک Slave داشته باشیم. به ازای اضافه شدن هر Slave یک سیم SS دیگر به Master اضافه می‌شود.

در واقع هر سیم SS برای انتخاب یکی از Slaveها به کار می‌رود.

در پروژه موردنظر ما چون یک Slave داریم پس Master هم همان چهار سیم را دارد.

در پروتکل SPI چهار مد عملیاتی مختلف وجود دارد که این چهار مد عملیاتی به وسیله‌ی دو پارامتر CPOL و CPHA تعیین می‌شوند. ابتدا به تصاویر زیر دقت کنید تا پس از آن این مدهای عملیاتی را توضیح بدهیم.

راه‌اندازی ماژول RC522 با STM32

 

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

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

همچنین پارامتر CPHA مشخص می‌کند که دیتا در اولین یا دومین لبه‌ی کلاک نمونه‌برداری شود. اینکه پارامتر CPOL چه باشد اولین لبه می‌تواند لبه‌ی بالارونده یا پایین‌رونده باشد، دومین لبه نیز به همین صورت می‌تواند بالا رونده باشد یا پایین رونده.

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

راه‌اندازی ماژول RC522 با STM32

اکنون می‌خواهیم که این ماژول را با استفاده از برد Bluepill که میکروکنترلر آن STM32F1 می‌باشد راه‌اندازی کنیم.

نحوه‌ی کار به این صورت است که ما ID تگ RFID را با استفاده از پروتکل SPI می‌خوانیم و پس از اینکه دیتای تگ ثبت شد آن را با استفاده از پروتکل UART بر روی پورت سریال ارسال خواهیم کرد و ID کارت را در کامپیوتر مشاهده خواهیم کرد.

ماژول را طبق اتصالات زیر به SPI1 برد Bluepill وصل خواهیم کرد.

راه‌اندازی ماژول RC522 با STM32

RC522 Bluepill
SDA PA4
SCK PA5
MOSI PA7
MISO PA6
IRQ unconnected
GND GND
RST 3.3V
3.3V 3.3V

همچنین یک مبدل USB به سریال به UART1 برد Bluepill وصل خواهیم کرد تا داده‌ها را مانند شکل زیر در کامپیوتر مشاهده کنیم. پایه RX ماژول به A9 (TX USART1) متصل می شود. همچنین بهتر است پایه ریست RC522 را هم به پایه ریست بلوپیل متصل کنید تا وقتی که به وسیله دکمه بلوپیل را ریست می کنیم، ماژول هم ریست شود.

پورت سریال rfid

توضیحاتی در رابطه با کتابخانه و main برنامه

ابتدا دیتا‌شیت ماژول را می‌خوانیم و با توجه به رجیسترها، مد کاری، نحوه‌ی انتقال دیتا، پروتکلی که دیتا با آن انتقال پیدا می‌کند و … یک کتابخانه برای ماژول درست می‌کنیم. 

در پروژه، ما تنها یک کتابخانه نوشته شده توسط کاربر به اسم rc522 داریم. در فایل rc522.h یک سری ثوابت، رجیسترها و همچنین  اسم توابع را تعریف کردیم. در فایل rc522.c هم نحوه‌ی انتقال دیتا و کار با ماژول با استفاده از توابع توصیف شده است.

در فایل rc522.c حدود بیست تابع برای کارهای مختلف با ماژول موجود می‌باشد که ما به توضیح تک تک این توابع نخواهیم پرداخت و در ادامه فقط مختصرا توابعی که در main برنامه استفاده کردیم را بررسی می‌کنیم.

البته با توجه به اسم هر تابع و بررسی کد آن شما به سادگی می‌توانید متوجه عملکرد و کارایی تابع شوید.

مثلا ما هنگام توسعه برنامه از تابع MFRC522_ReadRegister استفاده کردیم و همانطور که از اسمش مشخص است مقدار یک رجیستر را به ما بر‌می‌گرداند. ما با استفاده از این تابع مقدار رجیستر مربوط به ورژن RFID را خواندیم و با مقداری که در دیتا شیت داریم چک کردیم تا ببینیم ارتباط به درستی صورت گرفته است یا خیر.

البته چون ابتدا ولتاژ 3.3 ولت روی برد قطع بود، به نظر می‌رسید که کتابخانه نوشته شده به درستی کار نمی‌کند و عملیات انتقال دیتا با استفاده از پروتکل SPI به درستی صورت نمی‌گیرد. که پس از چک کردن ولتاژ 3.3 ولت و برقرار کردن آن کشف شد که کتابخانه به درستی با ماژول ارتباط برقرار می‌کند و مشکل از تغذیه است.

همچنین توجه شود که ما در کتابخانه rc522 برای پروتکل SPI و UART از توابع HAL استفاده کردیم.

ابتدا به main برنامه توجه کنید تا در ادامه توضیحاتی را بیان کنیم.

ابتدا کلاک سیستم، ورودی-خروجی، پروتکل UART و پروتکل SPI را انشیالایز می‌کنیم.

همانطور که می‌دانید زمانی که قرار است با پروتکل SPI ارتباط برقرار کنیم باید ابتدا پایه CS را صفر کنیم و زمانی که دیتا منتقل شد و کاری نداشتیم دوباره این پایه را به مقدار یک منطقی برگردانیم.

چون CS به پایه PA4 متصل است ما PA4 را صفر و یک می‌کنیم. 

ابتدا PA4 را در main برنامه در حالت یک قرار می‌دهیم تا زمانی که بخواهیم در while دیتا را از SPI انتقال بدهیم آن را صفر می‌کنیم.

پس از ایجاد کمی تاخیر یک پیام بر روی پورت سریال برای راهنمای کاربر می‌فرستیم و ادامه برنامه در while قرار دارد.

کل برنامه‌ی نوشته شده در while به شرح زیر است:

در ابتدای while توسط دستورات شرطی بررسی می‌شود که کارتی تشخیص داده شده است یا خیر، اگر تشخیص داده شد، ID آن را بر روی پورت سریال بفرستد. تواما بررسی می‌شود تا مادامی که همان کارت در مجاورت ماژول قرار دارد مقدار ID همان باشد و چیز دیگری روی پورت سریال فرستاده نشود مگر اینکه کارت را کلا برداریم و دوباره بزنیم تا همان ID برای بار دوم روی پورت سریال فرستاده شود.

همچنین در این برنامه اشکال اینکه اگر کارت در فاصله‌ای از ماژول قرار بگیرد که در لحظه‌ای بسیار کوتاه خوانده شود و سپس خوانده نشود و به همین ترتیب ادامه پیدا کند، برطرف شده است. 

 

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

 

لینک‌های دانلود

اسم فایل

  • RC522.zip

حمایت از سپهر

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

دیدگاه ها

42 دیدگاه

  • رضا
    ۶ اردیبهشت ۱۴۰۱

    دوست عزیز کد کار نمیکنه

    • Zeus ‌
      Zeus ‌
      ۷ اردیبهشت ۱۴۰۱

      سلام
      کد الان مجددا بررسی شد و تست شد و بدون مشکل کار کرد.

  • Mohammad
    ۳۰ آبان ۱۴۰۰

    سلام
    میشه راه اندازی این ماژول با پروتکل i2c هم توضیح بدید؟

  • حمید
    ۶ مهر ۱۴۰۰

    سلام وقتتون بخیر،
    کد برای بنده کار نکرد، مقدار MFRC522_Request برابر با 2 یا همان MI_ERR است. از اتصالات و صحت ماژول نیز به طور کامل اطمینان دارم

    • Zeus ‌
      Zeus
      ۲۴ مهر ۱۴۰۰

      کد برنامه مشکل داشت – اصلاح شد و تست شد
      آیا بعد آن اصلاح هم تست کردید ؟

      • حمید
        ۲۴ مهر ۱۴۰۰

        درود بر شما، خیر،
        از کتابخانه دیگری استفاده کردم مشکل برطرف شد

        • Zeus ‌
          Zeus
          ۲۴ مهر ۱۴۰۰

          خوشحالم که مشکلتون حل شده
          به هر حال این مثال رو من خودم تست کردم به مشکل بود توی کد مین که حل کردم

  • سورنا 1404
    ۱۵ شهریور ۱۴۰۰

    آقا من با یه ماژول دیگه هم امتحان کردم اکی نشد نمیدونین مشکلش چیه؟
    فقط همون عبارت سریال که اول میفرستیم ارسال میشه. ودیگه کارت رو نمیخونه و ماژول هیچ عملکردی نداره…؟؟؟!!!!

    • Zeus ‌
      Zeus
      ۲۱ شهریور ۱۴۰۰

      آقا کد رو بررسی کردم یه مشکلی که داشت این بود که تابع اینیت ماژول رو کال نکرده بود که مقداری عجیب هم بود
      کد رو اصلاح کردم و برای دانلود قرار دادم –
      دوباره دانلود کنید و تست کنید احتمالا اوکی شده باشه

  • سید مصطفی حسینی
    ۱۴ شهریور ۱۴۰۰

    فقط بعد ریست این عبارت STM32F103 Mifare RC522 RFID Card reader 13.56 MHz که دارین ارسال میکنید میاد اما زمانی که کارتو میگیریم هیچی نمیاد؟؟

    • Zeus ‌
      Zeus
      ۲۱ شهریور ۱۴۰۰

      ریست ماژول رو به ریست میکرو وصل کنید که هم زمان با هم ریست بشن و کد جدید رو دانلود کنید و تست کنید

  • سید مصطفی حسینی
    ۱۴ شهریور ۱۴۰۰

    سلام براچی کار نمیکنه؟؟؟؟؟؟؟

    • Zeus ‌
      Zeus
      ۱۴ شهریور ۱۴۰۰

      جالبه اجازه بدید من خودم فردا مدارش رو بیندم ببینم کد مشکل داره کتابخانه یا مدار
      بهتون اطلاع میدم

      • سید مصطفی حسینی
        ۱۴ شهریور ۱۴۰۰

        ممنون میشم چون کارم یکم گیره

        • Zeus ‌
          Zeus
          ۲۱ شهریور ۱۴۰۰

          درست کردم کد رو دوست عزیز
          تست کنید و نتیجه رو بگید 🙂

      • سید مصطفی حسینی
        ۱۵ شهریور ۱۴۰۰

        سلام خسته نباشید. من با یه ماژول دیگه هم امتحان کردم اکی نشد؟؟؟. نمیدونین مشکلش چیه؟؟…

        • Zeus ‌
          Zeus
          ۲۱ شهریور ۱۴۰۰

          کد مشکل داشت متاسفانه بررسی کردم و مشکل رو حل کردم
          دوباره دانلود کنید و تست کنید – من تست کردم اوکی شد و کار میکرد

  • حمید
    ۲۸ فروردین ۱۴۰۰

    سلام ، ممنون از زحماتتون ، من این برنامه رو اپلود کردم ولی جواب نداد که؟ من اومدم پایه های سریال رو به ماژول بلوتوث دادم و با گوشیم چکش میکردم ، برنامه که استارت میشه اون نوشته ی stm32f103 …. رو میفرسته رو گوشیم ، ولی کارت رو که نزدیک میکنم هیچی نمیاد ، اصلا انگار نه انگار ، ماژول ۵۲۲ هم چراغش روشنه و نو هم هست ، کانکتور ها و سیم ها رو هم چک کردم ، درست وصلن ، پایه ریست رو هم به زمین وصل کردم ، هم وی سی سی هم ازاد گزاشتم اما تو هیچ کدوم از اونا ماژول هیچی نفرستاد ، میشه یه راهنمایی برای دیباگ کردن برنامه یا ماژول بهم بدین؟ خب از کجا بفهمم ماژول سالمه یا نه ، حتما باید یه ماژول دیگه هم بخرم؟

    • Zeus ‌
      zeus
      ۵ خرداد ۱۴۰۰

      عجیبه یه مقدار چون برنامه رو چک کردیم قبلا
      پایه ریست ماژول و به ریست میکرو وصل کنید و برد رو ریست کنید ببینید آیا مشکل حل میشه ؟

    • حمید
      ۵ خرداد ۱۴۰۰

      ممنون ، نتونستم راه اندازیش کنم متاسفانه ، دیگه با اردینو راهش انداختم ، ولی بازم ممنون

      • Zeus ‌
        zeus
        ۵ خرداد ۱۴۰۰

        ببخشید که دیر جواب دادم و البته خوشحالم که مشکل رو به نحوی حل کردید 🙂

  • محمد
    ۱۳ مهر ۱۳۹۹

    سلام ببخشید طبق عکس بالا شما rst رو به پایه میکرو متصل کردید ولی نوشتید 3.3v ببخشید نحوه اتصال درسته اخه کد ج نمیده ممنون میشم راهنمایی کنید

    • Kamin Jalili
      ۱۴ مهر ۱۳۹۹

      درود بر محمد عزیز. شما طبق جدول ریست رو به 3.3V متصل کنید، سپس امتحان کنید.

      • محمد
        ۱۴ مهر ۱۳۹۹

        سلام جناب مهندس بله درسته مشکل از برد بود با تشکر از اموزش بسیار خوبتون

        • Kamin Jalili
          ۱۴ مهر ۱۳۹۹

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

        • سید مصطفی حسینی
          ۱۴ شهریور ۱۴۰۰

          سلام چطوری مشکلتون حل شد؟

  • سید حسین
    ۱۹ مرداد ۱۳۹۹

    سلام خسته نباشید
    این پروژه برای ماژول های 125khz هم جواب میده ؟؟؟؟

  • محمد رحیمی
    ۲۰ خرداد ۱۳۹۹

    سلام با چه نرم افزاری باید باز کرد این پروژه رو ؟

    • Zeus ‌
      زئوس Zeus
      ۲۱ خرداد ۱۳۹۹

      فکر میکنم keil

    • Phoenix
      ۲۲ خرداد ۱۳۹۹

      با نرم‌افزار Keil و STM32CubeMX

  • emid
    ۲۰ خرداد ۱۳۹۹

    سلام
    با تشکر از مطالب خوب شما.
    پیشنهاد من این بود که خوب بود در مورد خوندن سکتور ها میزاشتین، اینا که اسونه تقریبا.

    • Phoenix
      ۲۹ خرداد ۱۳۹۹

      درود. فعلا فقط همین آسونش برآورده شده 😐😐😐

  • Hadi Feyzi
    hadi feyzi
    ۱۹ خرداد ۱۳۹۹

    سلام برای دانلود سورس یوزر و پسورد لازمه !

    • Phoenix
      ۲۰ خرداد ۱۳۹۹

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

  • امیر وسکره
    atlantis14188
    ۱۹ خرداد ۱۳۹۹

    سلام خسته نباشید . سورس برنامه قابل دانلود نیست . در صورت امکان بررسی بشه.ممنونم.

    • Phoenix
      ۲۰ خرداد ۱۳۹۹

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

      • امیر وسکره
        atlantis14188
        ۲۰ خرداد ۱۳۹۹

        خیلی ممنون ، محبت کردین.

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

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

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

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

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک