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
21 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ả

Sạc cho nguồn và cấp nguồn cho Arduino - Giải quyết vấn đề năng lượng bằng một bài viết bỏ túi

Đối với các dự án không tiêu thụ nhiều năng lượng, các bạn có thể sử dụng pin AAA hoặc pin 9v. Nhưng với những dự án tiêu thụ nhiều năng lượng bao gồm cả động cơ, màn hình LCD hay âm thanh thì pin 18650 là lựa chọn tối ưu, vừa bền, vừa gọn nhẹ.

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

Giao tiếp I2C giữa nhiều arduino với nhau

Đôi khi chúng ta muốn chia sẻ khối lượng công việc của một Arduino với 1 arduino khác. Hoặc có khi chúng ta muốn nhiều chân digital hoặc analog hơn để xử lý công việc.I2C là giải pháp tốt nhất. Bài viết này mình sẽ hướng dẫn các bạn cách giao tiếp giữa 2 boad arduino với nhau qua giao thức I2C.

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