اطلاعیه

Collapse
No announcement yet.

ارسال داده به slave دریافت پاسخ از slave در باس spi

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ارسال داده به slave دریافت پاسخ از slave در باس spi

    سلام دوستان
    این سئوالی که می پرسم خیلی دنبالش گشتم ولی به نتیجه درستی نرسیدم اگه ممکنه کمکم کنید
    من دو تا میکرو atmega64 و atmega8 رو با هم بوسیله spi متصل کردم که atmega 64 بعنوان master و میکرو atmega8 بعنوان slave هستند الان برای ارسال داده از master به slave بدینصورت هست که master دیتا رو ارسال میکنه و slave هم با استفاده از وقفه متوجه میشه و دیتا رو دریافت میکنه تا اینجا مشکلی ندارم و درست عمل میکنه مشکل زمانی ایجاد میشه که slave میخواد جواب master رو بده حالا من با spiout (date , lengh) برای اسلیو میفرستم و سپس جواب اسلیو هم با دستور spiout (date , lengh) ارسال میکنه و با destindata = spimove(orginaldate , lengh) سعی میکنم دیتا رو دریافت کنم ولی نمیشه حالا کسی میتونه کمکم کنه ایراد از کجاست؟
    جدیدترین ویرایش توسط moradikh1; ۱۴:۱۲ ۱۳۹۸/۱۲/۲۱.

    #2
    پاسخ : ارسال داده به slave دریافت پاسخ از slave در باس spi

    نوشته اصلی توسط moradikh1 نمایش پست ها
    سلام دوستان <br>این سئوالی که می پرسم خیلی دنبالش گشتم ولی به نتیجه درستی نرسیدم اگه ممکنه کمکم کنید<br>من دو تا میکرو atmega64 و atmega8 رو با هم بوسیله spi متصل کردم که atmega 64 بعنوان master&nbsp; و میکرو atmega8 بعنوان slave هستند الان برای ارسال داده از master به slave بدینصورت هست که master دیتا رو ارسال میکنه و slave هم با استفاده از وقفه متوجه میشه و دیتا رو دریافت میکنه تا اینجا مشکلی ندارم و درست عمل میکنه مشکل زمانی ایجاد میشه که slave میخواد جواب master رو بده حالا من با spiout (date , lengh) برای اسلیو میفرستم و سپس جواب اسلیو هم با دستور spiout (date , lengh)&nbsp; ارسال میکنه و با destindata = spimove(orginaldate , lengh)&nbsp; سعی میکنم دیتا رو دریافت کنم ولی نمیشه <img src="https://www.eca.ir/forums/images/smilies/P-NEW/various_058.gif" alt="" title="Various 058" smilieid="245" class="inlineimg" border="0"><img src="https://www.eca.ir/forums/images/smilies/P-NEW/various_058.gif" alt="" title="Various 058" smilieid="245" class="inlineimg" border="0"><img src="https://www.eca.ir/forums/images/smilies/P-NEW/various_058.gif" alt="" title="Various 058" smilieid="245" class="inlineimg" border="0"> حالا کسی میتونه کمکم کنه ایراد از کجاست؟<br><br>کد مستر<br><div style="text-align: left;"><hr><p>
    کد:
    Enable Interrupts<br>Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 128 , Noss = 0<br>Spiinit<br>Dim Send_spi_to_8 As String * 20<br>Dim Rs_spi_from_8 As String * 20<br>dim Reply as string*20<br>Do<br>&nbsp;If Stat_tst &lt;&gt; 0 Then<br>&nbsp;&nbsp;&nbsp; Call Replay_tst(stat_tst)<br>&nbsp;&nbsp;&nbsp; Stat_tst=0<br>&nbsp;End If<br>Loop<br>'*********************************************************************************************************************<br>Sub Replay_tst(byval Stat_tst As Byte)<br><span style="color:#ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Send_spi_to_8 = "Test string"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spiout Send_spi_to_8 , 20<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; waitms 5<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spiout Send_spi_to_8 , 20<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rs_spi_from_8=spimove(Send_spi_to_8,20)<br></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print Rs_spi_from_8<br>End Sub
    <br></p><p style="text-align: right;">کد slave<br></p><hr><p>
    کد:
    <br>Enable Interrupts<br>Config Spi = Hard , Interrupt = On , Data Order = Lsb , Master = No , Polarity = High , Phase = 0 , Clockrate = 128 , Noss = 0<br>Spiinit<br>Enable Spi<br>On Spi Spi_slave<br>Dim A As string*20<br>Dim Send_str As String * 10<br>'*********************************************************************************************************************<br>Do<br>&nbsp;&nbsp; If Stat_tst = 2 Then<br>&nbsp;&nbsp;&nbsp;&nbsp; Call Replay_tst(stat_tst)<br>&nbsp;&nbsp;&nbsp;&nbsp; Stat_tst = 0<br>&nbsp;&nbsp; End If<br>Loop<br>'*********************************************************************************************************************<br>Spi_slave:<br><span style="color:#ff0000;">&nbsp;&nbsp; '&nbsp;&nbsp; Spiin Receive_string , 20</span><br>&nbsp;&nbsp; Stat_tst = 2<br>Return<br><br>'*********************************************************************************************************************<br>Sub Replay_tst(byval Stat_tst As Byte)<br>Replay = -1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Stat_tst = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a="Ok test"<span style="color:#ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spiout a,20<br></span>Stat_tst = 0<span style="color:#ff0000;"></span><br>Receive_string = ""<br>End Sub<br>
    <br></p></div>نکته: این کد خیلی از قسمتهاش حذف شده و فقط بخشهای مربوط به این مسئله مونده اگه یه جایی کم و زیاد داشت و کدها منطقی به نظر نرسید ببخشید<br>
    سلام
    یکم متنی که نوشتید ناجوره و سخت میشه متوجه شد منظورتون چیه.
    ببینید توی SPI کنترل انتقال به دست مستر هستش؛ یعنی مستر با قرار دادن داده روی خط و ایجاد کلاک همزمان هم داده میفرسته و هم دریافت میکنه. حالا اگر اسلیو بخواد داده بفرسته ولی مستر نخواد دریافت کنه، عملا داده ای منتقل نمیشه. برای رفع این مشکل باید از وقفه خارجی توی مستر استفاده کنید؛ به شکلی که وقتی اسلیو بخواد داده ای بفرسته با تحریک وقفه خارجیِ مستر اونو آگاه کنه.

    دیدگاه


      #3
      پاسخ : ارسال داده به slave دریافت پاسخ از slave در باس spi

      ببخشید من موقع تایپ کردن نمیدونم چی شد که به ریخت
      سلام دوستان
      این سئوالی که می پرسم خیلی دنبالش گشتم ولی به نتیجه درستی نرسیدم اگه ممکنه کمکم کنید
      من دو تا میکرو atmega64 و atmega8 رو با هم بوسیله spi متصل کردم که atmega 64 بعنوان master و میکرو atmega8 بعنوان slave هستند الان برای ارسال داده از master به slave بدینصورت هست که master دیتا رو ارسال میکنه و slave هم با استفاده از وقفه متوجه میشه و دیتا رو دریافت میکنه تا اینجا مشکلی ندارم و درست عمل میکنه مشکل زمانی ایجاد میشه که slave میخواد جواب master رو بده حالا من با spiout (date , lengh) برای اسلیو میفرستم و سپس جواب اسلیو هم با دستور spiout (date , lengh) ارسال میکنه و با destindata = spimove(orginaldate , lengh) سعی میکنم دیتا رو دریافت کنم ولی نمیشه
      حالا کسی میتونه کمکم کنه ایراد از کجاست؟


      بله درست متوجه شدید بحث همزمانی و یا تحریک مستر برای ارسال مشکلی ندارم فقط مشکل من اینه که باید چطوری این کار رو انجام بدم یعنی به ترتیب چکار کنم؟ مثلا باید اینجوری باشه؟
      1) ارسال دیتا از مستر به اسلیو با spiout
      2) ارسال دیتا از طرف اسلیو به مستر به محض وقفه spi در اسلیو
      3) اجرای spimove طرف مستر و دریافت داده ارسال شده

      من این سه مرحله رو پیش میرم اما دیتا درست نیست

      دلیل: ادغام دو پست برای جلوگیری از اسپم

      اگر کسی نمونه برنامه با بسکام داره که این کار رو عملی کرده باشه ممنون میشم کامل بذاره ببینم اشکالم کجاست
      جدیدترین ویرایش توسط moradikh1; ۱۴:۴۴ ۱۳۹۸/۱۲/۲۱.

      دیدگاه


        #4
        پاسخ : ارسال داده به slave دریافت پاسخ از slave در باس spi

        نوشته اصلی توسط moradikh1 نمایش پست ها
        ببخشید من موقع تایپ کردن نمیدونم چی شد که به ریخت
        بله متوجه منظورتون شدم بحث همزمانی و یا تحریک مستر برای ارسال مشکلی ندارم فقط مشکل من اینه که باید چطوری این کار رو انجام بدم یعنی به ترتیب چکار کنم؟ مثلا باید اینجوری باشه؟
        1) ارسال دیتا از مستر به اسلیو با spiout
        2) ارسال دیتا از طرف اسلیو به مستر به محض وقفه spi در اسلیو
        3) اجرای spimove طرف مستر و دریافت داده ارسال شده

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

        دیدگاه


          #5
          پاسخ : ارسال داده به slave دریافت پاسخ از slave در باس spi

          ممنون از وقتی که گذاشتید لطف کردید
          این که میفرمایید درست تئی تئوری همینه توی c هم این کار سخت نیست ولی الان مجبورم با بسکام بنویسم (حالا به دلایلی) با دستوراتش و ... مشکل دارم نمیشه بیشتر دنبال اینم که یکی راهنماییم کنه توی بسکام چکار کنم؟

          دیدگاه


            #6
            پاسخ : ارسال داده به slave دریافت پاسخ از slave در باس spi

            نوشته اصلی توسط moradikh1 نمایش پست ها
            ممنون از وقتی که گذاشتید لطف کردید
            این که میفرمایید درست تئی تئوری همینه توی c هم این کار سخت نیست ولی الان مجبورم با بسکام بنویسم (حالا به دلایلی) با دستوراتش و ... مشکل دارم نمیشه بیشتر دنبال اینم که یکی راهنماییم کنه توی بسکام چکار کنم؟
            من بسکام کار نکردم متاسفانه وگرنه کمکتون میکردم حتما.

            دیدگاه

            لطفا صبر کنید...
            X