Nội Dung Bài Viết
Giới thiệu
Giao tiếp ngoại vi nối tiếp (SPI) là giao thức kết nối giao diện bus.
- SPI sử dụng bốn dây để giao tiếp. Do đó nó còn được gọi là cổng giao thức truyền thông 4 dây.
- SPI là một giao thức truyền thông master-slave. Điều này có nghĩa rằng chỉ có một master và một slave duy nhất có thể giao tiếp trên giao diện bus cùng một lúc.
- Các thiết bị kích hoạt SPI hoạt động ở hai chế độ cơ bản của hoạt động SPI, tức là chế độ SPI Master và chế độ SPI Slave.
- Thiết bị master có trách nhiệm bắt đầu truyền thông. Thiết bị master tạo Serial Clock để truyền dữ liệu đồng bộ. Thiết bị master có thể xử lý nhiều thiết slave trên bus bằng cách chọn từng thiết bị một.
Dựa trên NodeMCU ESP8266 có phần cứng SPI với bốn chân có sẵn cho truyền thông SPI. Với giao diện SPI này, chúng ta có thể kết nối bất kỳ thiết bị nào được kích hoạt SPI với NodeMCU và có khả năng giao tiếp với nó.
ESP8266 có chân SPI (SD1, CMD, SD0, CLK) được sử dụng riêng cho giao tiếp Quad-SPI với bộ nhớ flash trên ESP-12E. Do đó, chúng không thể được sử dụng cho các ứng dụng SPI. Chúng tôi có thể sử dụng giao diện phần cứng SPI cho các ứng dụng cuối của người dùng.
NodeMCU SPI Pins
MISO (Master In Slave Out)
Master nhận dữ liệu và slave truyền dữ liệu thông qua pin này.
MOSI (Master Out Slave In)
Master truyền dữ liệu và slave nhận dữ liệu thông qua pin này.
SCLK (Serial Clock)
Master tạo ra clock này cho giao tiếp, được sử dụng bởi slave.
Chỉ Master có thể khởi tạo serial clock.
CS (Chip Select)
Master có thể chọn thiết bị slave thông qua pin này để bắt đầu giao tiếp với nó.
Thí dụ
Viết code giao tiếp SPI của Arduino cho NodeMCU. Ở đây NodeMCU hoạt động như một thiết bị Master và Arduino Uno làm Slave
Trong ví dụ này, chúng ta gửi chuỗi “Hello Slave” với ‘\ n’ để kết thúc chuỗi từ thiết bị Master NodeMCU. Thiết bị Slave nhận chuỗi này và in nó trên màn hình Serial.
Code Arduino cho NodeMCU Master SPI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include<SPI.h> char buff[]="Hello Slave\n"; void setup() { Serial.begin(9600); /* begin serial with 9600 baud */ SPI.begin(); /* begin SPI */ } void loop() { for(inti=0; i<sizeof buff; i++) /* transfer buff data per second */ SPI.transfer(buff[i]); delay(1000); } |
Code cho Arduino Uno Slave SPI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <SPI.h> char buff [100]; volatile byte index; volatile bool receivedone; /* use reception complete flag */ void setup (void) { Serial.begin (9600); SPCR |= bit(SPE); /* Enable SPI */ pinMode(MISO, OUTPUT); /* Make MISO pin as OUTPUT */ index = 0; receivedone = false; SPI.attachInterrupt(); /* Attach SPI interrupt */ } void loop (void) { if (receivedone) /* Check and print received buffer if any */ { buff[index] = 0; Serial.println(buff); index = 0; receivedone = false; } } // SPI interrupt routine ISR (SPI_STC_vect) { uint8_t oldsrg = SREG; cli(); char c = SPDR; if (index <sizeof buff) { buff [index++] = c; if (c == '\n'){ /* Check for newline character as end of msg */ receivedone = true; } } SREG = oldsrg; } |
Slave Output Window
Output này được nhận tại thiết bị slave, được truyền từ thiết bị master.
Download FIle
Source Code
- Arduino Sketch for NodeMCU SPI Master Download
Attached File
- ESP8266 Datasheet Download
Bài viết các bạn có thể tham khảo: