Trong bài viết này, Điện Tử Tương Lai sẽ chia sẻ cách sử dụng cổng giao tiếp SPI của Arduino. Chúng ta sẽ tìm hiểu giao tiếp SPI giữa 2 Arduino. Nó là một giao thức giao tiếp nối tiếp 4 dây. Nó hỗ trợ giao tiếp 1 master và nhiều slave. Do đó, trong hướng dẫn này, chúng ta sẽ cấu hình 1 Arduino làm master và cái còn lại làm slave.
Giới thiệu SPI
Hãy bắt đầu với phần giới thiệu cơ bản về giao thức SPI và các đường giao tiếp của nó. Giao diện giao tiếp nối tiếp này còn được gọi là giao diện ngoại vi nối tiếp. Nó cung cấp chế độ giao tiếp song công đầy đủ (full duplex). Điều này có nghĩa là dữ liệu có thể được nhận và gửi đồng thời. Master có thể gửi dữ liệu đến các slave và slave có thể gửi dữ liệu đến master cùng một lúc. Để truyền và nhận dữ liệu, cần phải có tín hiệu xung nhịp, nghĩa là nó là một kênh truyền thông đồng bộ.
Giao thức truyền thông này sử dụng bốn đường như SCK, MOSI, MISO và SS. Chúng ta sẽ tìm hiểu chi tiết về các đường này trong phần tiếp theo. Quay lại với vấn đề chính, bus SPI có thể có một master duy nhất và nhiều thiết bị slave. Master là vi điều khiển trong khi slave có thể là vi điều khiển, ADC, DAC, …
Các chân SPI Arduino
Hình bên dưới là các chân trong Arduino UNO được sử dụng cho giao tiếp SPI, các chân này được đánh dấu bằng màu vàng.
Dưới đây là chức năng được thực hiện bởi các chân này.
Chân 11 = MOSI
Chân 12 = MISO
Chân 13 = SCK
Chân 10 = SS
Giao tiếp SPI trong Arduino UNO
Bây giờ chúng ta hãy xem một ví dụ về giao tiếp SPI giữa 2 Arduino. Nhưng trước đó, hãy tìm hiểu các chức năng của thư viện giao tiếp SPI có sẵn trong Arduino IDE.
Thư viện SPI của Arduino
Để thiết lập giao tiếp giữa 2 Arduino bằng SPI, có một thư viện Arduino được xây dựng sẵn được sử dụng cho mục đích này
SPI.begin(): khởi tạo bus SPI và đặt chân SCK và MOSI thành LOW và chân SS thành HIGH.
SPI.transfer(val): được sử dụng để giao tiếp đồng thời giữa các thiết bị Master và Slave.
SPI.attachInterrupt(handler): được sử dụng để nhận dữ liệu từ master trong slave và được gọi trong slave.
SPI.setClockDivider(divider): thiết lập bộ chia xung nhịp SPI phù hợp với xung nhịp hệ thống.
Dưới đây là các loại bộ chia:
SPI_CLOCK_DIV2
SPI_CLOCK_DIV4
SPI_CLOCK_DIV8
SPI_CLOCK_DIV16
SPI_CLOCK_DIV32
SPI_CLOCK_DIV64
SPI_CLOCK_DIV128
Các bộ chia này tương ứng với phép chia có giá trị là 2, 4, 8, 16, 32, 64, 128.
Giao tiếp SPI giữa 2 Arduino
Bây giờ chúng ta hãy xem cách thực hiện giao tiếp SPI giữa 2 Arduino. Chúng ta sẽ định cấu hình 1 Arduino làm master và 1 Arduino khác làm slave. Master sẽ truyền 1 nếu người dùng nhấn nút nhấn được kết nối với D2 của Arduino. SPI Slave Arduino nhận dữ liệu này và dựa trên dữ liệu nhận được, đưa ra quyết định bật hoặc tắt đèn LED được kết nối với chân D4 của Arduino.
Đầu tiên cần biết mã của thiết bị Master.
Mã thiết bị master Arduino SPI
Code có thể được chia thành 3 phần:
Khai báo
Trong phần này, chúng ta đã bao gồm thư viện SPI và xác định các biến khác nhau. Các biến push là chân I / O kỹ thuật số Arduino nơi nút nhấn sẽ được kết nối và tùy thuộc vào trạng thái của nó, dữ liệu sẽ được truyền đến slave. Biến LED là chân Arduino dựa trên dữ liệu nhận được từ trạng thái đầu ra của slave sẽ được hiển thị.
Thiết lập thiết bị
Ở đây thiết bị đang được thiết lập cho chương trình và giao tiếp. Tốc độ truyền đầu tiên đã được đặt. Chân push và chân LED đã được khai báo là chân đầu vào và đầu ra. Giao tiếp SPI đã được thiết lập bằng các chức năng được mô tả ở trên và slave select đã được đặt ở mức cao để dừng giao tiếp nếu đã được thực hiện.
Chức năng được thực hiện
Trong phần này, chúng ta đã thực hiện thao tác thực tế gửi và nhận lệnh.
Hai biến được định nghĩa là m_send và m_receive. Trạng thái của nút nhấn gắn ở chân 2 được đọc. Tùy thuộc vào mức CAO hoặc THẤP, lệnh 1 hoặc 0 được gửi đến slave bằng cách sử dụng hàm SPI.transfer được mô tả ở trên.
Phần tiếp theo đề cập đến việc nhận dữ liệu. Dữ liệu cũng được nhận bằng cách sử dụng chức năng tương tự SPI.transfer. Nếu dữ liệu nhận được là 0, đèn LED ở chân 4 được đặt thành thấp và nếu dữ liệu nhận được là 1, đèn LED ở chân 4 được đặt thành cao.
Hoàn thành mã master
Mã master Arduino SPI
Code có thể được chia thành 3 phần:
Khai báo
Trong phần này, chúng ta đã bao gồm thư viện SPI và xác định các biến khác nhau. Biến inputbutton là chân I / O kỹ thuật số Arduino nơi nút nhấn sẽ được kết nối và tùy thuộc vào trạng thái của nó, dữ liệu sẽ được truyền đến master. Biến outputLED là chân Arduino trong đó dựa trên dữ liệu nhận được từ trạng thái đầu ra của master sẽ được hiển thị. Slave nhận được sẽ lưu trữ giá trị nhận được từ master.
Thiết lập thiết bị
Ở đây thiết bị đang được thiết lập cho chương trình và giao tiếp. Tốc độ truyền đầu tiên đã được đặt. Các chân push và LED và MISO đã được khai báo là các chân đầu vào và đầu ra. Sau đó, thiết bị đã được đặt ở chế độ slave và ngắt đã được đặt cho giao tiếp SPI.
Bất cứ khi nào xảy ra ngắt do chân nhận SPI, quy trình ngắt này sẽ thực thi.
Chức năng được thực hiện
Trong phần này, chúng ta đã thực hiện các thao tác thực tế về việc gửi và nhận lệnh.
Tại đây việc nhận dữ liệu đầu tiên được xác nhận nếu dữ liệu được nhận thì nó được kiểm tra xem là 0 hoặc 1. Nếu nhận được 0, đèn LED ở chân đầu ra 4 được đặt thành THẤP và nếu nhận được 1, đèn LED ở chân đầu ra 4 được đặt thành CAO .
Tiếp theo là kiểm tra trạng thái của chân nút nhấn 2 nếu trạng thái CAO, 1 được gửi đến Master và nếu trạng thái THẤP, 0 được gửi đến thiết bị Master.
Hoàn thành mã thiết bị slave
Khi nút được nhấn ở Arduino 1, sau một thời gian đèn LED ở Arduino 2 được BẬT.
Khi nút được nhấn ở Arduino 2, sau một thời gian đèn LED ở Arduino 1 được BẬT.
Các ứng dụng SPI trong các dự án Arduino
Giao tiếp SPI được sử dụng để giao tiếp flash, thẻ nhớ và EEPROM với vi điều khiển
Màn hình OLED và LCD sử dụng phương pháp này để giao tiếp với các thiết bị nhúng. Các cảm biến khác nhau như nhiệt độ, áp suất và DAC sử dụng phương thức giao tiếp này.
Hotline: 0979 466 469