Hải Đăng PPK gửi vào
- 87517 lượt xem
I. GIAO TIẾP SPI LÀ GÌ?
- SCK: Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền đồng bộ nên cần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1 bit dữ liệu đến hoặc đi. Đây là điểm khác biệt với truyền thông không đồng bộ mà chúng ta đã biết trong chuẩn UART. Sự tồn tại của chân SCK giúp quá trình tuyền ít bị lỗi và vì thế tốc độ truyền của SPI có thể đạt rất cao. Xung nhịp chỉ được tạo ra bởi chip Master.
- MISO– Master Input / Slave Output: nếu là chip Master thì đây là đường Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves được nối trực tiếp với nhau.. MOSI – Master Output / Slave Input: nếu là chip Master thì đây là đường Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves được nối trực tiếp với nhau.
- SS – Slave Select: SS là đường chọn Slave cần giap tiếp, trên các chip Slave đường SS sẽ ở mức cao khi không làm việc. Nếu chip Master kéo đường SS của một Slave nào đó xuống mức thấp thì việc giao tiếp sẽ xảy ra giữa Master và Slave đó. Chỉ có 1 đường SS trên mỗi Slave nhưng có thể có nhiều đường điều khiển SS trên Master, tùy thuộc vào thiết kế của người dùng.
- Nói 1 cách vắn tắt và dễ hiểu:
- MISO - Mang các dữ liệu từ các thiết bị SPI về arduino
- MOSI - Mang các dữ liệu từ Arduino đến các thiết bị SPI
- SS - Chọn thiết bị SPI cần làm việc
- SCK - dòng đồng bộ
Đối với Arduino Uno các chân giao tiếp SPI Lần lượt là SS-10; MOSI-11; MISO-12; SCK-13. Đối với Arduino Mega MISO là 50, MOSI là 51, SCK là 52 và SS thường là 53
Bạn có thể kiểm soát 1 hoặc nhiều thiết bị sử dụng SPI. Ví dụ dưới đây là 1 thiết bị
Dữ liệu được truyền qua lại dữa 2 đường MISO và MOSI. Điều này chỉ thực hiện được khi Dòng SS được thiết lập ở mức thấp LOW. Nói cách khác, để giao tiếp với một thiết bị SPI chúng ta cần thiết lập các dòng SS với thiết bị ở mức thấp LOW, sau đó giao tiếp với nó, sau đó thiết lập các dòng SS trở lại mức cao HIGH. Nếu chúng ta có hai hoặc nhiều thiết bị SPI trên cùng 1 bus, chúng sẽ được kết nối như sau:
Chú ý, ở đây có hai dòng SS - với mỗi 1 thiết bị chỉ sử dụng 1 dòng SS. Bạn có thể sử dụng bất kỳ chân digital nào trên Arduino của bạn cho dòng SS. Chỉ cần nhớ là để tất cả các dòng SS ở mức cao HIGH , "ngoại trừ" dòng SS mà bạn muốn kết nối với các thiết bị SPI vào thời điểm đó.
Điều này tương tự như việc rất nhiều cánh cổng trước mặt nhưng chỉ cho phép 1 người đi vào. Ta mở 1 cổng và cho 1 người duy nhất vào, rồi sau đó đóng cánh cổng đó và mở cánh cổng khác và lựa chọn người khác
II. LÀM THẾ NÀO ĐỂ TÔI CÓ THÊ GỬI DỮ LIỆU ĐẾN CÁC THIẾT BỊ KẾT NỐI SPI VỚI ARDUINO?
Trước hết, chúng ta cần phải sử dụng thư viện SPI. Nó được đính kèm mặc định khi bạn cài đặt Arduino IDE,bạn chỉ việc #include nó vào code của mình
#include "SPI.h"
Tiếp theo, trong void.setup () khai báo pin (s) để sử dụng cho dòng SS và cài đặt chúng ở dạng OUTPUT. Ví dụ:
pinMode(ss, OUTPUT);
Kích hoạt giao tiếp SPI
SPI.begin();
và cuối cùng chúng ta cần phải xác định cách để gửi dữ liệu, MSB hay LSB trước bằng cách sử dụng:
SPI.setBitOrder(MSBFIRST);
Hoặc là
SPI.setBitOrder(LSBFIRST);
Và cuối dùng là đưa dòng SS về mức thấp, gửi dữ liệu và đưa về mức cao
digitalWrite(SS, LOW); SPI.transfer(value); digitalWrite(ss, HIGH);
Việc gửi dữ liệu là khá đơn giản, còn việc nhận tất nhiên là do thiết bị slave SPI giải quyết. Trong bài viết tới mình sẽ đề cập đến vấn đề giao tiếp SPI giữa các boad arduino với nhau.
Thực tế việc sử dụng giao tiếp SPI đôi khi khá rườm rà và phức tạp, để hiểu sâu được cách giao tiếp với các thiết bị SPI cần nghiên cứu kỹ datasheet của thiết bị. 1 số module thậm chí đã được hỗ trợ sẵn thư viện để chúng ta có thể dễ dàng giao tiếp SPI với chúng mà không cần quan tâm đến việc xác định LSBFIRST hay MSBFIRST
1 ví dụ phổ biến về giao tiếp SPI là với module micro SD card các bạn có thể xem lại bài viết của bạn HưngUS
Chúc các bạn thành công