۲۵ آبان ۱۳۹۷

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

مهدی عبدالهی

مهدی عبدالهی

کانال میکروالکترونیک @microstm32کانال میکروالکترونیک @microstm32

مطالب مشابه

5 Comments

  1. 2

    Porya

    سلام مهندس
    وقت بخیر
    خیلی ممنون از آموزش هاتون
    ببخشید به یه مشکل حین کار با stm32f407 خوردم
    موقع کار با spi همه تنظیماتو انجام میدم

    ولی زمان ارسال یا دریافت رجیستر dr ظاهرا اصلا دیتایی دریافت یا ارسال نمیکنه

    تننظیمات هم کاملا درسته
    مد master انتخاب شده
    بیت BR با مقدار مناسب تنظیم شده
    بیت های cpol و cpha با مقدار درست مقدار دهی شدن
    بعد بیت spe ست شده
    مد ارسال ۸ بیتیه
    بعدش هم یه دیتا تویه رجیستر drنوشته میشه.
    برنامه منتظر میمونه تا txe یک بشه، بعد rxne بعد bsy.
    عجیبه با خوندن بیت txe برای چک شرط یک شدنش، بیت rxne صفر میشه خودکار!!
    و درنتیجه در شرط بعدی که چک کردن بیت rxneه کد گیر میکنه.
    اینکه rxne یک میشه ولی باز بافر دریافت خالیه و dr هیچ مقداری جز صفر نداره هم عجیبه!!
    بعد چک های متوالی برنامه هم از طریق توابع hal و هم کتابخونه هایی که خودم نوشتم، متوجه شدم بیت bsy هم یک نمیشه اصلا!
    پس انگار کلا واحد spi درگیر ارسال و دریافت نمیشه! ولی اگه اینجوریه چرا rxne تغییر حالت میده؟!
    هرچی چک میکنم و میخونم نتیجه ایی نمیگیرم، نمیدونم چیه مشکل واقعا

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

    پاسخ
    1. 2.1
      زئوس Zeus

      زئوس Zeus

      سلام
      امم ، اولین چیزی که به ذهنم میرسه اینه که چک کنید آیا کلاک SPI مورد استفاده رو تامین کردید یا خیر (موارد زیادی برای خودم پیش اومده که کلاک رو تنظیم نکرده بودم)
      اگر امکان داره تیکه کد کانفیگ و تیکه کدی که دیتا رو ارسال میکنید رو اینجا قرار بدید که بشه بررسی کرد. کارایی که برای ارسال انجام میدید ظاهرا درسته
      برای ارسال اول باید چک کنید که بافر ارسال خالی باشه ، بعد دیتا رو قرار بدید ؛ بعد منتظر بشید که بافر دریافت پر بشه و فرایند رو اینطور پیش ببرید

      پاسخ
    2. 2.2
      زئوس Zeus

      زئوس Zeus

      آقای عبدالهی زحمت کشیدند و این تابع رو آماده کردند

      uint8_t SPI_ReadWriteByte(uint8_t num)
      {
      uint8_t retry=0;
      while((SPI1->SR&1< <1)==0) { retry++; if(retry>200)return 0;
      }
      SPI1->DR=num;
      retry=0;
      while((SPI1->SR&1< <0)==0) { retry++; if(retry>200)return 0;
      }
      return SPI1->DR;
      }

      پاسخ
  2. 1

    وحید

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

    پاسخ
    1. 1.1
      زئوس Zeus

      زئوس Zeus

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

      پاسخ

پاسخ دهید

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

کلیه حقوق این سایت متعلق به سیسوگ بوده و انتشار مطالب بدون ذکر نام و وب سایت سیسوگ اخلاقا مجاز نمی باشد. Sisoog