Thông báo

Collapse
No announcement yet.

Hỏi về giao tiếp SPI

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

  • Hỏi về giao tiếp SPI

    mình đang muốn thiết kệ 1 hệ thống gồm 3 pic 16f877a
    - 2 slave đọc ADC ở chân A0, sau đó chuyển dữ liệu qua master
    - master hiện kết quả adc lên LCD.

    Ý tưởng của mình là trong dùng chân C7 của master chọn 1 slave trong 1 thời điểm. đọc giá trị của nó và lưu vào 1 biến. sau đó output ra lcd 2 biến của 2 slave. mình dụng bộ NOT để chọn. (xem hình)

    hai chân SDO của 2 slave nối với chân SDI của master
    hai chân SDI của 2 slave nối với chân SD0 của master

    tuy nhiên mình bị dính lỗi ở 2 con slave nó không đọc được ADC, code bình thường thì chạy, nhưng cứ thêm lệnh:
    Code:
    spi_write()
    để truyền qua master thì lại không đọc ADC thành công. nó chỉ đọc được giá trị 170 (ADC 8bit) không biết ở đâu ra.
    hình:
    Click image for larger version

Name:	master-slave.jpg
Views:	1
Size:	123.4 KB
ID:	1417307

    mong nhận được giúp đỡ của mọi người, cảm ơn rất nhiều.

    code mình viết như sau:
    MASTER:

    Code:
    #include <16f877a.h>
    #include <stdio.h>
    #include <math.h>
    #fuses HS,NOLVP,NOWDT,PUT
    #use delay(clock=20Mhz)
    #use rs232(baud=9600, xmit=PIN_A0)
    
    void to_lcd(float x1, float x2)
    {
       putc(254), putc(01);delay_ms(10);
       printf("slave 1: %f",x1 );
    
       putc(254), putc(192);delay_ms(10);
       printf("slave 2: %f",x2 );
    }
    
    void main()
    {
       int adc1, adc2;
       float x1, x2;
       setup_spi(spi_master);
       while(1)
       {
          output_high(PIN_C7);
          delay_ms(100);
          adc1 = spi_read();
          x1 = adc1/51;
          delay_ms(100);
    
          output_low(PIN_C7);
          delay_ms(100);
          adc2 = spi_read();
          x2 = adc2/51;
          delay_ms(100);
    
          to_lcd(x1, x2);
       }
    }
    SLAVE 1:
    =============================
    Code:
    #include "16f877a.h"
    #device ADC=8
    #use delay( clock=20Mhz)
    //#use rs232 (baud = 9600, xmit = pin_c6)
    int x;
    void main( ) 
    { 
    Setup_ADC (ADC_clock_internal) ; 
    Setup_ADC_ports (AN0); 
    Set_ADC_channel (0) ; 
    Delay_us (10 ); 
    
    setup_spi(spi_slave);
    
    While (1) 
    { 
       x = read_adc() ; 
       Output_B (x) ;  // xuat ra port B gia tri bien adc 
       spi_write(x);
    } 
    }
    SLAVE 2
    ===========================
    Code:
    #include "16f877a.h"
    #device ADC=8
    #use delay( clock=20Mhz)
    int y;
    
    void main( ) 
    { 
    Setup_ADC (ADC_clock_internal) ; 
    Setup_ADC_ports (AN0); 
    Set_ADC_channel (0) ; 
    Delay_us (10 ); 
    
    setup_spi(spi_slave);
    
    While (1) 
    { 
       y = read_adc() ; 
       Output_B (y) ;
       spi_write(y);
    } 
    }
    Attached Files

  • #2
    đã sửa được lỗi, up lên cho ai cần tham khảo
    BaiTapNhung3.zip

    Comment


    • #3
      bạn up lại link cho mình với được ko ?

      Comment

      Về tác giả

      Collapse

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

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

      Collapse

      Đang tải...
      X