microPython的SPI与Arduino环境下Esp32的SPI通信

文章编写背景

前一阵子项目中需要将K210的图像数据传输到app中,于是需要一个通信模块作辅助,选择ESP32-Wroom-32D作为通信模块。图像传输协议自然为SPI通信,快速而简单,于是K210通过MicroPython作为主通信设备,Esp32通过Arduino编写从设备代码,完成主从设备的SPI数据传输。

但是!!!!!问题来了,除了ESP32的DMA缓冲区问题等等,我发现从设备根本不通(直接调用Arduino的SPI库)!

咱就去网上找相关资料,发现调用这个官方SPI库的例程

#include <SPI.h>

都是作为主设备使用,唯一的SPI从设备(ESP32开发板)还是ESP-IDF的例程,这怎么可能!!!

我是真的不相信ESP32在Arduino这个热门环境中没有SPI的简单例子,但是!百方查找,还就是没有。直到科学上网遇到了一个github库,专门为SPI从设备建立了一个库文件,参考下方链接:

https://github.com/hideakitai/ESP32SPISlave

个老哥(赞赞赞)编写了SPI从模式库文件和使用DMA的从模式库,良心呀!!还贴心提示了DMA使用情况下的数据缺失问题(每一包缺失4字节),通过该库文件编写从模式代码,终于跟K210的master开发板建立了链接,并且成功完成图像传输。

mark

终于完成了既定的任务,后面开始填坑机智云app讲解内容。

SPI通信简介

在这里插入图片描述

SPI(Serial Peripheral Interface)是一种高速、全双工、同步的通信协议,常用于微控制器与外围设备之间的数据传输。SPI通信通常涉及一个主设备和一个或多个从设备,通过四根信号线进行通信:SCLK(时钟线)、MOSI(主设备输出从设备输入)、MISO(主设备输入从设备输出)和SS(从设备选择线)。
在这里插入图片描述
在这里插入图片描述

MicroPython中的SPI通信

在MicroPython中,SPI通信可以通过machine模块中的SPI类来实现。以下是一个简单的SPI通信示例:

from machine import Pin, SPI

# 初始化SPI
spi = SPI(1, baudrate=1000000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))

# 选择从设备
cs = Pin(15, Pin.OUT)
cs.value(0)

# 发送数据
spi.write(b'Hello')

# 接收数据
data = spi.read(5)

# 取消选择从设备
cs.value(1)

Arduino环境下ESP32的SPI通信

在Arduino环境下,ESP32的SPI通信可以通过SPI库来实现。以下是一个简单的SPI通信示例:

#include <ESP32SPISlave.h>

ESP32SPISlave slave;

static constexpr size_t BUFFER_SIZE = 8;
static constexpr size_t QUEUE_SIZE = 1;
uint8_t tx_buf[BUFFER_SIZE] {1, 2, 3, 4, 5, 6, 7, 8};
uint8_t rx_buf[BUFFER_SIZE] {0, 0, 0, 0, 0, 0, 0, 0};

void setup()
{
    // 初始化串口通信
  Serial.begin(115200);
  Serial.println("HSPI Slave Mode Test");
  
    slave.setDataMode(SPI_MODE0);   // default: SPI_MODE0
    slave.setQueueSize(QUEUE_SIZE); // default: 1

    // begin() after setting
    slave.begin();  // default: HSPI (please refer README for pin assignments)
}

void loop()
{
    // do some initialization for tx_buf and rx_buf

    // start and wait to complete one BIG transaction (same data will be received from slave)
    const size_t received_bytes = slave.transfer(tx_buf, rx_buf, BUFFER_SIZE);

    // do something with received_bytes and rx_buf if needed
    // 通过串口打印接收到的数据
     // 输出 rx_buf 中的所有数据
    Serial.print("Received data: ");
    for (size_t i = 0; i < BUFFER_SIZE; ++i) {
        Serial.print(rx_buf[i]); // 输出
        Serial.print(" ");
    }
    Serial.println(); // 输出完一行后换行
    delay(1);
}

MicroPython与Arduino环境下ESP32的SPI通信对比

MicroPython和Arduino环境下的SPI通信在实现方式上有所不同。MicroPython使用machine模块中的SPI与类,而Arduino使用<ESP32SPISlave.h>库。两者都需要初始化SPI并设置从设备选择引脚,但在数据传输的具体实现上有所差异。MicroPython使用writeread方法进行数据传输,而Arduino使用transfer方法。

注意事项

在使用SPI通信时,需要注意以下几点:

  • 确保主设备和从设备的时钟极性(polarity)和相位(phase)设置一致。
  • 从设备选择引脚(SS)在通信过程中需要正确控制,以避免多个从设备同时响应。
  • 数据传输速率(baudrate)应根据设备的要求进行设置,以确保通信的稳定性。

通过以上方法,可以在MicroPython和Arduino环境下实现ESP32的SPI通信。

### Arduino Uno 和 ESP32 SPI 通信教程 #### 设备配置 在构建SPI通信时,NodeMCU-ESP32担任主机角色而Arduino Uno则作为从机参工作[^1]。为了确保两者间的数据交换顺畅无阻,需按照特定方式连接相应引脚。 对于硬件连线部分,通常遵循如下原则: | 功能 | NodeMCU-ESP32 (Master) Pin | Arduino Uno (Slave) Pin | | --- | -------------------------- | ---------------------- | | MOSI | GPIO23 | D11 | | MISO | GPIO19 | D12 | | SCK | GPIO18 | D13 | | SS | GPIO5 | D10 | #### 软件设置 ##### 主设备(ESP32) ```cpp #include <SPI.h> void setup() { Serial.begin(115200); pinMode(SS, OUTPUT); // 设置片选信号线为输出模式 digitalWrite(SS, HIGH); // 初始化状态设为高电平 SPI.begin(); // 启动SPI总线服务 } void loop() { const char* message = "Hello from Master"; int length = strlen(message); digitalWrite(SS, LOW); // 开始一次传输前拉低SS引脚激活从器件 delayMicroseconds(10); SPI.beginTransaction(SPISettings(4000000, MSBFIRST, SPI_MODE0)); for(int i=0; i<length;i++){ SPI.transfer(message[i]); } SPI.endTransaction(); digitalWrite(SS,HIGH); // 结束此次通讯后恢复高电平释放从器件 } ``` 此段代码展示了如何利用`SPI`库来初始化并操作ESP32上的SPI接口向Arduino发送字符串消息。 ##### 从设备(Arduino Uno) ```cpp #include <SPI.h> char receivedChar; void setup(){ Serial.begin(115200); pinMode(SS, INPUT_PULLUP); // 配置SS管脚为输入上拉模式 SPCR |= _BV(SPE); // 手动开启SPI中断使能位 } ISR(SPI_STC_vect){ receivedChar = SPDR; Serial.print(receivedChar); } void loop(){} ``` 上述代码片段实现了Arduino Uno作为SPI从站接收来自ESP32的消息,并通过串口监视器打印接收到的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值