اطلاعیه

Collapse
No announcement yet.

spi + at91sam7x256

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

    spi + at91sam7x256

    سلام،
    خسته نباشید. لطفا میشه یکی بگه اشکال کد زیر در چی هستش؟ دیتای خروجی روی پورت سریال فقط 0x00 هستش.

    برنامه master:

    کد:
    #include <stdio.h>
    
    #include "board.h"
    #include "dbgu.h"
    #include "pio.h"
    #include "aic.h"
    
    
    void delay(unsigned char x)
    {
    	unsigned int i,j;
    	for(i=0;i<1275;i++)
    		for(j=0;j<x;j++);
    }
    
    static const Pin pins[] = {PINS_DBGU,PINS_SPI0, PIN_SPI0_NPCS1 };
    
    int main(void)
    {
     
     
     PIO_Configure(pins, PIO_LISTSIZE(pins));
     DBGU_Configure(DBGU_STANDARD, 115200, BOARD_MCK);
     // Configure PMC by enabling SPI clock
     AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI0);
     AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
    
     printf("start printing from spi device\n\r");
    
    
     AT91C_BASE_PIOA->PIO_PDR = (1 << 13 | 1 << 16 | 1 << 17 | 1 << 18);
     AT91C_BASE_PIOA->PIO_MDER = (1 << 13 | 1 << 16 | 1 << 17 | 1 << 18);
     AT91C_BASE_PIOA->PIO_ASR = (1 << 13 | 1 << 16 | 1 << 17 | 1 << 18);
     AT91C_BASE_PIOA->PIO_PPUER = (1 << 13 | 1 << 16 | 1 << 17 | 1 << 18);
    
     AT91C_BASE_SPI0->SPI_MR = 0x0F000013;
    
     //SPI Chip Select
     AT91C_BASE_SPI0->SPI_CSR[1] = 0x0F0FFF02;
    
     //Enable interrupt
     //AT91C_BASE_SPI0->SPI_IER = 0x40;
    
     //Enable SPI
     AT91C_BASE_SPI0 -> SPI_CR = AT91C_SPI_SPIEN; // SPI is enable
    
     //AIC_ConfigureIT(AT91C_ID_SPI0,0, SPI_ISR);
     //AIC_EnableIT(AT91C_ID_SPI0);
     
    
     while(1)
     {
    	 while(!(AT91C_BASE_SPI0->SPI_SR & 0x2));
    	 AT91C_BASE_SPI0->SPI_TDR = 0x42;
    
    	 delay(10);
    
     }
    
    }










    برنامه slave


    کد:
    #include <stdio.h>
    
    #include "board.h"
    #include "dbgu.h"
    #include "pio.h"
    #include "aic.h"
    
    void SPI_ISR(void)
    {
    	 printf("0x%X ",AT91C_BASE_SPI0->SPI_RDR & 0xff);
    }
    
    static const Pin pins[] = {PINS_DBGU,PINS_SPI0, PIN_SPI0_NPCS0 };
    
    int main(void)
    {
     
     
     PIO_Configure(pins, PIO_LISTSIZE(pins));
     DBGU_Configure(DBGU_STANDARD, 115200, BOARD_MCK);
     // Configure PMC by enabling SPI clock
     AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_SPI0);
     AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
    
     AT91C_BASE_PIOA->PIO_PDR = (1 << 12 | 1 << 16 | 1 << 17 | 1 << 18);
      AT91C_BASE_PIOA->PIO_MDER = (1 << 12 | 1 << 16 | 1 << 17 | 1 << 18);
      AT91C_BASE_PIOA->PIO_ASR = (1 << 12 | 1 << 16 | 1 << 17 | 1 << 18);
      AT91C_BASE_PIOA->PIO_PPUER = (1 << 12 | 1 << 16 | 1 << 17 | 1 << 18);
    
     printf("start printing from spi device\n\r");
    
     AT91C_BASE_SPI0 -> SPI_MR = 0x0;
    
     //SPI Chip Select
     AT91C_BASE_SPI0->SPI_CSR[0] = 0x02;
     
     //Enable interrupt
     AT91C_BASE_SPI0->SPI_IER = 0x40;
    
     //Enable SPI
     AT91C_BASE_SPI0 -> SPI_CR = AT91C_SPI_SPIEN; // SPI is enable
    
     AIC_ConfigureIT(AT91C_ID_SPI0,0, SPI_ISR);
     AIC_EnableIT(AT91C_ID_SPI0);
     
    
     while(1)
     {
    
     }
    }
    {امضاء خلاف قوانین}

    #2
    پاسخ : spi + at91sam7x256

    سلام
    برنامه زیر برای راه اندازی واحد SPI میکرو 7S می باشد که عدد 0x55 از master ارسال می شود و عدد 0xAA از slave ارسال می شود در ضمن فرکانس میکرو 48mhz می باشد. ببین اول این برنامه را روی میکروت تست کن ببین درست جواب می دهد بعد تغییرات لازم را برای برنامه خودت بده. در ضمن میکروها داده هایی که دریافت می کنند را برروی پین ها PA0تاPA7 نشان می دهند.
    برنامه master
    کد:
    #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<<31|1<<12|1<<13|1<<14);
    AT91C_BASE_PIOA->PIO_MDER = (1<<31|1<<12|1<<13|1<<14);
    AT91C_BASE_PIOA->PIO_ASR = (1<<31|1<<12|1<<13|1<<14);
    AT91C_BASE_PIOA->PIO_PPUER = (1<<31|1<<12|1<<13|1<<14);
    AT91C_BASE_SPI->SPI_MR = 0x0F000013;
    AT91C_BASE_SPI->SPI_CSR[1] = 0x0F0FFF02;
    AT91C_BASE_SPI->SPI_CR = 0x1;
    while (1)
     {
     while (!(AT91C_BASE_SPI->SPI_SR&0x2));
     AT91C_BASE_SPI->SPI_TDR = 0xD0055;
     while (!(AT91C_BASE_SPI->SPI_SR&0x1));
     AT91C_BASE_PIOA->PIO_ODSR = AT91C_BASE_SPI->SPI_RDR&0xFF;
     }
    }
    برنامه slave
    کد:
    #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 = 0x0;
    AT91C_BASE_SPI->SPI_CSR[0] = 0x02;
    AT91C_BASE_SPI->SPI_CR = 0x1;
    while (1)
     {
     while (!(AT91C_BASE_SPI->SPI_SR&0x2));
     AT91C_BASE_SPI->SPI_TDR = 0xAA;
     while (!(AT91C_BASE_SPI->SPI_SR&0x1));
     AT91C_BASE_PIOA->PIO_ODSR = AT91C_BASE_SPI->SPI_RDR&0xFF;
     }
    }

    دیدگاه


      #3
      پاسخ : spi + at91sam7x256

      سلام
      من تو راه اندازی SPI میکرو 7x به مشکل برخوردم.
      slave اصلا هیچ داده ای نمیگیره!
      کلی کلنجار رفتم نمی دونم اشکال چیه!
      این برنامه رو ببینین :

      //master
      int main()
      {
      int i = 0;
      AT91S_SPI *SPI1 = AT91C_BASE_SPI1;

      *AT91C_PIOA_OER = (1 << 0);

      *AT91C_PIOA_PDR = (1 << 25) | (1 << 22) | (1 << 23) | (1 << 24);
      *AT91C_PIOA_ASR = (1 << 25) | (1 << 22) | (1 << 23) | (1 << 24);
      *AT91C_PMC_PCER = (1 << AT91C_ID_SPI1);
      *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA);

      // master, fixed peripheral (1), directly chip select
      SPI1->SPI_MR = 0x0F010001;
      SPI1->SPI_CSR[1] = 0x0F0FFF08;
      SPI1->SPI_CR = AT91C_SPI_SPIEN;

      for (i = 0; i <= 0xfffff; i++);

      //transmit
      while (!(SPI1->SPI_SR & AT91C_SPI_TDRE));
      SPI1->SPI_TDR = 0x1;

      *AT91C_PIOA_SODR = (1 << 0);

      while (1)
      {}
      return 0;
      }

      //slave
      int main()
      {
      *AT91C_PIOA_OER = (1 << 0);

      *AT91C_PIOA_PDR = (1 << 21) | (1 << 22) | (1 << 23) | (1 << 24);
      *AT91C_PIOA_ASR = (1 << 21) | (1 << 22) | (1 << 23) | (1 << 24);
      *AT91C_PMC_PCER = (1 << AT91C_ID_PIOA);
      *AT91C_PMC_PCER = (1 << AT91C_ID_SPI1);

      //slave
      *AT91C_SPI1_CR = AT91C_SPI_SPIEN;

      while(!(*AT91C_SPI1_SR & AT91C_SPI_RDRF));

      *AT91C_PIOA_SODR = (1 << 0);

      while (1)
      {
      }
      return 0;
      }

      اگه داده ای بیاد باید از شرط while رد بشه. اما نمیشه! اگه اشکالی تو برنامه نیست لطفا یکی امتحان کنه. شاید اشکال سخت افزاری داشته باشم.

      برنامه آقا حامد رو هم امتحان کردم نشد!!
      https://www.linkedin.com/in/mohammadhosseini69

      http://zakhar.blog.ir

      دیدگاه


        #4
        پاسخ : spi + at91sam7x256

        سلام
        معمولا علامت ! برای bitwise not استفاده میشه، بهتره از علامت ~ استفاده کنی

        دیدگاه


          #5
          پاسخ : spi + at91sam7x256

          نوشته اصلی توسط Hossein.N
          سلام
          معمولا علامت ! برای bitwise not استفاده میشه، بهتره از علامت ~ استفاده کنی
          نه! اتفاقا ~ بیتی عمل می کنه و ! منطقی
          توروخدا یکی این برنامه رو امتحان کنه...
          https://www.linkedin.com/in/mohammadhosseini69

          http://zakhar.blog.ir

          دیدگاه


            #6
            پاسخ : spi + at91sam7x256

            سلام
            چندتا اشکال برنامه تون داره.
            1. پایه های 22و23و24و25 در حالت B برای SPI1 می باشد و شما آنها را در حالت A فعال کرده اید.
            2. رجیستر SPI_MR را هم در SLAVE مقدار دهی نمائید.
            3. شما از پین PA0 برای چک کردن برنامه استفاده نموده اید اول باید توسط رجیستر PIO_PER مشخص نمائید که این پین به عنوان IO می باشد و سپس توسط رجیستر PIO_OER آنرا به عنوان خروجی تعریف کنید و در ضمن بهتر است مقدار این را اول صفر نمائید توسط رجیستر PIO_CODR بعد اگر برنامه درست انجام شد این پین یک شود.

            دیدگاه

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