Thông báo

Collapse
No announcement yet.

Giao Tiếp SPI Của PIC16F877A. Xin Mọi Người Chỉ Giáo!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giao Tiếp SPI Của PIC16F877A. Xin Mọi Người Chỉ Giáo!

    Em tìm hiểu về cách giao tiếp SPI, do sẵn hỗ trợ phần cứng nên em chọn Pic16f877 để làm (giao tiếp master với slave thông qua module nRF24L01). Do mới tìm hiểu nên em chỉ test spi như sau.
    - Master truyền 1 mã cho slave.
    - Slave đọc rồi hiển thị ra led.
    MASTER
    Code:
    #include <16f877a.h> 
    #include <def_877a.h> 
    #device *=16 ADC=8 
    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT 
    #use delay(clock=20000000) 
    #use fast_io(A)
    #byte SSPBUF=0x13
    
    unsigned int temp;
    
    void spi_ghi(unsigned char x)
    {
       SSPBUF = x;
       while(SSPIF==1);
       SSPIF = 0;
    }
    
    void init_master_spi()
    {
       TRISA= 0x00;   // Chan xuat du lieu
       //TRISB = 0x03; // 00000010, chan RB1 la chan vao du lieu, con lai la xuat
       TRISC = 0x10; //0001|0000, RC4 nhan du lieu
       SSPSTAT = 0x80; //1000|0000 set che do lay mau va trang thai xung clock
       SSPCON = 0x31; //0010|0001 set che do master, cho phep cac chan serial
       RA5 = 0; //chan chon chip slave
    }
    
    void truyen_spi(unsigned char x)
    {
       SSPBUF = x;
       while(SSPIF==0); //cho cho dich data xong
       SSPIF=0;
       temp = SSPBUF;
    }
    
    void main()
    {
       init_master_spi();
    while(1)
       {
          delay_ms(100);
          output_low(ra5);
          delay_ms(10);
          truyen_spi(0x81);
          output_high(ra5);
       }
    }
    SLAVE
    Code:
    #include <16f877a.h> 
    #include <def_877a.h> 
    #device *=16 ADC=8 
    #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT 
    #use delay(clock=20000000) 
    #use fast_io(D)
    #byte SSPBUF=0x13
    
    void init_slave_spi()
    {
       TRISC =0x18;    //0001|1000  RC3, RC4 pin_in_data
       TRISA = 0xff;   //all pin_in_data
       TRISD = 0x00;
       SSPSTAT=0x80;   // 1000|0000 set sample va clock states
       SSPCON=0x35;    // 0010|0100 SPI_slave enable SS
    }
    
    
    
    
    void nha_spi()
    {
       if(SSPIF==1)
       {PORTD = SSPBUF;
       delay_ms(10);}
    }
    
    void main()
    {
       init_slave_spi();
       while(1)
       {
          nhan_spi();
       }
    }
    Mong mọi người giúp đỡ,chỉ giáo em với nếu ai am hiểu hoặc biết chút ít về giao tiếp giữa 2 module nRF24L01 nữa thì xin chỉ giáo em với.
    Và em sẵn hỏi cách hoạt động của ngắt SSP nữa.
    Em xin cảm ơn.

  • #2
    giao tiếp SPI thì bạn cách set ví trí lấy mẫu của clock giữa slave và master phải khác nhau, ví dụ master phát data ở cạnh lên SCK thì slave phải lấy mẫu cạnh xuống SCK. Bạn xem lại hình như code bạn config phần này chưa đúng, về chân chip select thường mình dùng chế độ ko sử dụng chip select rồi dùng 1 io để làm chip select dễ sử dụng hơn.

    Comment


    • #3
      Đây là đoạn code em lấy bên PIC viet Nam . Truyền từ master xuống slave ==> OK.
      Nhưng em thử truyền ngược lại là từ slave ==> Master thì ko thấy chạy.

      Bác nào viết hộ em đoạn code với?

      Master----------------------------------------------------------------------------
      Code:
      #include <16f877a.h>
      #include <def_877a.h>
      #device *=16 ADC=8
      
      #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
      
      #use delay(clock=20000000)
      #use fast_io(b)
      #use fast_io(c)
      #use fast_io(d)
      
      #define SS1    pin_C1                  //chan chon chip cho 2 SLAVE
      #define SS2    pin_C2
      //*********************************
      int8 data,i,j;
      //*********************************
      
      void change_data()                    //dich tung bit trong bien data  
      {
         i++;
         if(i<=8)data=(data<<1) ;           //dich 8 lan gia tri cua data 
         else 
         {   data=0x01;
             j=1;
         }   
      }
      
      void send_data()                     //gui du lieu den SLAVE     
      {
      while(1)
      {
         spi_write(data);
         change_data();
         delay_ms(100);                    //Tao tre giua 2 lan truyen
         if (j==1)   break;                //sau 8 lan quet de truyen du lieu den SLAVE ,thoat khoi vong lap
      
      }
      }
      void main()
      {
         data = 0x01;                        //gia tri dau cua bien data
         set_tris_c(0);
         set_tris_e(0);
         setup_spi( SPI_MASTER | SPI_L_TO_H|spi_clk_div_16 );
         delay_ms(100);
      While(1)
      {
         output_low(SS1);                    //chon SLAVE 1 de gui du lieu
         output_high(SS2);
         send_data();
         j=0; 
         i=0;
         output_low(SS2);                   //chon SLAVE 2 de gui du lieu
         output_high(SS1); 
         send_data() ;           
         j=0; 
         i=0;
      }
      }
      //*******************************
      Slave-------------------------------------------------------------------------------
      Code:
      #include <16f877a.h>
      #include <def_877a.h>
      #device *=16 ADC=8
      #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
      #use delay(clock=20000000)
      #use fast_io(b)
      #use fast_io(c)
      #use fast_io(d)
      
      #define SS  PIN_A5
      //#include <lcd_lib_4bit.c>
      //*************************
      int8 data;
      //*************************
      #int_ssp
      void ssp_isr(void)
      {
         if(input(SS)==0)
         {
            data = spi_read();     //doc tin hieu tu MASTER 
            set_tris_b(0);         //thiet lap PORTB la cong xuat du lieu 
            output_b(data);        //Hien thi ra port B
            delay_us(10);
         }
      }
      //*************************
      void main()
      {
      set_tris_a(0xff);
      setup_spi(SPI_SLAVE|SPI_L_TO_H|spi_clk_div_16 );
      clear_interrupt(INT_SSP);
      enable_interrupts(INT_SSP);
      enable_interrupts(GLOBAL);
      
      while(1)
      {
      //Khong lam gi ,cho data den
      }
      }
      //************************

      File mo phong:
      SPI_16F877A.zip ​​​​​​​

      Comment


      • #4
        VẤN ĐỀ TRUYỀN DỮ LIỆU TỪ SLAVE LÊN MASTER ( Từ Master xuống slave thì ok như code trên rùi )

        Master phải ghi dữ liệu lên bus, dữ liệu sẽ được đọc vào đồng thời với dữ liệu ghi ra." Tức là muốn đọc dữ liệu từ Slave thì Master chỉ có thể đọc trog thời gian nó dang tạo xung CLK, muốn vậy thì phải ghi dữ liệu lên Bus
        Chỗ này hơi Hại Não, Có bác nào có đoạn code ví dụ việc truyền dữ liệu từ slave lên master ko?

        Comment

        Về tác giả

        Collapse

        hadinhdiep Tìm hiểu thêm về hadinhdiep

        Bài viết mới nhất

        Collapse

        Đang tải...
        X