Chủ Nhật, 26 tháng 2, 2012

Hướng Dẫn CCS Cho PIC - Bài 6: Giao Tiếp SPI



Bài trước: +Bài 5: Truyền Thông Nối Tiếp RS232 - Xử Lý Chuỗi Trong CCS
Bài sau: +Bài 7: Các Ngắt Trong PIC

Bài 6: Giao Tiếp SPI



I /  GIAO TIẾP SPI


+ Đây là giao tiếp dễ dùng nhất , đơn giản nhất , tốc độ cao nhất trong nhóm . hoạt động theo cơ chế hand-shaking, bắt tay . Giả sử có 2 VDK , thì 1 là master , 1 là slave . Khi master truyền 1 byte cho slave , nó phát 8 xung clock qua đường clock - SCK nối tới slave , đồng thời truyền 8 bit data từ chân SDO tới chân SDI của slave. Không kiểm tra chẵn lẻ , lỗi . Do đó Ví dụ  nếu đang truyền được 3 bit mà master reset hay hở dây clock thì data bị mất , slave sẽ không nhận đủ 8 bit và do đó nếu tiếp tục nhận nó sẽ lấy 5 bit ở byte kế tiếp đưa vào thanh ghi nhận để đủ 8 bit ( và để  kích ngắt ) . Từ đó trở đi là mọi giá trị nhận là sai bét trừ phi chấm dứt và sau đó thiết lập lại giao tiếp này ( ở cả hai ) .



+ Giao tiếp này cần  ít nhất 2 dây trở lên . Nếu 1 VDK chỉ  cần gởi data thì chỉ cần dây clock và SDO .VDK nhận  sẽ dùng SDI và dây clock . Dây clock là nối chung .
+ Nếu có gởi và nhận ở cả 2 VDK thì : dây clock chung , master có SDO nối tới SDI của slave , SDO của slave nối tới SDI của master .
+ Nếu master cần truyền data cho nhiều slave trở lên  thì  SDO master nối tới các SDI của slave .
+ Chân  SS là slave select .
+ SPI hoạt động từ phần cứng , vì nó có sẵn thanh ghi gởi và nhận , nhận đủ giá trị thì có cờ ngắt phục vụ .
+ Danh sách các hàm :
1 / Setup_spi (mode ) 
     Setup_spi2 (mode ) 
+ Dùng thiết lập giao tiếp SPI . Hàm thứ 2 dùng với VDK có 2 bộ SPI .
+ Tham số mode :là các hằng số sau , có thể OR giữa các nhóm bởi dấu |
  I SPI_MASTER , SPI_SLAVE , SPI_SS_DISABLED 
  II SPI_L_TO_H , SPI_H_TO_L 
  III SPI_CLK_DIV_4 , SPI_CLK_DIV_16 , SPI_CLK_DIV_64 , SPI_CLK_T2 
+ Nhóm I xác định VDK là master hay slave ,slave select
+ Nhóm II xác định clock cạnh lên hay xuống .
+ Nhóm III xác định tần số  xung clock , SPI_CLK_DIV_4 ngĩa là tần số = FOSC / 4 , tương ứng 1 chu kỳ lệnh / xung .
+ Hàm không trả về trị .
+ Ngoài ra ,tuỳ VDK mà có thêm 1 số tham số khác , xem file * .h .


2 / Spi_read ( data ) 
     Spi_read2 ( data ) 
+ data có thể có thêm và là số 8 bit . Hàm thứ 2 cho bộ SPI thứ 2 .
+ Hàm trả về giá  trị 8 bit: value = spi_read ( ) 
+ Hàm trả về giá trị đọc bởi SPI . Nếu value phù hợp SPI_read ( ) thì data sẽ được phát xung ngoài và data nhận được sẽ được trả về . Nếu không có data sẵn sàng , spi_read ( ) sẽ đợi data .
+ Hàm chỉ dùng cho SPI hardware ( SPI phần cứng  ) .


3 / Spi_write ( value ) 
     Spi_write2 ( value ) 


+ Hàm không trả về trị . value là giá trị 8 bit .
+ Hàm này gửi value ( 1 byte ) tới SPI , đồng thời tạo 8 xung clock .
+ Hàm chỉ dùng cho SPI hardware ( SPI phần cứng  ) .


4 / Spi_data_is_in ( ) 
     Spi_data_is_in2 ( ) 
+ Hàm trả về TRUE ( 1 ) nếu data nhận được đầy đủ ( 8 bit ) từ SPI , trả về false nếu chưa nhận đủ .
+ Hàm này dùng kiểm tra xem giá  trị nhận về SPI đã đủ 1 byte chưa để dùng hàm spi_read ( ) đọc data vào biến .




Tham Khảo: 

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





(Nguồn:  TRẦN XUÂN TRƯỜNG)

3 nhận xét:

  1. Như vậy làm sao mình sát định chân SDI, SDO.... của giao tiếp SPI trên PIC mong bạn giúp.

    Trả lờiXóa
  2. Đối với từng loại Vi xử lý thì có các chân giao tiếp SPI cố định.
    Ví dụ: PIC16F877A ở hình trên có chân SDI-23, SDO-24, SCK-18.
    Thân!

    Trả lờiXóa
  3. Bạn cho mình hỏi làm thế nào để xử lý gói data 12 bit từ IC ADC 12bit, vì mình thấy một khung truyền SPI chỉ cho phép 8 bit

    Trả lờiXóa