اطلاعیه

Collapse
No announcement yet.

spi در مد آزمایش

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

    spi در مد آزمایش

    با سلام
    spi برد 7x256 رو در حالت مستر و با لوپ داخلی راه اندازی کردم و رجیستر وضعیت, spi رو فعال اعلام میکنه.
    پایه های spi به جایی وصل نیست اما مشکل اینجاست که پس از اولین ارسال رجیستر وضعیت میگه که هنوز ارسال انجام نشده!!!
    اگه پایه ها به یه slave وصل نباشه این اتفاق میفته یا ایراد از جایه دیگست؟
    همه ی رفرنسهای اتمل رو بررسی کردم اما مطلب مناسبی پیدا نکردم لطفا راهنمایی کنید
    متشکرم

    #2
    پاسخ : spi در مد آزمایش

    سلام
    برنامه زیر برای 7S64 هست (کتاب AT91 مثال 11-1) که SPI را در مد مستر فعال کرده و داده 0x55 را دائم به slave صفر میفرستد و با استفاده از حلقه فیدبک داخلی خود میکرو دریافت می کند و بر روی پایه های PA0 الی PA7 نشان می دهد. این برنامه را برای 7X تغییر بده ببین جواب می دهد یا نه؟!!!

    کد:
    #include <Atmel/ioat91sam7s64.h>
    void main ()
    {
    //--------------------start up--------------------------
    AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
    AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
    //--------------------speed up--------------------------
    AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
    AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; 
    AT91C_BASE_PMC->PMC_MCKR = 0x3;
    AT91C_BASE_PMC->PMC_SCER = 0x1;
    //-----------------------------------------------------
    AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2
    AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_SPI); // AT91C_ID_SPI=5
    //-----------------------------------------------------
    AT91C_BASE_PIOA->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
    AT91C_BASE_PIOA->PIO_OER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
    AT91C_BASE_PIOA->PIO_OWER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
    AT91C_BASE_PIOA->PIO_ODSR=0xFF;
    AT91C_BASE_PIOA->PIO_PDR = (1<<11|1<<12|1<<13|1<<14);
    AT91C_BASE_PIOA->PIO_MDER = (1<<11|1<<12|1<<13|1<<14);
    AT91C_BASE_PIOA->PIO_ASR = (1<<11|1<<12|1<<13|1<<14);
    AT91C_BASE_PIOA->PIO_PPUER = (1<<11|1<<12|1<<13|1<<14);
    AT91C_BASE_SPI->SPI_MR = 0x0F000091;
    AT91C_BASE_SPI->SPI_CSR[0] = 0x0F0FFF02;
    AT91C_BASE_SPI->SPI_CR = 0x1;
    while (1)
     {
     while (!(AT91C_BASE_SPI->SPI_SR&0x2));
     AT91C_BASE_SPI->SPI_TDR = 0x55;
     while (!(AT91C_BASE_SPI->SPI_SR&0x1));
     AT91C_BASE_PIOA->PIO_ODSR = AT91C_BASE_SPI->SPI_RDR&0xFF;
     }
    }

    دیدگاه


      #3
      پاسخ : spi در مد آزمایش

      با سلام

      متشکر از جواب درست و سریعتون
      برتامه رو برای sam7x256 تغییر دادم و کار کرد.پس از مقایسه با برنامه خودم متوجه شدم که رجیستر MR رو اشتباه پر کرده بودم که اینجا مطرح می کنم تا دیگران هم استفاده کنن

      *AT91C_SPI0_MR =(AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED |0x00 << 16| AT91C_SPI_MODFDIS | AT91C_SPI_DLYBCS) ;

      پرکردن رجیستر بالا یه مشکلی داره و اونهم استفاده نکردن از تایپ کستینگه که باعث میشه نتیجه با اونچه که شما انتظار دارید فرق کنه. درستش رو می تونید در پایین مشاهده کنید
      *AT91C_SPI0_MR =(AT91C_SPI_MSTR | AT91C_SPI_PS_FIXED | ((unsigned int) 0x00 << 16)| AT91C_SPI_MODFDIS | AT91C_SPI_DLYBCS) ;
      به پرانتز حاوی unsigned int توجه کنید!

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

      تا چند روز آینده هدر SPI که هم کامله و هم تست شده رو تو سایت قرار میدم.

      اما یه سوال دیگه کیل چرا نمی تونه رم بیشتر از یک کیلو رو درست کامپایل کنه؟
      یعنی char buffer[1024]l رو کامپایل می کنه ولی برنامه از خط بعد از تعریف آرایه میکرو گیر میکنه برای char [512]l مشکلی نداره ولی دوتا 512 نه!!
      کیل من رجیستر شدس و برنامه رو بدون اررور کامپایل میکنه

      دیدگاه

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