- SPI là gì?
- Hoạt động của SPI
- SPI Pins trong Arduino UNO
- Sử dụng SPI trong Arduino
- Các thành phần cần thiết cho giao tiếp Arduino SPI
- Sơ đồ mạch giao tiếp Arduino SPI
- Cách lập trình Arduino cho giao tiếp SPI:
- Giải thích lập trình chính của Arduino SPI
- Giải thích lập trình Arduino SPI Slave
- SPI hoạt động như thế nào trên Arduino? - Hãy kiểm tra nó!
Vi điều khiển sử dụng nhiều giao thức khác nhau để giao tiếp với các cảm biến và mô-đun khác nhau. Có nhiều loại giao thức truyền thông khác nhau cho truyền thông không dây và có dây, và kỹ thuật truyền thông được sử dụng phổ biến nhất là Giao tiếp nối tiếp. Truyền thông nối tiếp là quá trình gửi dữ liệu từng bit một, tuần tự qua một kênh truyền thông hoặc bus. Có nhiều kiểu giao tiếp nối tiếp như giao tiếp UART, CAN, USB, I2C và SPI.
Trong hướng dẫn này, chúng ta tìm hiểu về giao thức SPI và cách sử dụng nó trong Arduino. Chúng tôi sẽ sử dụng Giao thức SPI để giao tiếp giữa hai Arduinos. Ở đây một Arduino sẽ hoạt động như Master và một cái khác sẽ hoạt động như Slave, hai đèn LED và nút nhấn sẽ được kết nối với cả Arduino. Để thể hiện giao tiếp SPI, chúng tôi sẽ điều khiển đèn LED phía chủ bằng nút nhấn ở phía phụ và ngược lại bằng giao thức truyền thông SPI Serial.
SPI là gì?
SPI (Giao diện ngoại vi nối tiếp) là một giao thức truyền thông nối tiếp. Giao diện SPI được Motorola tìm ra vào năm 1970. SPI có kết nối song công, có nghĩa là dữ liệu được gửi và nhận đồng thời. Đó là một chủ có thể gửi dữ liệu cho một nô lệ và một nô lệ có thể gửi dữ liệu cho chủ đồng thời. SPI là giao tiếp nối tiếp đồng bộ có nghĩa là đồng hồ được yêu cầu cho các mục đích giao tiếp.
Giao tiếp SPI trước đây đã được giải thích trong các bộ vi điều khiển khác:
- Giao tiếp SPI với Vi điều khiển PIC PIC16F877A
- Màn hình cảm ứng TFT LCD 3,5 inch giao diện với Raspberry Pi
- Lập trình vi điều khiển AVR với chân SPI
- Giao diện LCD đồ họa Nokia 5110 với Arduino
Hoạt động của SPI
Một SPI có một giao tiếp chủ / nô lệ bằng cách sử dụng bốn dòng. Một SPI chỉ có thể có một chủ và có thể có nhiều nô lệ. Master thường là một vi điều khiển và các nô lệ có thể là một vi điều khiển, cảm biến, ADC, DAC, LCD, v.v.
Dưới đây là biểu diễn sơ đồ khối của SPI Master với Single Slave.
SPI có bốn dòng sau MISO, MOSI, SS và CLK
- MISO (Master in Slave Out) - Dòng Slave để gửi dữ liệu đến master.
- MOSI (Master Out Slave In) - Dòng chính để gửi dữ liệu đến thiết bị ngoại vi.
- SCK (Serial Clock) - Xung đồng hồ để đồng bộ hóa quá trình truyền dữ liệu do cái chủ tạo ra.
- SS (Slave Select) –Master có thể sử dụng chân này để bật và tắt các thiết bị cụ thể.
SPI Master với nhiều nô lệ
Để bắt đầu giao tiếp giữa chủ và tớ, chúng ta cần đặt chân Slave Select (SS) của thiết bị được yêu cầu thành THẤP để nó có thể giao tiếp với chủ. Khi nó cao, nó bỏ qua chủ. Điều này cho phép bạn có nhiều thiết bị SPI chia sẻ cùng một dòng chính MISO, MOSI và CLK. Như bạn có thể thấy trong hình trên, có bốn nô lệ trong đó SCLK, MISO, MOSI được kết nối chung với chủ và SS của mỗi nô lệ được kết nối riêng với các chân SS riêng lẻ (SS1, SS2, SS3) của chủ. Bằng cách đặt chân SS yêu cầu THẤP, một chủ có thể giao tiếp với nô lệ đó.
SPI Pins trong Arduino UNO
Hình ảnh bên dưới cho thấy các chân SPI có Arduino UNO (trong hộp màu đỏ).
Dòng SPI |
Ghim trong Arduino |
MOSI |
11 hoặc ICSP-4 |
MISO |
12 hoặc ICSP-1 |
SCK |
13 hoặc ICSP-3 |
SS |
10 |
Sử dụng SPI trong Arduino
Trước khi bắt đầu lập trình giao tiếp SPI giữa hai Arduinos. Chúng ta cần tìm hiểu về thư viện Arduino SPI được sử dụng trong Arduino IDE.
Thư viện
1. SPI.begin ()
SỬ DỤNG: Để khởi tạo bus SPI bằng cách đặt SCK, MOSI và SS thành đầu ra, kéo SCK và MOSI xuống thấp và SS cao.
2. SPI.setClockDivider (bộ chia)
SỬ DỤNG: Để đặt bộ chia đồng hồ SPI so với đồng hồ hệ thống. Các dải phân cách có sẵn là 2, 4, 8, 16, 32, 64 hoặc 128.
Bộ phân chia:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (trình xử lý)
SỬ DỤNG: Chức năng này được gọi khi thiết bị phụ nhận dữ liệu từ thiết bị chính.
4. SPI.transfer (val)
SỬ DỤNG: Chức năng này được sử dụng để gửi và nhận dữ liệu đồng thời giữa master và slave.
Vì vậy, bây giờ chúng ta hãy bắt đầu với việc trình diễn thực tế về giao thức SPI trong Arduino. Trong hướng dẫn này, chúng ta sẽ sử dụng hai arduino, một là master và một là slave. Cả hai Arduino đều được gắn một đèn LED và một nút nhấn riêng biệt. Đèn LED chính có thể được điều khiển bằng cách sử dụng nút nhấn của Arduino nô lệ và đèn LED của Arduino phụ có thể được điều khiển bằng nút nhấn của Arduino chính bằng cách sử dụng giao thức truyền thông SPI có trong arduino.
Các thành phần cần thiết cho giao tiếp Arduino SPI
- Arduino UNO (2)
- LED (2)
- Nút ấn (2)
- Điện trở 10k (2)
- Điện trở 2,2k (2)
- Breadboard
- Kết nối dây
Sơ đồ mạch giao tiếp Arduino SPI
Sơ đồ mạch bên dưới cho thấy cách sử dụng SPI trên Arduino UNO, nhưng bạn có thể làm theo quy trình tương tự đối với Giao tiếp Arduino Mega SPI hoặc Giao tiếp Arduino nano SPI. Hầu hết mọi thứ sẽ được giữ nguyên ngoại trừ số pin. Bạn phải kiểm tra sơ đồ chân của Arduino nano hoặc mega để tìm chân Arduino nano SPI và chân Arduino Mega, một khi bạn đã làm xong mọi thứ khác sẽ giống nhau.
Tôi đã xây dựng mạch hiển thị ở trên trên một breadboard, bạn có thể xem cách thiết lập mạch mà tôi đã sử dụng để thử nghiệm bên dưới.
Cách lập trình Arduino cho giao tiếp SPI:
Hướng dẫn này có hai chương trình một cho Arduino chính và một cho Arduino nô lệ. Các chương trình hoàn chỉnh cho cả hai bên được đưa ra vào cuối dự án này.
Giải thích lập trình chính của Arduino SPI
1. Trước hết chúng ta cần bao gồm thư viện SPI để sử dụng các chức năng giao tiếp SPI.
#include
2. Trong thiết lập void ()
- Chúng tôi bắt đầu giao tiếp nối tiếp với tốc độ truyền 115200.
Serial.begin (115200);
- Gắn đèn LED vào chân 7 và Nút nhấn vào chân 2 và đặt các chân đó OUTPUT và INPUT tương ứng.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Tiếp theo, chúng ta bắt đầu giao tiếp SPI
SPI.begin ();
- Tiếp theo, chúng tôi đặt Clockdivider cho giao tiếp SPI. Ở đây chúng tôi đã thiết lập bộ chia 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Sau đó đặt chân SS CAO vì chúng tôi không bắt đầu bất kỳ chuyển giao nào sang arduino nô lệ.
digitalWrite (SS, HIGH);
3. Trong vòng lặp void ():
- Chúng tôi đọc trạng thái của chân nút bấm được kết nối với chân2 (Master Arduino) để gửi các giá trị đó đến Arduino nô lệ.
buttonvalue = digitalRead (ipbutton);
- Đặt Logic cho giá trị Cài đặt x (Được gửi đến nô lệ) tùy thuộc vào đầu vào từ chân 2
if (giá trị nút == CAO) { x = 1; } else { x = 0; }
- Trước khi gửi giá trị, chúng ta cần THẤP giá trị chọn tớ để bắt đầu chuyển sang tớ từ chính.
digitalWrite (SS, LOW);
- Đây là bước quan trọng, trong câu lệnh sau, chúng tôi gửi giá trị nút nhấn được lưu trữ trong biến Mastersend tới arduino nô lệ và cũng nhận giá trị từ slave sẽ được lưu trữ trong biến Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Sau đó, tùy thuộc vào giá trị Mastereceive, chúng tôi sẽ BẬT hoặc TẮT LED Arduino chính.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Đặt chân 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, THẤP); // Đặt chân 7 LOW Serial.println ("Master LED OFF"); }
Lưu ý: Chúng tôi sử dụng serial.println () để xem kết quả trong Động cơ nối tiếp của Arduino IDE. Kiểm tra Video ở cuối.
Giải thích lập trình Arduino SPI Slave
1. Trước hết chúng ta cần bao gồm thư viện SPI để sử dụng các chức năng giao tiếp SPI.
#include
2. Trong thiết lập void ()
- Chúng tôi bắt đầu giao tiếp nối tiếp với tốc độ truyền 115200.
Serial.begin (115200);
- Gắn đèn LED vào chân 7 và Nút nhấn vào chân 2 và đặt các chân OUTPUT và INPUT tương ứng.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Bước quan trọng ở đây là các câu lệnh sau
pinMode (MISO, OUTPUT);
Câu lệnh trên đặt MISO là OUTPUT (Phải gửi dữ liệu đến Master IN). Vì vậy, dữ liệu được gửi qua MISO của Slave Arduino.
- Bây giờ hãy bật SPI ở Chế độ nô lệ bằng cách sử dụng Đăng ký điều khiển SPI
SPCR - = _BV (SPE);
- Sau đó, BẬT ngắt cho giao tiếp SPI. Nếu một dữ liệu được nhận từ chủ, Quy trình ngắt được gọi và giá trị nhận được sẽ được lấy từ SPDR (Thanh ghi dữ liệu SPI)
SPI.attachInterrupt ();
- Giá trị từ cái chính được lấy từ SPDR và được lưu trữ trong biến Slaverenition . Điều này diễn ra trong chức năng Quy trình ngắt sau.
ISR (SPI_STC_vect) { Nô lệ = SPDR; nhận được = true; }
3. Tiếp theo trong void loop (), chúng ta đặt đèn LED arduino Slave thành BẬT hoặc TẮT tùy thuộc vào giá trị Slaverenition.
if (Slaverenition == 1) { digitalWrite (LEDpin, HIGH); // Đặt chân 7 làm LED CAO ON Serial.println ("LED Slave ON"); } else { digitalWrite (LEDpin, LOW); // Đặt chân 7 là LOW LED OFF Serial.println ("Slave LED OFF"); }
- Tiếp theo chúng ta đọc trạng thái của Slave Arduino Push button và lưu giá trị vào Slavesend để gửi giá trị đến Master Arduino bằng cách đưa giá trị vào thanh ghi SPDR.
buttonvalue = digitalRead (ghim nút); if (giá trị nút == CAO) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
Lưu ý: Chúng tôi sử dụng serial.println () để xem kết quả trong Động cơ nối tiếp của Arduino IDE. Kiểm tra Video ở cuối.
SPI hoạt động như thế nào trên Arduino? - Hãy kiểm tra nó!
Dưới đây là hình ảnh thiết lập cuối cùng cho giao tiếp SPI giữa hai Bo mạch Arduino.
Khi nhấn nút nhấn ở phía chính, đèn LED màu trắng ở phía phụ sẽ BẬT.
Và khi nhấn nút nhấn ở phía Slave, đèn LED màu đỏ ở phía Master sẽ BẬT.
Bạn có thể xem video dưới đây để xem phần trình diễn của giao tiếp Arduino SPI. Nếu bạn có bất kỳ câu hỏi nào, xin vui lòng để lại chúng trong phần bình luận của chúng tôi sử dụng diễn đàn của chúng tôi.