Arduino và giao tiếp SPI

I. GIAO TIẾP SPI LÀ GÌ?

SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao do hãng Motorola đề xuất. Đây là kiểu truyền thông Master-Slave, trong đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và Slave. SPI là một cách truyền song công (full duplex) nghĩa là tại cùng một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output), MOSI (Master Ouput Slave Input) và SS (Slave Select). Hình 1 thể hiện một kết SPI giữa một chip Master và 3 chip Slave thông qua 4 đường.
  • 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

lên
19 thành viên đã đánh giá bài viết này hữu ích.
Các dự án được truyền cảm hứng

Select any filter and click on Apply to see results

Các bài viết cùng tác giả

Công cụ vẽ đồ thị trên arduino IDE - Serial Plotter

Bắt đầu từ bản cập nhật arduino IDE 1.6.6, Arduino IDE đã giới thiệu một tính năng mới tuyệt vời. Nó được gọi là Serial Plotter, gọi nôm na là vẽ nối tiếp và bạn có thể tìm thấy nó trong Arduino IDE của bạn dưới menu Tools. Bài viết này mình sẽ giới thiệu với các bạn công cụ Plotter này

lên
14 thành viên đã đánh giá bài viết này hữu ích.

Thiết bị khóa đơn giản và rẻ tiền với Arduino

Có rất nhiều cách để thiết kế 1 thiêt bị khóa cửa bằng arduino, việc tạo ra 1 password cho nó các bạn cần sử dụng đến các phím nhấn, bàn phím ma trận, hay phức tạp hơn là cảm biến vân tay...

Bài viết này mình sẽ giới thiệu tới các bạn 1 cái nhìn không mới, nhưng rất thú vị, về 1 cách tạo bộ khóa không đụng hàng với ai bằng arduino và 1 chiếc usb hỏng!

 

lên
31 thành viên đã đánh giá bài viết này hữu ích.