Thứ Sáu, 24 tháng 2, 2012

Code mẫu cho PIC - Giao tiếp SPI song công giữa 2 VĐK PIC

Giao tiếp SPI song công giữa 2 PIC: PIC Master ở trên truyền dữ liệu từ PortB (công tắc trên) qua PIC Slave ở dưới để hiển thị ra PortD (LED dưới) , PIC Slave cũng lấy dữ liệu từ PortB (công tắc dưới) của mình, truyền qua PIC Master để hiển thị ra PortD (LED trên).

Chương trình chạy mô phỏng trên ISIS - Proteus:

mô phỏng SPI trên Proteus


Mã nguồn:


Code Master:



#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 rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
#use fast_io(D)
#use fast_io(A)
#define REG_Write 0x80

#INT_SSP
void spi()
{
      PORTD=spi_read(PORTB);
      delay_ms(10);
}
void main()
{
   port_b_pullups(TRUE);
   setup_spi(spi_master|spi_l_to_h|spi_clk_div_16);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   SET_TRIS_B(0xff);
   SET_TRIS_D(0x00);
   SET_TRIS_A(0x00);
   while(1)
   {
   delay_ms(100);
      output_low(PIN_A5);//Chân C2 dùng Select chip.
      delay_ms(10);//Tao tre de Slave chuan bi.
      spi_write(PORTB);
      output_high(PIN_A5);
   }
}


Code Slave:



#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 rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
#use fast_io(D)

#INT_SSP
void spi()
{
      PORTD=spi_read(PORTB);//Vua nhan vua truyen.
      delay_ms(10);
}

void main()
{
   port_b_pullups(TRUE);
   setup_spi(spi_slave|spi_l_to_h|spi_clk_div_16);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   TRISB=0xff;
   TRISD=0x00;
   while(1)
   {
   }
}

Download Project: SPI_PIC16F877A
Pass: Dientumaytinh.com

11 nhận xét:

  1. Sao mình làm như hướng dẫn trên mà PIC Master lại chỉ đọc được giá trị portB của chính nó thôi. Nghĩa là chỉ truyền được master>>slave mà không truyền ngược lại được? Mong admin giúp đỡ!

    Trả lờiXóa
  2. Mình mô phỏng theo code trên hoàn toàn chạy tốt.
    Mình mới up code và file mô phỏng lên đó, bạn có thể tải về xem lại.
    Thân!

    Trả lờiXóa
  3. sao minh compile file main.c trong muc 1 no bao loi o "16f877a.h" la sao vay ban?

    Trả lờiXóa
  4. Bạn hãy kiểm tra lại xem thư viện 16F877A.h đã có trong thư mục project chưa?
    Thân!

    Trả lờiXóa
  5. sao câu lệnh này bị báo lỗi vậy bạn
    PORTD=spi_read(PORTB);//Vua nhan vua truyen.
    delay_ms(10);

    Trả lờiXóa
  6. Sư phạm Bồi Dưỡng: Bạn hãy xem ở phần báo lỗi, trình biên dịch thông báo lỗi gì? ở dòng nào?

    Trả lờiXóa
  7. Hic, không biết sao khi mình truyền nhận 2 byte liên tiếp thì master nhận dữ liệu ko được nhỉ!có bạn nào biết truyền nhận 2 chiều mà master ko dùng ngắt ko, mình muốn truyền mã từ master xuống slave,, slave send data len cho master

    Trả lờiXóa
  8. lam sao de giao tiep mot master va 3 slave

    Trả lờiXóa
  9. ban oi sao minh lam nhu code tren no ko chay vay. ma cai link ban gui lai no die mat roi. ban co the up lai giup minh duoc ko. cam on ban nhieu

    Trả lờiXóa