目錄
一.基本配置
1.esp32-wroom-32引腳圖
2.接線方式
3.Arduino芯片選擇和庫文件
3.1Arduino配置(2.0.11)
3.2 下載ESP32SPISlave庫(0.6.8)文件
二、代碼編寫
1.主機代碼
2.從機代碼
3.注意事項
三、運行效果
一.基本配置
1.esp32-wroom-32引腳圖
2.接線方式
主機的CS隨便找個幾個引腳就行,從機的CS盡量都連到GPIO5。
3.Arduino芯片選擇和庫文件
3.1Arduino配置(2.0.11)
如果搜不到這個開發板那就執行下面操作
地址為
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
3.2 下載ESP32SPISlave庫(0.6.8)文件
github網址為
https://github.com/hideakitai/ESP32SPISlave
下載zip
導入到arduino
直接下載會有-master,把這個后綴刪除即可。
導入完成后可以在
C:\Users\86152\Documents\Arduino\libraries
這個路徑下找到ESP32SPISlave庫文件,上面的路徑都是安裝的第三方庫都放在這里,
esp32自己核心的庫放在
C:\Users\86152\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.11\libraries
重啟Arduino,如果情況和下面一樣,那么安裝成成功
最后設置編譯,查看是不是用的這個庫
編譯代碼,版本正確,路徑正確,那么成功配置
二、代碼編寫
1.主機代碼
#include <SPI.h>const int CS_PIN = 5;
uint8_t master_tx[8] = {10, 20, 30, 40, 50, 60, 70,80};
uint8_t master_rx[8] = {0};void setup() {Serial.begin(115200);SPI.begin(18, 19, 23, 5); // SCK, MISO, MOSI, SSpinMode(CS_PIN, OUTPUT);digitalWrite(CS_PIN, HIGH);Serial.println("SPI Master ready");
}void loop() {digitalWrite(CS_PIN, LOW); // 開始通信for (int i = 0; i < 8; ++i) {master_rx[i] = SPI.transfer(master_tx[i]);}digitalWrite(CS_PIN, HIGH); // 結束通信Serial.print("Master Sent: ");for (uint8_t b : master_tx) {Serial.print(b);Serial.print(" ");}Serial.print(" | Received: ");for (uint8_t b : master_rx) {Serial.print(b);Serial.print(" ");}Serial.println();delay(2000); // 每 2 秒發送一次
2.從機代碼
#include <ESP32SPISlave.h>ESP32SPISlave slave;static constexpr size_t BUFFER_SIZE = 8;
uint8_t tx_buf[BUFFER_SIZE] = {1,2, 3, 4, 5, 6, 7,8};
uint8_t rx_buf[BUFFER_SIZE] = {0};void setup() {Serial.begin(115200);slave.setDataMode(SPI_MODE0);slave.setQueueSize(1);// 使用指定引腳(默認 HSPI)slave.begin(HSPI, 18, 19, 23, 5); // SCK, MISO, MOSI, SSSerial.println("SPI Slave ready");
}void loop() {size_t received_bytes = slave.transfer(tx_buf, rx_buf, BUFFER_SIZE, 1000); // 1s超時if (received_bytes > 0) {Serial.print("Received ");Serial.print(received_bytes);Serial.print(" bytes from Master: ");for (size_t i = 0; i < received_bytes; ++i) {Serial.print(rx_buf[i]);Serial.print(" ");}Serial.println();// 修改應答數據,模擬不同內容for (size_t i = 0; i < BUFFER_SIZE; ++i) {tx_buf[i] = rx_buf[i] + 1;}}delay(100); // 避免過快重復 transfer
}
3.注意事項
? ? ? ? 在上面的代碼里面,好像需要主機和從機的接受和發送數組里面都是8個字節,每次發送和接受八個字節,不然就會出錯,我現在也沒找到原因,但是并不會影響使用。