ESP8266_RTOS_SDK 简单的SPI读写


前言

大家使用ESP8266_RTOS_SDK官方提供的SPI例程,是不是觉得很扯蛋
我就是想单纯发送我的数据,为什么有增加了乱七八糟命令/地址,和我们以前使用的SPI完全不一样

SPI传输数据,格式为:8bit命令(读值:3,写值:4)+ 8bit地址(值:0x0) + 64byte数据

传输的时候,还要求

一次传输只支持64字节

难道就不能像平时一样传输 char 类型的字节流?


1.ESP8266的硬件SPI

首先明白,我们使用到的是IO12 IO13 IO14这3个引脚
在这里插入图片描述

2.SPI发送

官方提供的spi发送函数很复杂,有兴趣的可以慢慢研究
这里我化繁为简,就传输我的数据,那些什么指令/地址全部不要

static esp_err_t user_spi_send_data(uint8_t *data, uint32_t len)
{
    spi_trans_t trans = {0};
    trans.mosi = data;
    trans.bits.mosi = len * 8;
    return spi_trans(HSPI_HOST, &trans);
}

以下是一个测试例程

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "esp8266/gpio_struct.h"
#include "esp8266/spi_struct.h"
#include "esp_system.h"
#include "esp_log.h"
#include "esp_libc.h"
#include "driver/gpio.h"
#include "driver/spi.h"

static const char *TAG = "user_spi";

esp_err_t esp8266_spi_send_data(uint8_t *data, uint32_t len)
{
    spi_trans_t trans = {0};
    trans.mosi = data;
    trans.bits.mosi = len * 8;
    return spi_trans(HSPI_HOST, &trans);
}

uint8_t esp8266_spi_read_byte(void)
{
    spi_trans_t trans;
    uint32_t Rdata = 0;
    memset(&trans, 0x0, sizeof(trans));
    trans.bits.val = 0;
    trans.miso = &Rdata;
    trans.bits.miso = 8 * 1;
    spi_trans(HSPI_HOST, &trans);
    return (uint8_t *)Rdata;
}

esp_err_t esp8266_spi_init(void)
{
    ESP_LOGI(TAG, "init spi");
    spi_config_t spi_config;
    // Load default interface parameters
    // CS_EN:1, MISO_EN:1, MOSI_EN:1, BYTE_TX_ORDER:1, BYTE_TX_ORDER:1, BIT_RX_ORDER:0, BIT_TX_ORDER:0, CPHA:0, CPOL:0
    spi_config.interface.val = SPI_DEFAULT_INTERFACE;

    // Load default interrupt enable
    // TRANS_DONE: true, WRITE_STATUS: false, READ_STATUS: false, WRITE_BUFFER: false, READ_BUFFER: false
    spi_config.intr_enable.val = SPI_MASTER_DEFAULT_INTR_ENABLE;

    spi_config.interface.cs_en = 0;
    spi_config.interface.mosi_en = 1;
    spi_config.interface.miso_en = 1;// 置1,否则miso无法接收数据

    // Set SPI to master mode
    // ESP8266 Only support half-duplex
    spi_config.mode = SPI_MASTER_MODE;
    // Set the SPI clock frequency division factor
    spi_config.clk_div = SPI_2MHz_DIV;
    spi_config.event_cb = NULL;
    return spi_init(HSPI_HOST, &spi_config);
}

void app_main(void)
{
    uint8_t buf[16] = {0x01, 0x08, 0x06, 0x07, 0x12, 0};
    esp8266_spi_init();
    while (1)
    {
        esp8266_spi_send_data(buf, 5);
        vTaskDelay(5000 / portTICK_RATE_MS);
    }
}

通过逻辑分析仪分析,发送的数据正确
在这里插入图片描述

3.SPI接收

uint8_t esp8266_spi_read_byte(void)
{
    spi_trans_t trans;
    uint32_t Rdata = 0;
    memset(&trans, 0x0, sizeof(trans));
    trans.bits.val = 0;
    trans.miso = &Rdata;
    trans.bits.miso = 8 * 1;
    spi_trans(HSPI_HOST, &trans);
    return (uint8_t *)Rdata;
}
### 解决ESP8266_RTOS_SDK Git Clone 过程中频繁中断的问题 #### 原因分析 Git clone 操作频繁中断可能由多种因素引起: - **网络连接不稳定**:如果本地网络条件不佳,可能会导致克隆操作中途断开。 - **服务器负载过高**:目标仓库所在的服务器可能出现高负载情况,影响数据传输稳定性[^1]。 - **防火墙或代理设置不当**:某些企业内网环境中可能存在严格的防火墙策略或不恰当的代理配置,阻碍正常的数据请求。 #### 解决策略 针对上述原因,可以采取如下措施来提高成功几率: ##### 使用镜像站点加速下载速度 对于国内开发者而言,由于国际带宽限制等因素的影响,建议优先考虑使用国内镜像站获取资源。例如通过 `git clone` 的 URL 替换成对应的中国境内的镜像地址,如 Gitee 或者其他可靠的第三方托管平台提供的镜像服务[^3]。 ```bash git clone https://gitee.com/mirrors/ESP8266_RTOS_SDK.git ``` ##### 启用递归子模块初始化选项 确保在执行 `git clone` 时加上 `--recursive` 参数以同步拉取所有必要的子模块文件,这一步骤非常重要因为 ESP8266_RTOS_SDK 中包含了多个依赖项需要一同被检出才能正常使用[^4]。 ```bash git clone --recursive https://github.com/espressif/ESP8266_RTOS_SDK.git ``` ##### 调整Git全局超时参数 适当延长HTTP(S)协议下的默认读写等待时间阈值,防止过早触发异常终止机制。可以通过修改 `.gitconfig` 文件中的 http.timeout 和 ssh.connectTimeout 来实现这一目的。 ```bash git config --global http.timeout 120 git config --global ssh.connectTimeout 15 ``` ##### 尝试分步完成整个过程 当遇到较大规模项目难以一次性完整复制的情况时,可先单独处理主库部分再逐步添加其余组件。具体做法是在首次仅做浅拷贝之后再次运行更新指令补充剩余内容。 初次只获取主线代码结构而不涉及历史记录: ```bash git clone --depth=1 --no-single-branch https://github.com/espressif/ESP8266_RTOS_SDK.git cd ESP8266_RTOS_SDK/ ``` 随后按需填充完整的版本树以及关联子模组资料: ```bash git fetch --unshallow git pull origin master git submodule update --init --recursive ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值