Arduino - Giao diện ngoại vi nối tiếp

Bus Giao diện Ngoại vi Nối tiếp (SPI) là một hệ thống dành cho giao tiếp nối tiếp, sử dụng tối đa bốn dây dẫn, thường là ba. Một dây dẫn được sử dụng để nhận dữ liệu, một dây để gửi dữ liệu, một dây để đồng bộ hóa và một dây dẫn khác để chọn thiết bị để giao tiếp. Đó là kết nối song công, có nghĩa là dữ liệu được gửi và nhận đồng thời. Tốc độ truyền tối đa cao hơn tốc độ trong hệ thống truyền thông I2C.

Bảng SPI Pins

SPI sử dụng bốn dây sau:

  • SCK - Đây là đồng hồ nối tiếp do chủ nhân điều khiển.

  • MOSI - Đây là đầu ra chính / đầu vào phụ do chủ điều khiển.

  • MISO - Đây là đầu vào chính / đầu ra phụ do chủ điều khiển.

  • SS - Đây là dây chọn nô lệ.

Các chức năng sau được sử dụng. Bạn phải bao gồm SPI.h.

  • SPI.begin() - 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.

  • SPI.setClockDivider(divider)- Đặt bộ chia đồng hồ SPI so với đồng hồ hệ thống. Trên bo mạch dựa trên AVR, các bộ chia có sẵn là 2, 4, 8, 16, 32, 64 hoặc 128. Cài đặt mặc định là SPI_CLOCK_DIV4, đặt đồng hồ SPI thành một phần tư tần số của đồng hồ hệ thống (5 Mhz cho bo mạch ở 20 MHz).

  • Divider - Có thể là (SPI_CLOCK_DIV2, SPI_CLOCK_DIV4, SPI_CLOCK_DIV8, SPI_CLOCK_DIV16, SPI_CLOCK_DIV32, SPI_CLOCK_DIV64, SPI_CLOCK_DIV128).

  • SPI.transfer(val) - Truyền SPI dựa trên việc gửi và nhận đồng thời: dữ liệu nhận được sẽ được trả lại trong acceptVal.

  • SPI.beginTransaction(SPISettings(speedMaximum, dataOrder, dataMode)) - speedMaximum là đồng hồ, dataOrder (MSBFIRST hoặc LSBFIRST), dataMode (SPI_MODE0, SPI_MODE1, SPI_MODE2 hoặc SPI_MODE3).

Chúng tôi có bốn chế độ hoạt động trong SPI như sau:

  • Mode 0 (the default) - Đồng hồ thường ở mức thấp (CPOL = 0), và dữ liệu được lấy mẫu khi chuyển đổi từ thấp lên cao (cạnh trước) (CPHA = 0).

  • Mode 1 - Đồng hồ thường ở mức thấp (CPOL = 0), và dữ liệu được lấy mẫu khi chuyển đổi từ mức cao xuống mức thấp (cạnh sau) (CPHA = 1).

  • Mode 2 - Đồng hồ thường ở mức cao (CPOL = 1), và dữ liệu được lấy mẫu khi chuyển đổi từ mức cao xuống mức thấp (cạnh trước) (CPHA = 0).

  • Mode 3 - Đồng hồ thường ở mức cao (CPOL = 1), và dữ liệu được lấy mẫu khi chuyển đổi từ thấp lên cao (cạnh sau) (CPHA = 1).

  • SPI.attachInterrupt(handler) - Hàm được gọi khi thiết bị tớ nhận dữ liệu từ thiết bị chủ.

Bây giờ, chúng ta sẽ kết nối hai bảng Arduino UNO với nhau; một người là chủ và người kia là nô lệ.

  • (SS): chân 10
  • (MOSI): chân 11
  • (MISO): chân 12
  • (SCK): chân 13

Mặt bằng là chung. Sau đây là biểu diễn sơ đồ của kết nối giữa cả hai bảng -

Chúng ta hãy xem các ví dụ về SPI là Master và SPI là Slave.

SPI là MASTER

Thí dụ

#include <SPI.h>

void setup (void) {
   Serial.begin(115200); //set baud rate to 115200 for usart
   digitalWrite(SS, HIGH); // disable Slave Select
   SPI.begin ();
   SPI.setClockDivider(SPI_CLOCK_DIV8);//divide the clock by 8
}

void loop (void) {
   char c;
   digitalWrite(SS, LOW); // enable Slave Select
   // send test string
   for (const char * p = "Hello, world!\r" ; c = *p; p++) {
      SPI.transfer (c);
      Serial.print(c);
   }
   digitalWrite(SS, HIGH); // disable Slave Select
   delay(2000);
}

SPI dưới dạng SLAVE

Thí dụ

#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;

void setup (void) {
   Serial.begin (115200);
   pinMode(MISO, OUTPUT); // have to send on master in so it set as output
   SPCR |= _BV(SPE); // turn on SPI in slave mode
   indx = 0; // buffer empty
   process = false;
   SPI.attachInterrupt(); // turn on interrupt
}
ISR (SPI_STC_vect) // SPI interrupt routine { 
   byte c = SPDR; // read byte from SPI Data Register
   if (indx < sizeof buff) {
      buff [indx++] = c; // save data in the next index in the array buff
      if (c == '\r') //check for the end of the word
      process = true;
   }
}

void loop (void) {
   if (process) {
      process = false; //reset the process
      Serial.println (buff); //print the array on serial monitor
      indx= 0; //reset button to zero
   }
}